<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>pangyoelon</title>
    <link>https://gwan.tistory.com/</link>
    <description>블록체인 개발자
https://github.com/km3140
https://velog.io/@pangyoelon</description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 09:11:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>pangyoelon</managingEditor>
    <image>
      <title>pangyoelon</title>
      <url>https://tistory1.daumcdn.net/tistory/5221452/attach/883b545a72854887895b89b028e2d602</url>
      <link>https://gwan.tistory.com</link>
    </image>
    <item>
      <title>1인 개발 시작</title>
      <link>https://gwan.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일단 약 2~3달간 해보고 싶었던 1인 개발을 시작합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 백엔드를 주로 했었어서 프론트에 대한 공부와 데브옵스의 공부가 많이 필요하겠지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 성공하면 좋고 못해도 포폴용으로 좋을 것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 다음 커리어는 풀스택 개발로 도전해보겠습니다&lt;/p&gt;</description>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/36</guid>
      <comments>https://gwan.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 14 Mar 2025 18:44:28 +0900</pubDate>
    </item>
    <item>
      <title>tx.wait()으로 트랜젝션 마이닝 기다려주기</title>
      <link>https://gwan.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 아래와 같이 토큰을 스왑하는 상황을 가정해보자&lt;/p&gt;
&lt;pre id=&quot;code_1692684357435&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const result = await tokenContract.approve(
  routerAddress,
  utils.parseEther(&quot;100&quot;),
  {
    maxPriorityFeePerGas: gasPrice,
    maxFeePerGas: gasPrice,
  }
);

// 스왑
const deadline = Math.floor(Date.now() / 1000) + 60 * 20;
const swapValue = await routerContract.swapExactTokensForETH(
    utils.parseEther(&quot;1&quot;),
    0,
    [&quot;0x123...&quot;,&quot;0x123...&quot;,&quot;0x123...&quot;],
    to,
    deadline,
    {
      maxPriorityFeePerGas: gasPrice,
      maxFeePerGas: gasPrice,
    }
);
console.log(&quot;스왑 결과 :&quot;, swapValue);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;token을 스왑하기 위해 approve를 먼저 해주고 있는 모습이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이렇게 하면 오류가 발생할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 먼저 rpc 요청을 보냈다고 먼저 보낸 요청이 뒤에 보낸 요청보다 먼저 마이닝 될 거라는 보장을 할 수 없기 때문이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트렌젝션의 순서는 채굴자가 정한다. 즉, 채굴자에 따라서 블럭 안의 트랜젝션의 순서가 정해진다는 것이다 (이로인해 MEV라는 것도 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 비동기와 같이 특정 rpc요청이 마이닝 될 때까지 await해주려면 무엇을 사용해야 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-22 오후 2.51.54.png&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLQcEW/btsrZlhXZE8/48tLzYonXF23tsVIvpnBQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLQcEW/btsrZlhXZE8/48tLzYonXF23tsVIvpnBQ0/img.png&quot; data-alt=&quot;ethersjs 공식문서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLQcEW/btsrZlhXZE8/48tLzYonXF23tsVIvpnBQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLQcEW%2FbtsrZlhXZE8%2F48tLzYonXF23tsVIvpnBQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;835&quot; data-filename=&quot;스크린샷 2023-08-22 오후 2.51.54.png&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ethersjs 공식문서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지의 트랜젝션 객체 맨 아래를 보면 wait이라는 function을 볼 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 쓰면 된다&lt;/p&gt;
&lt;pre id=&quot;code_1692685520288&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const result = await tokenContract.approve(
  routerAddress,
  utils.parseEther(&quot;100&quot;),
  {
    maxPriorityFeePerGas: gasPrice,
    maxFeePerGas: gasPrice,
  }
);

// 트랜잭션이 성공적으로 처리되었는지 확인
const receipt = await result.wait();

if (receipt.status === 1) { // status가 1인 경우 트랜잭션 성공
  console.log(&quot;approve 결과: 성공&quot;);

  // 스왑
  const deadline = Math.floor(Date.now() / 1000) + 60 * 20;
  const swapValue = await routerContract.swapExactTokensForETH(
    utils.parseEther(&quot;1&quot;),
    0,
    [&quot;0x123...&quot;,&quot;0x123...&quot;,&quot;0x123...&quot;],
    to,
    deadline,
    {
      maxPriorityFeePerGas: gasPrice,
      maxFeePerGas: gasPrice,
    }
  );
  console.log(&quot;스왑 결과 :&quot;, swapValue);
} else {
  console.log(&quot;approve 결과: 실패&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳&lt;/p&gt;</description>
      <category>BlockChain</category>
      <category>ethersjs</category>
      <category>tx.wait</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/35</guid>
      <comments>https://gwan.tistory.com/35#entry35comment</comments>
      <pubDate>Tue, 22 Aug 2023 15:27:52 +0900</pubDate>
    </item>
    <item>
      <title>현업에서의 형상관리</title>
      <link>https://gwan.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;원래라면 git add . -&amp;gt; git commit -m &quot;&quot; -&amp;gt; git push origin main 시퀀스로만 했으면 끝났을 터였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 인원들과 작업하는 현업에서는 개인 프로젝트 &amp;amp; 소규모 프로젝트에서와의 형상관리와는 꽤 다른점이 많았다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. dev &amp;amp; prod branch&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 익히 들었긴 했었다, dev브랜치에서 먼저 병합하고 테스트 한 다음에 prod브랜치에 올려 배포한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. rebase&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-18 오전 11.33.02.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qIaX0/btsrq7M14Ce/NFLTjrR6VTIapdKxpqhuy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qIaX0/btsrq7M14Ce/NFLTjrR6VTIapdKxpqhuy0/img.png&quot; data-alt=&quot;출저 :&amp;amp;amp;nbsp;https://seosh817.tistory.com/240&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qIaX0/btsrq7M14Ce/NFLTjrR6VTIapdKxpqhuy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqIaX0%2Fbtsrq7M14Ce%2FNFLTjrR6VTIapdKxpqhuy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1258&quot; data-filename=&quot;스크린샷 2023-08-18 오전 11.33.02.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1258&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출저 :&amp;amp;nbsp;https://seosh817.tistory.com/240&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;로컬에서 작업 중에 변경사항이 생겼다면 현재 진행상황에 대한 커밋을 남기고 pull을 받아 merge후 push를 했었다&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;물론 소규모 프로젝트에서는 상관이 없겠지만 인원이 많아지면 커밋 그래프(기록)이 지저분해지는 문제가 생긴다&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 rebase를 하게 되면 위처럼 꼬인 커멋 기록들이 선형적으로 깔끔해진다&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;rebase는 말 그대로 base를 옮긴다는 뜻인데, 여기서 base는 분기를 만든 후의 첫 커밋을 뜻한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대한 자세한 설명은 아래 링크 참조, 이해하기 쉽게 잘 설명해주심&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firework-ham.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://firework-ham.tistory.com/12&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;간략하게 터미널 시퀀스를 설명하자면 아래와 같다&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;1. git stash (현재 진행중인 변경사항 메모리에 임시 저장) 또는 진행상황 커밋&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;2. git pull origin dev &amp;mdash;rebase (리베이스 하면서 pull)&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;3. git push origin my_branch&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;이렇게 하면 원격저장소에서 rebase 끝&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;1번에서 stash를 했다면, git stash pop (임시 저장했던 변경사항을 지우면서 가져옴, 안 지우고 가져오기만 하려면 pop-&amp;gt;apply)&lt;/div&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. pull request&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공동으로 작업하는 브랜치(dev)에 병합해도 되는지 관리자의 승인을 받는 과정이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도로 자신의 브랜치에서 작업 후, rebase, push를 한 다음 자신의 브랜치와 공동 브랜치의 merge를 요청하는 pull request를 날린다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정은 보통 원격저장소의 GUI에서 이루어지는 것 같다&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;git add . 으로 무지성 스테이징 역시 안된다, git graph로 모니터링 해가면서 커밋하니까 편한 듯&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt; 원격 저장소도 깃허브가 아닌 엔터프라이즈용을 쓰는 것 같다&lt;/span&gt;&lt;/p&gt;</description>
      <category>Git</category>
      <category>git</category>
      <category>pull request</category>
      <category>Rebase</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/34</guid>
      <comments>https://gwan.tistory.com/34#entry34comment</comments>
      <pubDate>Fri, 18 Aug 2023 11:59:17 +0900</pubDate>
    </item>
    <item>
      <title>여러개의 modifier 적용 시 순서</title>
      <link>https://gwan.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;솔리디티의 modifier는 한 함수에 여러개 적용이 가능한데 그 순서를 알아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 예시를 살펴보겠습니다&lt;/p&gt;
&lt;pre id=&quot;code_1686839595025&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;contract Test {
    address owner;
    
    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }
    
    modifier costs(uint price) {
        if (msg.value &amp;gt;= price) {
            _;
        }
    }

    constructor() public {
        owner = msg.sender;
    }

    function changeOwner(address newOwner) public onlyOwner costs(10) {
        owner = newOwner;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 먼저 앞에 나온 onlyOwner부터 적용이 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고로 [ onlyOwner의 _; == cost(10) ] 이 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686839834687&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    function changeOwner(address newOwner) public {
        require(msg.sender == owner);
        if (msg.value &amp;gt;= price) {
	        owner = newOwner;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  모디파이어가 적용된 모습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 포스팅했던 상속 순서와도 거의 똑같은 것 같다&amp;nbsp;&lt;/p&gt;</description>
      <category>Solidity</category>
      <category>modifier</category>
      <category>solidity</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/33</guid>
      <comments>https://gwan.tistory.com/33#entry33comment</comments>
      <pubDate>Thu, 15 Jun 2023 23:38:38 +0900</pubDate>
    </item>
    <item>
      <title>ec2에서 환경변수 설정 중 오류</title>
      <link>https://gwan.tistory.com/32</link>
      <description>&lt;pre id=&quot;code_1686113236331&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  dotenv.config({
    path: process.env.NODE_ENV === 'development' ? '.env.dev' : '.env.prod',
  });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 main.ts에서 dotenv를 임포트 해오는 코드에서 문제가 있었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 로컬에서는 실행이 문제 없이 잘 됐는데, ec2환경에서만 파일을 잘못읽어오는 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 변경하자 문제가 해결됐따&lt;/p&gt;
&lt;pre id=&quot;code_1686113363380&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  dotenv.config({
    path: process.env.NODE_ENV === 'development' ? './.env.dev' : './.env.prod',
  });//                                                            &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 window와 달리 linux에서는 상대경로 설정을 구체적으로 해주어야한다&lt;/p&gt;</description>
      <category>aws</category>
      <category>dotenv</category>
      <category>EC2</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/32</guid>
      <comments>https://gwan.tistory.com/32#entry32comment</comments>
      <pubDate>Wed, 7 Jun 2023 13:52:03 +0900</pubDate>
    </item>
    <item>
      <title>언디파인 해커 하우스 수상 후기</title>
      <link>https://gwan.tistory.com/31</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20230527_213118760.jpg&quot; data-origin-width=&quot;3727&quot; data-origin-height=&quot;2096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/we0Na/btshzZ5xoXm/4VvgUUoAcX1lRKnDZKvv81/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/we0Na/btshzZ5xoXm/4VvgUUoAcX1lRKnDZKvv81/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/we0Na/btshzZ5xoXm/4VvgUUoAcX1lRKnDZKvv81/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwe0Na%2FbtshzZ5xoXm%2F4VvgUUoAcX1lRKnDZKvv81%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3727&quot; height=&quot;2096&quot; data-filename=&quot;KakaoTalk_20230527_213118760.jpg&quot; data-origin-width=&quot;3727&quot; data-origin-height=&quot;2096&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가&amp;nbsp;수강하는&amp;nbsp;한국에이아이&amp;nbsp;블록체인&amp;nbsp;융합원&amp;nbsp;인턴연계과정에&amp;nbsp;강사로&amp;nbsp;와주신&amp;nbsp;디파이농부&amp;nbsp;조동현&amp;nbsp;선생님의&amp;nbsp;해커톤! &lt;br /&gt;&lt;br /&gt;조동현&amp;nbsp;선생님의&amp;nbsp;강의를&amp;nbsp;너무&amp;nbsp;유익하게&amp;nbsp;들었어서&amp;nbsp;참가&amp;nbsp;안&amp;nbsp;할&amp;nbsp;수가&amp;nbsp;없었습죠.. &lt;br /&gt;&lt;br /&gt;덕분에&amp;nbsp;이런&amp;nbsp;좋은&amp;nbsp;기회를&amp;nbsp;알게되어서&amp;nbsp;네트워킹도&amp;nbsp;하고&amp;nbsp;수상도&amp;nbsp;하고&amp;nbsp;백만원도&amp;nbsp;타고&amp;nbsp;일본해커톤&amp;nbsp;초청까지!!&amp;nbsp;(밤샘&amp;nbsp;코딩도&amp;nbsp;하고..) &lt;br /&gt;저한텐 web3 아버지 같습니ㄷr...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rrgZn/btshAZKEgW9/qGYzI3is3Xa1Cyh7kVbuR1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rrgZn/btshAZKEgW9/qGYzI3is3Xa1Cyh7kVbuR1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;602&quot; data-filename=&quot;KakaoTalk_20230528_174523174.jpg&quot; style=&quot;width: 49.6637%; margin-right: 10px;&quot; data-widthpercent=&quot;50.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rrgZn/btshAZKEgW9/qGYzI3is3Xa1Cyh7kVbuR1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrrgZn%2FbtshAZKEgW9%2FqGYzI3is3Xa1Cyh7kVbuR1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1079&quot; height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3Dm7x/btshAqvpZQ1/23L2gvaDbyY4sehpEQTK1K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3Dm7x/btshAqvpZQ1/23L2gvaDbyY4sehpEQTK1K/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;608&quot; data-filename=&quot;KakaoTalk_20230528_174523174_01.jpg&quot; style=&quot;width: 49.1736%;&quot; data-widthpercent=&quot;49.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3Dm7x/btshAqvpZQ1/23L2gvaDbyY4sehpEQTK1K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3Dm7x%2FbtshAqvpZQ1%2F23L2gvaDbyY4sehpEQTK1K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1079&quot; height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;저희는&amp;nbsp;주제2번인&amp;nbsp;web3&amp;nbsp;소셜로&amp;nbsp;참여해서&amp;nbsp;렌즈프로토콜&amp;nbsp;기반&amp;nbsp;서베이&amp;nbsp;플랫폼인&amp;nbsp;Blank를&amp;nbsp;만들었습니다! &lt;br /&gt;&lt;br /&gt;이번 해커톤으로 LSD와 렌즈프로토콜과 같은 웹3 트렌드에 대해 관심을 갖게 된 계기가 되었습니다&lt;br /&gt;(렌즈 50달러로 봤을때 살 껄..) &lt;br /&gt;&lt;br /&gt;저번에 이어 이번에도 넘쳐나는 인복 덕이었습니다 우리팀 너무 고맙습니다&lt;/p&gt;</description>
      <category>해커톤</category>
      <category>lens protocol</category>
      <category>undefined hackathon</category>
      <category>undefined hacker house</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/31</guid>
      <comments>https://gwan.tistory.com/31#entry31comment</comments>
      <pubDate>Sun, 28 May 2023 17:46:54 +0900</pubDate>
    </item>
    <item>
      <title>서버가 받은 유저의 jwt토큰 검증 원리</title>
      <link>https://gwan.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;jwt토큰은 header, payload, verify signature 3부분으로 나뉜다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;header와 payload는 인코딩 되어있고, verify signature는 header, payload와 secret key를 같이 해싱(단방향 암호화)한 값이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로&amp;nbsp; jwt토큰을 받은 서버는 먼저 header와 payload를 복호화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 복호화 된 header와 payload를 secret key와 함께 해싱하여 verify signature와 같은지 비교하고, 같다면 유효한 토큰으로 간주하여 payload의 내용에 따라 유저를 처리한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( for 위조 방지, verify signature ===&amp;nbsp; hash(header + payload + secret key) )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc</category>
      <category>jwt</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/29</guid>
      <comments>https://gwan.tistory.com/29#entry29comment</comments>
      <pubDate>Tue, 9 May 2023 18:01:39 +0900</pubDate>
    </item>
    <item>
      <title>노마드코더 타입스크립트 TIL</title>
      <link>https://gwan.tistory.com/28</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;? : 객체 요소 타입 지정할 때 선택옵션 부여 ( [type] | undefined )&lt;/li&gt;
&lt;li&gt;readonly 키워드로 읽기전용 프로퍼티를 만들 수 있음&lt;/li&gt;
&lt;li&gt;튜플 : 배열이며 최소한의 길이를 가져야하고 특정 위치에 특정 타입이 있어야함&lt;/li&gt;
&lt;li&gt;자바스크립트에 있는 undefined, null 도 있음&lt;/li&gt;
&lt;li&gt;any : 자바스크립트로 돌아가는 것&lt;/li&gt;
&lt;li&gt;unknown : 값을 받을 때 그 값이 무슨 타입인지 모를 때 씀 ex) if ( typeof [변수] === &amp;ldquo;[자료형]&amp;rdquo; ){ (이 안에서 [자료형] 타입으로써 변수 사용가능) }&lt;/li&gt;
&lt;li&gt;void : 아무것도 리턴하지않는 함수의 자료형 (솔리디티 view랑 비슷?)&lt;br /&gt;never : 절대 return되지 않는, 실행되지 않는 자료형 (타입스크립트가 never로 변수를 추론하면 없는 것과 마찬가지인 변수라고 해석하면 될 듯)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;call signiture (alias 지을 수 있음) : 함수의 매개변수와 리턴값의 타입을 미리 정의한 것&lt;/li&gt;
&lt;li&gt;오버로딩 : 여러개의 call signiture가 있는 함수, 파라미터 개수가 다른 call signiture을 설정해서 옵션(선택사항)을 줄 수 있다, 선택사항인 파라미터는 선택적 프로퍼티(?:)를 사용해주어야함&lt;/li&gt;
&lt;li&gt;x = a ?? b 는 x = (a !== null &amp;amp;&amp;amp; a !== undefined) ? a : b; 와 같다&lt;/li&gt;
&lt;li&gt;concrete type : number, string, boolean, void, unknown 같은 타입&lt;/li&gt;
&lt;li&gt;generic : call signiture을 타입스크립트가 자동으로 추론하게 해줌, Array를 자세히 보면 요소로 &amp;lt;T&amp;gt;라는 제너릭을 받는 것을 알 수 있다, 즉 타입스크립트의 타입 자동추론 기능은 제너릭으로부터 비롯된 것&lt;/li&gt;
&lt;li&gt;private, public, protected 와 같은 키워드로 솔리디티에서의 접근제한자와 비슷(같은?)한 효과를 낼 수 있다 이 키워드들은 컴파일 시 사라지며(당연히 JS는 그런 기능이 없으므로) TS안에서만 적용된다&lt;/li&gt;
&lt;li&gt;protected = 솔리디티에서의 internal과 같은 듯&lt;/li&gt;
&lt;li&gt;추상 클래스 : 다른 클래스들이 상속 받을 때만 사용할 수 있는 클래스, 추상 클래스 자체로는 인스턴스를 만들 수 없다, 상속은 extends로 함 (솔리디티의 is) ex) 추상컨트랙트 = 리모컨 &amp;mdash;&amp;mdash;상속&amp;mdash;&amp;mdash;&amp;gt; TV리모컨, 에어컨리모컨, 선풍기리모컨&lt;/li&gt;
&lt;li&gt;interface는 클래스에게 구조를 명시해줄 뿐만 아니라 객체의 타입으로도 쓸 수 있다 똑같은 이름의 interface를 여러번 선언하면 모든 interface가 합쳐진다&lt;/li&gt;
&lt;li&gt;제너릭은 전달이 가능 ( 클래스 &amp;rarr; 인터페이스 )&lt;/li&gt;
&lt;li&gt;class [클래스이름]&amp;lt;T&amp;gt; 와 같이 선언했다면 생성할 시점에 new [클래스이름]&amp;lt;string&amp;gt; 이렇게 선언하면 클래스안의 모든 제너릭T가 string이 되어 인스턴스화 된다&lt;/li&gt;
&lt;li&gt;JSDoc으로 js파일도 ts가 보호해줄 수 있다&lt;/li&gt;
&lt;li&gt;@types/[라이브러리명] : node의 라이브러리 타입들을 정의한 .d.ts파일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Typescript</category>
      <category>TypeScirpt</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/28</guid>
      <comments>https://gwan.tistory.com/28#entry28comment</comments>
      <pubDate>Thu, 27 Apr 2023 17:10:43 +0900</pubDate>
    </item>
    <item>
      <title>솔리디티의 이상한 상속 계층구조</title>
      <link>https://gwan.tistory.com/27</link>
      <description>&lt;pre id=&quot;code_1682493765172&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/* Inheritance tree
   A
 /  \
B   C
 \ /
  D
*/

contract A {
    function foo() public virtual {
        emit Log(&quot;A.foo called&quot;);
    }

    function bar() public virtual {
        emit Log(&quot;A.bar called&quot;);
    }
}

contract B is A {
    function foo() public virtual override {
        emit Log(&quot;B.foo called&quot;);
        A.foo();
    }

    function bar() public virtual override {
        emit Log(&quot;B.bar called&quot;);
        super.bar();
    }
}

contract C is A {
    function foo() public virtual override {
        emit Log(&quot;C.foo called&quot;);
        A.foo();
    }

    function bar() public virtual override {
        emit Log(&quot;C.bar called&quot;);
        super.bar();
    }
}

contract D is C,B {

    function foo() public override(B, C) {
        super.foo();
    }

    function bar() public override(B, C) {
        super.bar();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 예제 코드를 보았다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 생각해 봤을 때 해당 컨트랙트들의 상속구조는 아래와 같다&lt;/p&gt;
&lt;pre id=&quot;code_1682493860513&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   A
 /  \
B   C
 \ /
  D&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 D컨트랙트를 배포 후 foo함수를 실행시켜보면 예상대로 동작할 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 문제는 D컨트랙트의 bar함수인데, bar함수를 실행시켜보면 아래와 같은 로그가 나온다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2023-04-26 162845.png&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Hyoc/btscIJz0Wma/KcWvhGfvCTYDePXxaUCEvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Hyoc/btscIJz0Wma/KcWvhGfvCTYDePXxaUCEvK/img.png&quot; data-alt=&quot;A -&amp;amp;gt; C -&amp;amp;gt; B&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Hyoc/btscIJz0Wma/KcWvhGfvCTYDePXxaUCEvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Hyoc%2FbtscIJz0Wma%2FKcWvhGfvCTYDePXxaUCEvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1248&quot; height=&quot;672&quot; data-filename=&quot;화면 캡처 2023-04-26 162845.png&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A -&amp;gt; C -&amp;gt; B&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어째서일까? 답을 얻기 위해 코드에서 하나의 변인을 조작해보았다&lt;/p&gt;
&lt;pre id=&quot;code_1682494366463&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;contract D is B,C {
//              순서를 C,B에서 B,C로 바꿔보았다
    function foo() public override(B, C) {
        super.foo();
    }

    function bar() public override(B, C) {
        super.bar();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;is 뒤의 두 컨트랙트의 순서를 바꾼 뒤, D의 bar를 실행시켜보면 결과가 전과 다르다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2023-04-26 163441.png&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HZyaa/btscMI8bKrQ/mZKZDCwDXdxcapx6Lhet30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HZyaa/btscMI8bKrQ/mZKZDCwDXdxcapx6Lhet30/img.png&quot; data-alt=&quot;A -&amp;amp;gt; B -&amp;amp;gt; C&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HZyaa/btscMI8bKrQ/mZKZDCwDXdxcapx6Lhet30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHZyaa%2FbtscMI8bKrQ%2FmZKZDCwDXdxcapx6Lhet30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1288&quot; height=&quot;677&quot; data-filename=&quot;화면 캡처 2023-04-26 163441.png&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;A -&amp;gt; B -&amp;gt; C&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;is 뒤에서 선순위 컨트랙트를 후순위 컨트랙트가 오버라이딩을 한다는 뜻은, 단지 덮어쓴다는 게 아니라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후순위 컨트랙트가 선순위 컨트랙트의 자식이 된다는 뜻이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 B와 C가 동일선상에 있는 계층구조가 아닌&lt;/p&gt;
&lt;pre id=&quot;code_1682494845686&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A
|
B
|
C
|
D&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 직선형의 계층구조라는 것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Solidity</category>
      <category>solidity</category>
      <category>상속</category>
      <category>솔리디티</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/27</guid>
      <comments>https://gwan.tistory.com/27#entry27comment</comments>
      <pubDate>Wed, 26 Apr 2023 16:43:49 +0900</pubDate>
    </item>
    <item>
      <title>cors 'Access-Control-Allow-Credentials' 헤더 설정 시 주의할 점</title>
      <link>https://gwan.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서버측에서 cors를 설정하는 법에 대해 웹서핑을 해보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cors미들웨어에 인자로 주는 객체를 선언하는 부분에서 블로그마다 다들 표현이 조금씩 달랐다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679732031810&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;app.use(cors({
    origin: 'http://localhost:1234',
    credentials: 'true',
}));

app.use(cors({
    origin: 'http://localhost:1234',
    credential: true,
}));

app.use(cors({
    origin: 'http://localhost:1234',
    credential: 'true',
}));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 작성할 시 Access-Control-Allow-Credentials 헤더가 빈 문자열이라는 오류가 계속 난다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679733649090&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;app.use(cors({
    origin: 'http://localhost:1234',
    credentials: true,
}));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 작성해주어야함&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>credentials</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/26</guid>
      <comments>https://gwan.tistory.com/26#entry26comment</comments>
      <pubDate>Sat, 25 Mar 2023 17:41:27 +0900</pubDate>
    </item>
    <item>
      <title>axios 요청 url에 prefix값을 주는 법</title>
      <link>https://gwan.tistory.com/25</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;상황)&lt;/h3&gt;
&lt;pre id=&quot;code_1679566350022&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;axios.get('http://localhost:5000')
axios.post('http://localhost:5000','data')
axios.get('http://localhost:5000')
axios.post('http://localhost:5000','data')
axios.get('http://localhost:5000')
axios.post('http://localhost:5000','data')
axios.get('http://localhost:5000')
axios.post('http://localhost:5000','data')
axios.get('http://localhost:5000')
axios.post('http://localhost:5000','data')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생활코딩식 상상력을 발휘하여 위와 같은 요청이 1억개가 있다고 하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 당연히 엄청난 중복이 발생할 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 axios.defaults.baseURL에 원하는 prefix값을 설정해주면 중복이 줄어들 수 있다&lt;/p&gt;
&lt;pre id=&quot;code_1679566245823&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;axios.defaults.baseURL = 'http://localhost:5000'

axios.get('/')
axios.post('/','data')
axios.get('/')
axios.post('/','data')
axios.get('/')
axios.post('/','data')
axios.get('/')
axios.post('/','data')
axios.get('/')
axios.post('/','data')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) chatgpt는 신이다 (아래 방법은 위와 조금 다름)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2023-03-23 191436.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;783&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bduAtn/btr5AYDgPVt/3kSSUDbF68AZXu5rOKkGIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bduAtn/btr5AYDgPVt/3kSSUDbF68AZXu5rOKkGIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bduAtn/btr5AYDgPVt/3kSSUDbF68AZXu5rOKkGIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbduAtn%2Fbtr5AYDgPVt%2F3kSSUDbF68AZXu5rOKkGIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1018&quot; height=&quot;783&quot; data-filename=&quot;화면 캡처 2023-03-23 191436.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;783&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>axios baseURL</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/25</guid>
      <comments>https://gwan.tistory.com/25#entry25comment</comments>
      <pubDate>Thu, 23 Mar 2023 19:16:23 +0900</pubDate>
    </item>
    <item>
      <title>cors를 설정해야 하는 이유 (sop의 존재이유)</title>
      <link>https://gwan.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;cors(cross-origin-resource-sharing)를 설정하라는 오류는 sop(same-origin-policy)에 의해 다른 오리진으로 보내는 요청을 '브라우저'가 막아서 생기는 오류이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 하다가 cors오류를 맞닥드린 입장에서 브라우저가 요청을 막는다는 사실을 알았을 때, 브라우저가 뭔데 감히 내 요청을 막아서 귀찮게 하는 것인지에 대한 이유는 아래와 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 대부분의 상황에서 브라우저는 사용자 본인이 작성한 것이 아닌 html,css,js 파싱한다는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 브라우저에는 인증정보(쿠키, 토큰)가 저장되어 있다는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 1번은 개발을 하고있는 입장에서 간과할 수 있는 점 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 헤커의 사이트에 접속해서 해커가 짠 코드로 인해 해커가 사용자의 브라우저에 저장된 토큰을 가지고 사용자인 척 하며 악의적인 요청을 보내는 상황을 방지하기 위함이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기에 서버 측에서 믿을 수 있는 origin들의 목록을 정해두는 것이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;cors설정이다&lt;/span&gt;&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>CORS</category>
      <category>cors오류</category>
      <category>Sop</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/24</guid>
      <comments>https://gwan.tistory.com/24#entry24comment</comments>
      <pubDate>Wed, 22 Mar 2023 16:35:56 +0900</pubDate>
    </item>
    <item>
      <title>깃허브 옵션 구글링 할 때 주의점</title>
      <link>https://gwan.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;깃 branch 명령어의 -m 옵션 뜻이 궁금해서&lt;br /&gt;'git branch -m 뜻' 이런 식으로 검색을 해봤는데 이상할만큼 결과가 나오지 않았다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고보니 아래와 같이 구글링에 도움을 주는 연산자가 있었는데&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;or&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;기본 검색&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&quot; &quot;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;구 형식으로 검색&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;*&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;와일드 카드&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;+&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;단어를 반드시 포함&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;-&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;단어를 반드시 제외&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;..&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;숫자 범위&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중에 제외(-) 연산자 때문에 m 옵션에 대한 결과가 찾기지 않은 것이었다;;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍과 비슷하게 ' \ ' 기호를 사용하여 이스케이프 할 수 있을 것이라는 추측을 해봤고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'git branch \-m 뜻' 과 같이 검색을 해주니 드디어 원하던 결과가 나왔다..ㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Git</category>
      <category>구글링</category>
      <category>구글링 연산자 이스케이프</category>
      <category>깃허브 옵션</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/23</guid>
      <comments>https://gwan.tistory.com/23#entry23comment</comments>
      <pubDate>Sat, 25 Feb 2023 17:21:13 +0900</pubDate>
    </item>
    <item>
      <title>nodejs에서 자주 쓰는 미들웨어 모듈</title>
      <link>https://gwan.tistory.com/22</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;morgan&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버로 들어온 요청과 응답을 기록해주는 미들웨어&lt;/li&gt;
&lt;li&gt;로그의 자세한 정도 선택 가능(dev, tiny, common, combined)&lt;/li&gt;
&lt;li&gt;주로 개발환경에서는 dev, 배포환경에서는 combined를 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;static&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적인 파일들을 제공하는 미들웨어&lt;/li&gt;
&lt;li&gt;인수로 정적파일의 경로를 대입&lt;/li&gt;
&lt;li&gt;fs.readFile로 직접 읽을 필요 없음&lt;/li&gt;
&lt;li&gt;요청하는 파일이 없으면 next를 호출해 다음 미들웨어로 넘어감&lt;/li&gt;
&lt;li&gt;파일을 발견했다면 응답하고 다음 미들웨어는 실행되지 않음&lt;/li&gt;
&lt;li&gt;요청 주소와 실제 주소를 다르게 만들어 보안 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;body-parser ( express.json, express.urlencoded )&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;body-parser의 주요 기능이 현재는 express의 json, urlencoded로 대체됨&lt;/li&gt;
&lt;li&gt;요청의 body를 해석해주는 미들웨어&lt;/li&gt;
&lt;li&gt;body가 json인 경우 express.json, body가 폼 요청인 경우 express.urlencoded 사용&lt;/li&gt;
&lt;li&gt;버퍼데이터나 텍스트데이터일 경우는 body-parser를 설치해야함, 하지만 사용할 일이 잘 없음&lt;/li&gt;
&lt;li&gt;Multipart데이터(이미지,동영상 등)인 경우는 multer라는 미들웨어를 사용함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;cookie-parser&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청 헤더의 쿠키를 해석해주는 미들웨어&lt;/li&gt;
&lt;li&gt;req.cookies 안에 쿠키들이 파싱되어 들어있음&lt;/li&gt;
&lt;li&gt;실제 쿠키 옵션들을 넣을 수 있음 (expires, domain, httpOnly, maxAge, path ...)&lt;/li&gt;
&lt;li&gt;clearCookie로 쿠키를 지울 수 있다 (expires와 maxAge를 제외한 쿠키 옵션이 일치해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;express-session&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 관리용 미들웨어&lt;/li&gt;
&lt;li&gt;세션 쿠키에 대한 설정(secret: 쿠키 암호화 키, cookie: 세션 쿠키 옵션)&lt;/li&gt;
&lt;li&gt;세션 쿠키는 암호화되어 프론트에 전송됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;dotenv&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;.env 라는 파일에 서버에서 중요한 암호화 키, 비밀번호 등을 모아둠&lt;/li&gt;
&lt;li&gt;소스코드 탈취 당할 시 보안위협을 줄일 수 있음&lt;/li&gt;
&lt;li&gt;.env파일에 키를 모아둠으로써 사용, 관리가 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 거의 모든 미들웨어들은 내부적으로 next를 실행한다, 미들웨어간의 순서도 중요&lt;/p&gt;</description>
      <category>Node.js</category>
      <category>express</category>
      <category>nodejs</category>
      <category>미들웨어</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/22</guid>
      <comments>https://gwan.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 23 Feb 2023 12:47:27 +0900</pubDate>
    </item>
    <item>
      <title>미들웨어 확장법</title>
      <link>https://gwan.tistory.com/21</link>
      <description>&lt;pre id=&quot;code_1677120402694&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// static 미들웨어를 확장
// 로그인이 되어있을 때만 정적 자원을 제공하도록
app.use('/', (req, res, next) =&amp;gt; {
	if ( req.session.id ) {
    	express.static(__dirname, 'public')(req, res, next)
    } else {
    	next();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 내가 만든 미들웨어 안에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 남이 만든 미들웨어를 넣고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. (req, res, next) 붙이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 미들웨어간 데이터 전달할 때 전역변수 또는 app.set 대신 req.data를 사용, req res는 모든 미들웨어들이 공유한다&lt;/p&gt;</description>
      <category>Node.js</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/21</guid>
      <comments>https://gwan.tistory.com/21#entry21comment</comments>
      <pubDate>Thu, 23 Feb 2023 11:46:51 +0900</pubDate>
    </item>
    <item>
      <title>태스크 큐에서의 우선순위</title>
      <link>https://gwan.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;우리가 실행한 명령어들이 내부에서 실행되는 과정을 간략하게 나타내면 아래와 같다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;호출 스택에서 명령어들이 실행되고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;그 중 비동기 코드들은 이벤트루프로 이동한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이벤트루프에서 완료된 비동기 코드들 중 먼저 완료된 코드 부터 태스크 큐로 이동해서 호출 스택이 빌 때 까지 기다린다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;호출 스택이 비었으면 태스크 큐에 들어온 순서대로 선입선출(FIFO)하여 호출 스택으로 들어간다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 추가적으로 여기 &lt;b&gt;태스크 큐&lt;/b&gt;에서 Promise 객체의 then, catch, nextTick에 대해 우선순위를 준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 테스크 큐에 setTimeout과 then이 있을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setTimeout이 먼저 완료되어 태스크 큐에 먼저 들어왔다 하더라도 then이 새치기해서 먼저 호출스택으로 이동한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 아래와 같은 코드를 실행했을 때 콘솔창의 상태는?&lt;/p&gt;
&lt;pre id=&quot;code_1676616907971&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function oneMore() {
	console.log('one more');
}
function run() {
	console.log('run run');
    setTimeout(()=&amp;gt;{
    	console.log('wow');
    }, 0)
    new Promise((resolve) =&amp;gt; {
    	resolve('hi');
    })
    .then(console.log);
    oneMore();
}

run()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;run run&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;one more&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hi&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wow&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서대로 출력 될 것이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;출저 : https://www.youtube.com/watch?v=wRPcxR1M7Uc&amp;amp;list=PLcqDmjxt30RsGIPBBKX7xl05VuqJeCTFn&amp;amp;index=8&lt;/p&gt;</description>
      <category>Javascript</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/20</guid>
      <comments>https://gwan.tistory.com/20#entry20comment</comments>
      <pubDate>Fri, 17 Feb 2023 15:56:00 +0900</pubDate>
    </item>
    <item>
      <title>Nodejs에 대한 오해</title>
      <link>https://gwan.tistory.com/19</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Nodejs는 서버(?)다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드 공식사이트에는 노드를 아래와 같이 설명하고있다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Nodejs는 Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임이다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀어서 말하면&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Nodejs는 브라우저에서만 실행되었던 JavaScript 해석기를 브라우저 바깥에서도 실행시킬 수 있게 하는 실행기(런타임)이다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 실행기로 서버를 만드는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Nodejs는 싱글스레드다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드를 실행시킨 다음 작업관리자로 살펴보면 스레드가 여러개로 뜨는 것을 볼 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드의 스레드는 여러개지만 사용자가 컨트롤 할 수 있는 스레드는 하나로 고정되어있기 때문에 싱글스레드라고 &lt;b&gt;표현&lt;/b&gt;했던 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 처럼 노드는 원래부터 멀티스레드였고, 노드14버전 부터는 멀티스레드를 직접 사용자가 다룰 수 있게 되었다고 한다 (하지만 잘 사용하지 않는 듯)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이쯤되서, 진작에 멀티스레딩을 하지 않은 이유에 대해 궁금할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 멀티스레딩이 사람의 사고로 쉽게 구현하기 어려울 수 있기 때문이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기에 노드는 멀티스레딩을 못한 것이 아니라, 프로그래밍의 편의성을 위해 멀티스레딩을 하지 않은 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하긴 정말 싱글스레드만 가능했다면 비동기, 이벤트루프와 같은 개념도 없었을 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;+) 노드는 C와 C++로 이루어져있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;출저 : https://www.youtube.com/watch?v=TKBGiqj3yRE&amp;amp;list=PLcqDmjxt30RsGIPBBKX7xl05VuqJeCTFn&amp;amp;index=3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Node.js</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/19</guid>
      <comments>https://gwan.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 17 Feb 2023 15:35:36 +0900</pubDate>
    </item>
    <item>
      <title>[정보처리기사] 다음 C언어 프로그램이 실행되었을 때, 결과는?</title>
      <link>https://gwan.tistory.com/18</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dv6LpH/btrXHOirlfm/DYJ8aqbwkzHtd1j3wrVrd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dv6LpH/btrXHOirlfm/DYJ8aqbwkzHtd1j3wrVrd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dv6LpH/btrXHOirlfm/DYJ8aqbwkzHtd1j3wrVrd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdv6LpH%2FbtrXHOirlfm%2FDYJ8aqbwkzHtd1j3wrVrd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;251&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(문제와는 관련 없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❓ int argc&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;메인 함수에 전달되는 정보의 갯수를 의미한다&lt;br /&gt;&lt;/span&gt;❓ char *argv[]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;메인함수에 전달되는 실질적 정보이고, 문자열의 배열을 의미한다, &lt;/span&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;첫번째 문자열은 항상 프로그램의 실행경로로 고정되어 있다&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❓ int arr[2][3]={1,2,3,4,5,6}&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기가 3인 배열들을 갖는 크기가 2인 int로 된 배열을 선언, 해당 2차원 배열의 단말에 1,2,3,4,5,6을 순서대로 할당 (구조분해할당?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;❓ int (*p)[3]=NULL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3개의 int값을 담는 배열의 주소를 담을 수 있는 포인터를 null로 초기화, arr을 담기 위한 포인터를 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❓ p=arr&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스가 없는 배열 이름은 배열의 시작주소(arr[0])을 의미하며 그 주소에 +n을 하게되면 배열의 n번째 인덱스의 주소를 얻을 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p에는 arr[0]의 주소가 들어간 셈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❓ printf(&quot;%d, &quot;, *(p[0]+1) + *(p[1]+2))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*(p[0]+1) + *(p[1]+2)   arr[0][1] + arr[1][2]   2 + 6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❓ printf(&quot;%d&quot;, *(*(p+1)+0) + *(*(p+1)+1))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*(*(p+1)+0) + *(*(p+1)+1)   *(arr[1]+0) + *(arr[1]+1)   arr[1][0] + arr[1][1]   4 + 5&lt;/p&gt;</description>
      <category>정보처리기사</category>
      <category>2022년 3월 5일 기출</category>
      <category>C언어</category>
      <category>정보처리기사</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/18</guid>
      <comments>https://gwan.tistory.com/18#entry18comment</comments>
      <pubDate>Wed, 1 Feb 2023 15:22:23 +0900</pubDate>
    </item>
    <item>
      <title>[오류 / Solidity] 크기가 정해진 배열에 push</title>
      <link>https://gwan.tistory.com/17</link>
      <description>&lt;pre id=&quot;code_1669207988360&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint256[3] public ageArray;

function agePush(uint256 age) public{
	ageArray.push(age);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 상황에서 agePush를 실행하면 오류가 날 것이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 배열 크기를 지정하지 않았다면 오류가 안 난다&lt;/p&gt;
&lt;pre id=&quot;code_1669208079609&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TypeError: Member &quot;push&quot; not found or not visible after argument-dependent lookup in uint256[10] storage ref. --&amp;gt; infrun/lec1.sol:8:9: | 8 | ageArray.push(_age); | ^^^^^^^^^^^^^&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;??? : 않이 크기는 지정했는데 아무것도 안 넣었거든여 빈 배열에 push 하는데 왜 오류가 남?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응 아니야, 크기를 미리 지정하면 배열에서는 내부적으로 모든 인덱스마다 기본값이 설정된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 크기가 3인 배열을 선언한다고 치면 내부적으로는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0 =&amp;gt; 0, 1 =&amp;gt; 0, 2 =&amp;gt;0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 되있는 거시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 push를 하면 배열 길이를 늘리는 셈이니 오류가 나는 건 당연&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Solidity</category>
      <category>solidity array</category>
      <category>solidity 배열</category>
      <category>TypeError: Member &amp;quot;push&amp;quot; not found or not visible after argument-dependent lookup in</category>
      <category>크기가 정해진 배열</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/17</guid>
      <comments>https://gwan.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 23 Nov 2022 22:01:16 +0900</pubDate>
    </item>
    <item>
      <title>[오류 / Go] duplicate argument int error</title>
      <link>https://gwan.tistory.com/16</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-11-15 171641.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sanjk/btrRfNiuISa/i5z1oy7JiS7crZD4dJMr6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sanjk/btrRfNiuISa/i5z1oy7JiS7crZD4dJMr6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sanjk/btrRfNiuISa/i5z1oy7JiS7crZD4dJMr6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsanjk%2FbtrRfNiuISa%2Fi5z1oy7JiS7crZD4dJMr6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;121&quot; data-filename=&quot;화면 캡처 2022-11-15 171641.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;go 익명함수, 일급함수 실습 예제를 풀어보던 중 오류가 발생했ㄷr..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복제된 인자? int? undefine?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;xgsdgasd.png&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2p15/btrRikTG3dl/GcdsUkuAWJmCTFLvao7K3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2p15/btrRikTG3dl/GcdsUkuAWJmCTFLvao7K3K/img.png&quot; data-alt=&quot;코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2p15/btrRikTG3dl/GcdsUkuAWJmCTFLvao7K3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2p15%2FbtrRikTG3dl%2FGcdsUkuAWJmCTFLvao7K3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;457&quot; data-filename=&quot;xgsdgasd.png&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 정의할 때 parameter 부분의 순서가 잘못된 거였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(int a, int b ) =&amp;gt; ( a int, b int ) 로 바꿔주니 잘된다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실히 저수준언어라 엄격한 것 같다&lt;/p&gt;</description>
      <category>Go</category>
      <category>duplicate argument</category>
      <category>duplicate argument int</category>
      <category>Go 오류</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/16</guid>
      <comments>https://gwan.tistory.com/16#entry16comment</comments>
      <pubDate>Tue, 15 Nov 2022 17:30:11 +0900</pubDate>
    </item>
    <item>
      <title>Byzantine Failure란? ( 비잔틴 장군 문제 )</title>
      <link>https://gwan.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;https://blog.seulgi.kim/2018/05/byzantine-failure-why-blockchain-is-hard.html?sc=1668304909402#c6086819797635527708&lt;/p&gt;</description>
      <category>BlockChain</category>
      <category>BFT</category>
      <category>PBFT</category>
      <category>비잔틴 문제</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/15</guid>
      <comments>https://gwan.tistory.com/15#entry15comment</comments>
      <pubDate>Sun, 13 Nov 2022 11:17:47 +0900</pubDate>
    </item>
    <item>
      <title>쉘 스크립트에서의 if, for, while</title>
      <link>https://gwan.tistory.com/12</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉘 스크립트(.sh)란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉘은&amp;nbsp;리눅스에서&amp;nbsp;명령어를&amp;nbsp;한줄한줄&amp;nbsp;입력할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;사용자에게&amp;nbsp;인터페이스를&amp;nbsp;제공하는&amp;nbsp;프로그램이구요 &lt;br /&gt;스크립트는 javascript, python과 같은 스크립트 언어라는 것을 뜻합니다&lt;br /&gt;(간단하게&amp;nbsp;스크립트&amp;nbsp;언어란&amp;nbsp;한줄&amp;nbsp;한줄씩&amp;nbsp;실행되는&amp;nbsp;언어를&amp;nbsp;말합니다) &lt;br /&gt;합쳐서 한마디로 쉘에서 사용되는 일련의 스크립트(각각의 커맨드라인)들을 파일 형태로 모아놓은 것이 되겠네요 &lt;br /&gt;자주 실행하는 일련의 명령어들이 있을 때, .sh 확장자 파일 안에 한 줄씩 저장해두면 나중에 sh파일만 실행시켜주면 되는 거죠&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;쉘 스크립트에서의 if, for, while&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉘 스크립트 안에서도 물론 조건과 반복을 넣어줄 수 있는데요, 그런데 생김새가 좀 낯설어요&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;if 문 문법&lt;/h4&gt;
&lt;pre id=&quot;code_1667658206852&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if [ 조건 ]
then
	실행 명령어
elif [ 조건 ]
then
	실행 명령어
fi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건이 대괄호 안에 들어있고, else if는 elif로, 중괄호 없이 if문의 끝을 fi로 마무리 짓습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 한가지 더 주의 할 점은 대괄호 안의 공백을 꼭 넣어줘야 합니다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;for 문 문법&lt;/h4&gt;
&lt;pre id=&quot;code_1667658634545&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for 변수 in 값1 값2 값3 ...
do
	실행 명령어
done&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for문은 javascript에서의 for in loop랑 닮았네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;값&lt;/span&gt;의 개수만큼 반복되고, 값&lt;/span&gt;1, 값2, 값3가 매 반복마다 차례대로 변수 안에 들어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서도 마찬가지로 중괄호 대신 done으로 for 문의 끝을 알려줍니다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;while 문 문법&lt;/h4&gt;
&lt;pre id=&quot;code_1667658592370&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while [ 조건 ]
do
	실행 명령어
done&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;if문을 이용해서 간단한 쉘 스크립트 파일 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd 는 시스템에 등록된 사용자의 정보들이 담겨있는 파일입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/passwd 파일 안에서 특정 사용자의 이름을 찾아, 특정 사용자가 존재하는지 알려주는 프로그램을 만들겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-11-05 231722.png&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBRmGz/btrQr79hoRo/H6bkf7YaFTrV21Nvkn9WJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBRmGz/btrQr79hoRo/H6bkf7YaFTrV21Nvkn9WJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBRmGz/btrQr79hoRo/H6bkf7YaFTrV21Nvkn9WJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBRmGz%2FbtrQr79hoRo%2FH6bkf7YaFTrV21Nvkn9WJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;719&quot; height=&quot;69&quot; data-filename=&quot;화면 캡처 2022-11-05 231722.png&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 홈 디렉토리 안에 테스트용 폴더를 하나 만들어줍니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-11-05 231852.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TBDMi/btrQq6pNpjP/T7H9okah0hVrlKrbjBKKo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TBDMi/btrQq6pNpjP/T7H9okah0hVrlKrbjBKKo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TBDMi/btrQq6pNpjP/T7H9okah0hVrlKrbjBKKo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTBDMi%2FbtrQq6pNpjP%2FT7H9okah0hVrlKrbjBKKo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;30&quot; data-filename=&quot;화면 캡처 2022-11-05 231852.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;30&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 vi(리눅스계의 vsc)를 이용해서 test라는 쉘 스크립트 파일을 하나 만들겠습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-11-06 000426.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M8YKQ/btrQvZJdt6E/YXUxcXi9JmZ8SMruKtw7N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M8YKQ/btrQvZJdt6E/YXUxcXi9JmZ8SMruKtw7N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M8YKQ/btrQvZJdt6E/YXUxcXi9JmZ8SMruKtw7N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM8YKQ%2FbtrQvZJdt6E%2FYXUxcXi9JmZ8SMruKtw7N1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;374&quot; data-filename=&quot;화면 캡처 2022-11-06 000426.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;#!/bin/bash&lt;/code&gt; : shell도 하나의 프로그램으로서 여러 종류가 있습니다. 그 중에 bash라는 쉘 프로그램을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;grep $1 $2 &amp;gt; /dev/null&lt;/code&gt; : 찾을 계정의 이름에 해당하는 인자($1)를 받고 파일 안에서 문자가 위치한 부분을 찾아주는 grep을 실행해서 그 결괏값을 /dev/null 이라는 특수 파일로:` 보내 결과값이 출력되지 않도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;if [ $? -eq 0 ]; then&lt;/code&gt; : 가장 최근 명령어가 성공적으로 실행되면 $?는 0을 반환합니다. $?가 0과 같은지(-eq)를 판단합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-11-05 235800.png&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VxL8r/btrQruRv9he/uJb1WmAP4G47v6QpmvTf51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VxL8r/btrQruRv9he/uJb1WmAP4G47v6QpmvTf51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VxL8r/btrQruRv9he/uJb1WmAP4G47v6QpmvTf51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVxL8r%2FbtrQruRv9he%2FuJb1WmAP4G47v6QpmvTf51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;673&quot; height=&quot;113&quot; data-filename=&quot;화면 캡처 2022-11-05 235800.png&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 프로그램을 작성했으니 실행을 하겠습니다...만 sh파일은 처음 만들면 실행 권한이 없으므로 파일에 실행 권한을 주겠습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-11-06 000650.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btWXlv/btrQr272oEf/3QDITLaMS5fpWy4fcqzX6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btWXlv/btrQr272oEf/3QDITLaMS5fpWy4fcqzX6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btWXlv/btrQr272oEf/3QDITLaMS5fpWy4fcqzX6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtWXlv%2FbtrQr272oEf%2F3QDITLaMS5fpWy4fcqzX6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;564&quot; height=&quot;89&quot; data-filename=&quot;화면 캡처 2022-11-06 000650.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 프로그램을 실행시켜서 사용자를 찾아보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 사용하고있는 bstudent는 /etc/passwd에 있으므로 Match found가 뜨고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;elonmusk라는 계정은 없기 때문에 Match not found가 반환되었습니다&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배울랑교 블록체인 중급 과정을 듣고 정리하여 작성했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문법이 조금 이질적이네요ㅋㅋㅋ 리눅스에서 코딩하는것도 신기하고 vi도 vsc 못지않게 친절하구요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배울랑교 수업 재밌습니다&lt;/p&gt;</description>
      <category>Shell</category>
      <category>.sh</category>
      <category>.sh 확장자</category>
      <category>shell</category>
      <category>Shell Script</category>
      <category>쉘 스크립트</category>
      <category>쉘 스크립트 for</category>
      <category>쉘 스크립트 if</category>
      <category>쉘 스크립트 while</category>
      <category>쉘 스크립트 조건문</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/12</guid>
      <comments>https://gwan.tistory.com/12#entry12comment</comments>
      <pubDate>Sun, 6 Nov 2022 00:16:57 +0900</pubDate>
    </item>
    <item>
      <title>티스토리 스킨 편집하기 (블로그 설명 변수 추가)</title>
      <link>https://gwan.tistory.com/11</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-11-05 165116.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;982&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNzcvD/btrQuIgqglz/NKVOcwhkk52IURhbBn1lk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNzcvD/btrQuIgqglz/NKVOcwhkk52IURhbBn1lk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNzcvD/btrQuIgqglz/NKVOcwhkk52IURhbBn1lk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNzcvD%2FbtrQuIgqglz%2FNKVOcwhkk52IURhbBn1lk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;982&quot; data-filename=&quot;화면 캡처 2022-11-05 165116.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;982&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그 프로필 영역이 밋밋해서 깃허브 링크를 하나 추가해주고 싶었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-11-05 165239.png&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/36q04/btrQrDUFOdg/lB7rs1jFWIKj2T56KvJnm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/36q04/btrQrDUFOdg/lB7rs1jFWIKj2T56KvJnm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/36q04/btrQrDUFOdg/lB7rs1jFWIKj2T56KvJnm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F36q04%2FbtrQrDUFOdg%2FlB7rs1jFWIKj2T56KvJnm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1917&quot; height=&quot;865&quot; data-filename=&quot;화면 캡처 2022-11-05 165239.png&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;865&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로필 영역에 해당하는 소스코드는 위와 같은데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-11-05 165513.png&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8OXFH/btrQq30CG33/92zxM87LmMd5KSNM1j5HUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8OXFH/btrQq30CG33/92zxM87LmMd5KSNM1j5HUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8OXFH/btrQq30CG33/92zxM87LmMd5KSNM1j5HUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8OXFH%2FbtrQq30CG33%2F92zxM87LmMd5KSNM1j5HUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1917&quot; height=&quot;938&quot; data-filename=&quot;화면 캡처 2022-11-05 165513.png&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 위치에 div 태그와 &lt;code&gt;[##_desc_##&amp;#93;&lt;/code&gt; 변수를 넣어주면 블로그 설명이 뜨게됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;	[##_desc_##&amp;#93;&lt;/code&gt; 와 같은 변수들은 티스토리 공식 docs같은 사이트가 있더라구요 참고하시면 좋을 듯 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(여기서는 공통 치환자 라고 부르네요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tistory.github.io/document-tistory-skin/common/global.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://tistory.github.io/document-tistory-skin/common/global.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1667635548475&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;공통 &amp;middot; GitBook&quot; data-og-description=&quot;카테고리 글 리스트 tt-body-category&quot; data-og-host=&quot;tistory.github.io&quot; data-og-source-url=&quot;https://tistory.github.io/document-tistory-skin/common/global.html&quot; data-og-url=&quot;https://tistory.github.io/document-tistory-skin/common/global.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tistory.github.io/document-tistory-skin/common/global.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tistory.github.io/document-tistory-skin/common/global.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;공통 &amp;middot; GitBook&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;카테고리 글 리스트 tt-body-category&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tistory.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc</category>
      <category>hELLO스킨 수정</category>
      <category>hELLO스킨 편집</category>
      <category>공통 치환자</category>
      <category>티스토리 스킨 수정</category>
      <category>티스토리 스킨 편집</category>
      <category>티스토리 편집 변수</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/11</guid>
      <comments>https://gwan.tistory.com/11#entry11comment</comments>
      <pubDate>Sat, 5 Nov 2022 17:09:54 +0900</pubDate>
    </item>
    <item>
      <title>[오류 / Solidity] remixd : 이 시스템에서 스크립트를 실행할 수 없으므로 ...</title>
      <link>https://gwan.tistory.com/10</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;powershell 오류.png&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eJt581/btrOPZMZhdU/zGc2eqEbSTyg1M2DHQUgI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eJt581/btrOPZMZhdU/zGc2eqEbSTyg1M2DHQUgI0/img.png&quot; data-alt=&quot;오류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eJt581/btrOPZMZhdU/zGc2eqEbSTyg1M2DHQUgI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeJt581%2FbtrOPZMZhdU%2FzGc2eqEbSTyg1M2DHQUgI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;947&quot; height=&quot;182&quot; data-filename=&quot;powershell 오류.png&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vsc와 remix의 연동 과정 중에 이런 오류가 발생했다&lt;br /&gt;&lt;br /&gt;windows에서 신뢰하지 않는 스크립트로부터 사용자를 보호하기 위한 실행 정책이라는 게 있나보다&lt;br /&gt;그래서&amp;nbsp;리믹스&amp;nbsp;설치&amp;nbsp;이외에도&amp;nbsp;자주&amp;nbsp;발생하는&amp;nbsp;오류인&amp;nbsp;것&amp;nbsp;같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;먼저&amp;nbsp;실행&amp;nbsp;정책을&amp;nbsp;변경하려면&amp;nbsp;관리자권한이&amp;nbsp;있는&amp;nbsp;터미널을&amp;nbsp;켜줘야한다 &lt;br /&gt;start-process&amp;nbsp;powershell&amp;nbsp;?verb&amp;nbsp;runAs &lt;br /&gt;위의&amp;nbsp;스크립트를&amp;nbsp;작업을&amp;nbsp;진행중이던&amp;nbsp;터미널에&amp;nbsp;복붙하면&amp;nbsp;관리자권한의&amp;nbsp;새로운&amp;nbsp;터미널이&amp;nbsp;뜬다 &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;새&amp;nbsp;터미널에&amp;nbsp;Get-ExecutionPolicy를&amp;nbsp;치면&amp;nbsp;Restricted&amp;nbsp;라고&amp;nbsp;뜨는데&amp;nbsp;이게&amp;nbsp;제한된&amp;nbsp;상태인&amp;nbsp;것&amp;nbsp;같다 &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;제한을&amp;nbsp;해제하기&amp;nbsp;위해&amp;nbsp;Set-ExecutionPolicy&amp;nbsp;RemoteSigned&amp;nbsp;를&amp;nbsp;입력해서&amp;nbsp;터미널에&amp;nbsp;혼쭐을&amp;nbsp;내주자 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sdfgsfdg.png&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MMxpM/btrOScqDppe/LfMIabQREmWftqpV1YJUd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MMxpM/btrOScqDppe/LfMIabQREmWftqpV1YJUd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MMxpM/btrOScqDppe/LfMIabQREmWftqpV1YJUd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMMxpM%2FbtrOScqDppe%2FLfMIabQREmWftqpV1YJUd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;103&quot; data-filename=&quot;sdfgsfdg.png&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;4.&amp;nbsp;위의&amp;nbsp;사진처럼&amp;nbsp;뜰텐데&amp;nbsp;Y&amp;nbsp;또는&amp;nbsp;y를&amp;nbsp;입력하고&amp;nbsp;엔터&amp;nbsp;해주면&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;Get-ExecutionPolicy를&amp;nbsp;다시&amp;nbsp;입력해보면&amp;nbsp;RemoteSigned&amp;nbsp;가&amp;nbsp;뜬다,&amp;nbsp;이제&amp;nbsp;다시&amp;nbsp;작업&amp;nbsp;중이던&amp;nbsp;터미널로&amp;nbsp;돌아가서&amp;nbsp;원하던&amp;nbsp;스크립트를&amp;nbsp;입력해보면&amp;nbsp;정상적으로&amp;nbsp;작동이&amp;nbsp;될&amp;nbsp;것이다!&lt;/p&gt;</description>
      <category>Solidity</category>
      <category>executionpolicy</category>
      <category>PowerShell</category>
      <category>remix</category>
      <category>remixd</category>
      <category>solidty</category>
      <category>이 시스템에서 스크립트를</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/10</guid>
      <comments>https://gwan.tistory.com/10#entry10comment</comments>
      <pubDate>Mon, 17 Oct 2022 23:49:55 +0900</pubDate>
    </item>
    <item>
      <title>[오류 / React] React Hook &amp;quot;useNavigate&amp;quot; is called in function</title>
      <link>https://gwan.tistory.com/9</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-10-07 141320.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PgbNc/btrN1hfI09g/zvaU8mTjUk3H0yL0scGw10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PgbNc/btrN1hfI09g/zvaU8mTjUk3H0yL0scGw10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PgbNc/btrN1hfI09g/zvaU8mTjUk3H0yL0scGw10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPgbNc%2FbtrN1hfI09g%2FzvaU8mTjUk3H0yL0scGw10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;275&quot; data-filename=&quot;화면 캡처 2022-10-07 141320.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'useNavigate는 함수 이름 첫 글자가 대문자인 함수에만 사용할 수 있다', 즉 너의 Main.js 함수 이름의 첫글자는 소문자다.. 라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 main.js 로 만들고 rafce를 했다가, 나중에 파일 이름만 대문자로 바꿔서 오류가 발생했습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-10-07 142306.png&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yylbB/btrN1yV0KX1/6rTIZrR88hSs5o6yLepkk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yylbB/btrN1yV0KX1/6rTIZrR88hSs5o6yLepkk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yylbB/btrN1yV0KX1/6rTIZrR88hSs5o6yLepkk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyylbB%2FbtrN1yV0KX1%2F6rTIZrR88hSs5o6yLepkk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;105&quot; data-filename=&quot;화면 캡처 2022-10-07 142306.png&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-10-07 142329.png&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beKLgs/btrN3nFLIOS/9zu8GC9mF8blOfHaimGa50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beKLgs/btrN3nFLIOS/9zu8GC9mF8blOfHaimGa50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beKLgs/btrN3nFLIOS/9zu8GC9mF8blOfHaimGa50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeKLgs%2FbtrN3nFLIOS%2F9zu8GC9mF8blOfHaimGa50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;337&quot; height=&quot;107&quot; data-filename=&quot;화면 캡처 2022-10-07 142329.png&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 발생한 js파일에 함수 이름과 코드 맨 아랫줄에 있는 함수이름도 까먹지 않고 수정해주시면 됩니다&lt;/p&gt;</description>
      <category>React</category>
      <category>react</category>
      <category>useNavigate</category>
      <category>오류</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/9</guid>
      <comments>https://gwan.tistory.com/9#entry9comment</comments>
      <pubDate>Fri, 7 Oct 2022 14:28:40 +0900</pubDate>
    </item>
    <item>
      <title>[오류 / Git] fatal: It seems that there is already a rebase-merge directory ...</title>
      <link>https://gwan.tistory.com/8</link>
      <description>&lt;pre id=&quot;code_1665118567598&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fatal: It seems that there is already a rebase-merge directory,
and I wonder if you are in the middle of another rebase.
If that is the case, please try
	git rebase (--continue | --abort | --skip) 
If that is not the case, please 
	rm -fr &quot;.git/rebase-merge&quot;
and run me again.
I am stopping in case you still have something valuable there.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git rebase를 연습하는데 위와 같은 오류가 떴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'fatal : 이거 보아하니 니가 rebase-merge 중인 게 있는 거 같은데, 너가 다른 rebase를 하는 중인지 궁금하다.'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rabase를 하는 도중 vsc를 꺼서 발생한 에러였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1665119029622&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rebase --quit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴땐 quit하고 다시 rebase 하는 게 편하다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출저 : &lt;a href=&quot;https://stackoverflow.com/questions/19134845/forgotten-rebase-interactive-git&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/19134845/forgotten-rebase-interactive-git&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665119092245&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Forgotten rebase interactive - git&quot; data-og-description=&quot;I ran some times ago some git rebase -i command. But I completely forgot it. Now I want to change new commits order. So I ran git rebase -i HEAD~4, and I get normally It seems that there is alrea...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/19134845/forgotten-rebase-interactive-git&quot; data-og-url=&quot;https://stackoverflow.com/questions/19134845/forgotten-rebase-interactive-git&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eYsCA/hyP3G31Gw3/XRmXkIrKRWzE2ZXvJhVpzK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/19134845/forgotten-rebase-interactive-git&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/19134845/forgotten-rebase-interactive-git&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eYsCA/hyP3G31Gw3/XRmXkIrKRWzE2ZXvJhVpzK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Forgotten rebase interactive - git&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I ran some times ago some git rebase -i command. But I completely forgot it. Now I want to change new commits order. So I ran git rebase -i HEAD~4, and I get normally It seems that there is alrea...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Git</category>
      <category>fatal:</category>
      <category>git</category>
      <category>git 에러</category>
      <category>Rebase</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/8</guid>
      <comments>https://gwan.tistory.com/8#entry8comment</comments>
      <pubDate>Fri, 7 Oct 2022 14:05:30 +0900</pubDate>
    </item>
    <item>
      <title>[오류 / React] 배포 시 발생하는 Router path 문제</title>
      <link>https://gwan.tistory.com/7</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-10-06 231643.png&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8UTxW/btrNYUEp2f4/HvA65YEFJ9Z0Fzaj06rqN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8UTxW/btrNYUEp2f4/HvA65YEFJ9Z0Fzaj06rqN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8UTxW/btrNYUEp2f4/HvA65YEFJ9Z0Fzaj06rqN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8UTxW%2FbtrNYUEp2f4%2FHvA65YEFJ9Z0Fzaj06rqN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;375&quot; data-filename=&quot;화면 캡처 2022-10-06 231643.png&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-10-06 232633.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w1dbq/btrNYei3eOS/3Uqnbaz7zSVTqlXihkHys1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w1dbq/btrNYei3eOS/3Uqnbaz7zSVTqlXihkHys1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w1dbq/btrNYei3eOS/3Uqnbaz7zSVTqlXihkHys1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw1dbq%2FbtrNYei3eOS%2F3Uqnbaz7zSVTqlXihkHys1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1068&quot; height=&quot;422&quot; data-filename=&quot;화면 캡처 2022-10-06 232633.png&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에선 잘만 됐는데 &lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;github pages로 배포했더니 상단 바(Navbar 태그)를 제외한 컴포넌트가 렌더링 되지 않는다!!!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-10-06 231405.png&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxLCRy/btrNZkJDEyu/IzIoef2SX5epqBXDki4H0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxLCRy/btrNZkJDEyu/IzIoef2SX5epqBXDki4H0k/img.png&quot; data-alt=&quot;배포 전 로컬 URL&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxLCRy/btrNZkJDEyu/IzIoef2SX5epqBXDki4H0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxLCRy%2FbtrNZkJDEyu%2FIzIoef2SX5epqBXDki4H0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;68&quot; data-filename=&quot;화면 캡처 2022-10-06 231405.png&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배포 전 로컬 URL&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-10-06 231832.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YZj6x/btrNYuTx5kM/8kOzk08Qs5oJqI9QVuCsk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YZj6x/btrNYuTx5kM/8kOzk08Qs5oJqI9QVuCsk1/img.png&quot; data-alt=&quot;github pages로 배포 후 URL&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YZj6x/btrNYuTx5kM/8kOzk08Qs5oJqI9QVuCsk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYZj6x%2FbtrNYuTx5kM%2F8kOzk08Qs5oJqI9QVuCsk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;81&quot; data-filename=&quot;화면 캡처 2022-10-06 231832.png&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;github pages로 배포 후 URL&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL이 달라졌으니 기존 path 속성이 안 먹힐 수밖에...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴땐?!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-10-06 232057.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdyq9z/btrNXlccgyL/xfg7owRtGQyisO1trYt4TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdyq9z/btrNXlccgyL/xfg7owRtGQyisO1trYt4TK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdyq9z/btrNXlccgyL/xfg7owRtGQyisO1trYt4TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdyq9z%2FbtrNXlccgyL%2Fxfg7owRtGQyisO1trYt4TK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;191&quot; data-filename=&quot;화면 캡처 2022-10-06 232057.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;basename={process.env.PUBLIC_URL}&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 를 BrowserRouter 태그에 속성으로 추가해 주시면 됩니다~&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리액트에게 기본 URL을 제공하는 거라고 하네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출저 : &lt;a href=&quot;https://medium.com/@_diana_lee/react-react-router-%EC%A0%81%EC%9A%A9%ED%95%9C-react-%EC%95%B1%EC%9D%84-github-pages%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EB%8A%94-%EB%B2%95-5f6119c6a5d9&quot;&gt;https://medium.com/@_diana_lee/react-react-router-%EC%A0%81%EC%9A%A9%ED%95%9C-react-%EC%95%B1%EC%9D%84-github-pages%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EB%8A%94-%EB%B2%95-5f6119c6a5d9&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1665066234322&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[React] react-router 적용한 React 앱을 github pages로 배포하는 법&quot; data-og-description=&quot;이 글은 당신이 create-react-app과 react-router를 사용 중이라고 가정하고 있습니다&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@_diana_lee/react-react-router-%EC%A0%81%EC%9A%A9%ED%95%9C-react-%EC%95%B1%EC%9D%84-github-pages%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EB%8A%94-%EB%B2%95-5f6119c6a5d9&quot; data-og-url=&quot;https://medium.com/@_diana_lee/react-react-router-%EC%A0%81%EC%9A%A9%ED%95%9C-react-%EC%95%B1%EC%9D%84-github-pages%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EB%8A%94-%EB%B2%95-5f6119c6a5d9&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blCYHw/hyP16iyNSa/XJlsgUyMidS9rnn6oaMUkK/img.png?width=455&amp;amp;height=205&amp;amp;face=0_0_455_205,https://scrap.kakaocdn.net/dn/Cs2Mb/hyP3Fp4YWj/ujnH1uDVZBqc6qJLx9Koyk/img.png?width=1002&amp;amp;height=787&amp;amp;face=0_0_1002_787,https://scrap.kakaocdn.net/dn/bqgP5q/hyP3Kroirw/dHwO7uDUZz7nvz5HnueSNK/img.png?width=1058&amp;amp;height=346&amp;amp;face=0_0_1058_346&quot;&gt;&lt;a href=&quot;https://medium.com/@_diana_lee/react-react-router-%EC%A0%81%EC%9A%A9%ED%95%9C-react-%EC%95%B1%EC%9D%84-github-pages%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EB%8A%94-%EB%B2%95-5f6119c6a5d9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@_diana_lee/react-react-router-%EC%A0%81%EC%9A%A9%ED%95%9C-react-%EC%95%B1%EC%9D%84-github-pages%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EB%8A%94-%EB%B2%95-5f6119c6a5d9&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blCYHw/hyP16iyNSa/XJlsgUyMidS9rnn6oaMUkK/img.png?width=455&amp;amp;height=205&amp;amp;face=0_0_455_205,https://scrap.kakaocdn.net/dn/Cs2Mb/hyP3Fp4YWj/ujnH1uDVZBqc6qJLx9Koyk/img.png?width=1002&amp;amp;height=787&amp;amp;face=0_0_1002_787,https://scrap.kakaocdn.net/dn/bqgP5q/hyP3Kroirw/dHwO7uDUZz7nvz5HnueSNK/img.png?width=1058&amp;amp;height=346&amp;amp;face=0_0_1058_346');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[React] react-router 적용한 React 앱을 github pages로 배포하는 법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 글은 당신이 create-react-app과 react-router를 사용 중이라고 가정하고 있습니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다...&lt;/p&gt;</description>
      <category>React</category>
      <category>github pages 오류</category>
      <category>path</category>
      <category>react</category>
      <category>Router</category>
      <category>배포 후 오류</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/7</guid>
      <comments>https://gwan.tistory.com/7#entry7comment</comments>
      <pubDate>Thu, 6 Oct 2022 23:27:49 +0900</pubDate>
    </item>
    <item>
      <title>비트코인 채굴, POW는 낭비인가</title>
      <link>https://gwan.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;비트코인 작동 방식에 대한 수업을 들으면서, 아무리 1세대 블록체인이라 해도 너무 비효율적이지 않나 하는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기에 POS가 등장했다고 하나, 이정도의 전기낭비라면 빠른 시일 내에 바꿔야 하는 게 아닌가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탈중앙화 보다는 지구온난화가 더 먼저 오는 게 아닌가 하는 생각이 든다... 라는 짧은 생각을 갖고 한 커뮤니티의 고수님들에게 고견을 여쭈어 보았다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 채굴이라는 행위에 가치가 부여된다. (feat. 디지털 금)&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;금광이 있고, 그 금광에서 금을 캐면 금을 얻죠.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그리고, 그 금에 우리는 가치를 부여합니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;물론 그 금의 경우는 실질적으로 볼 수 있고, 가공할 수 있으며, 여러 산업에서 사용될 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;비트코인도 컴퓨팅파워와 전기를 사용하여 채굴을 합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그리고 여기에 가치를 부여하는 거죠.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;미술가가 미술 작품을 그리면 거기도 가치를 매기죠.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;많은 사람들이 가치를 부여하기로 합의했다면 가치가 있는 물건이 되는 거죠.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 관점으로 볼 수도 있구나..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각지도 못한 답변에 무릎을 탁 쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마치 금처럼, 금광에서 금을 캐는 &quot;노력&quot;과 금의 &quot;희소성&quot;을 인정해주고 &quot;가치&quot;를 부여한다는 말인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 금과 크게 다를 바가 없는 듯하다. 비트코인이 단순하게 희소성만 갖고있는 것이 아니라, 금 처럼 나름의 기능성도 있으니&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 옳은 정보를 합의 할 수 있는 능력 = 비트코인의 보안성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;블록체인의 보안성 = 옳은 정보를 합의 할 수 있는 능력입니다.&lt;br /&gt;&lt;br /&gt;논스값은 찾기는 어렵지만, 검증하기는 쉬운 값이니, 누구가 안전하고 간단하게 합의에 이를 수 있는 거죠.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POS가 등장하기 전에, 그럼 POW말고 어떤 알고리즘이 좋냐고 물으면 꿀 먹은 벙어리가 될 것 같기도 하다ㅋㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논스가 찾기는 어렵지만, 검증하기는 쉽기에, 안전하고 간단하게 합의에 이를 수 있다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 그 과정에서 다소 낭비가 되는 부분이 있긴 하지만, 합의 알고리즘으로써 기능은 제대로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;곰곰히 생각해보니 고개가 끄덕여진다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 시스템을 망가뜨리려면 출혈은 감수해라&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;되게 혁명혁명스러운 말이다ㅋㅋ 비트코인이 탄생한 이유이기도 하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하긴 모든 은행 시스템이 쓰는 전기세 &amp;gt; 비트코인 전기세 일지도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 이 말의 의미는 기존의 중앙화된 시스템을 바꾼다면 전기세 낭비 = 약간의&amp;nbsp; 출혈 이라는 말이겠지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인문학적인 요소가 많이 결합된 기술인 만큼 다각적으로 생각해봐야 할 기술이다!&lt;/p&gt;</description>
      <category>BlockChain</category>
      <category>POS</category>
      <category>POW</category>
      <category>Proof of Work</category>
      <category>블록체인</category>
      <category>비트코인</category>
      <category>채굴</category>
      <category>코인</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/6</guid>
      <comments>https://gwan.tistory.com/6#entry6comment</comments>
      <pubDate>Sat, 17 Sep 2022 16:47:25 +0900</pubDate>
    </item>
    <item>
      <title>비트코인의 채굴 난이도 조절 방식 (POW) +실습</title>
      <link>https://gwan.tistory.com/5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;외부 요인을 시작으로 변경되는 해시레이트에 따라서 블록 생성 시간, 난이도, 타겟값 같은 변수들이 길항관계를 이루며 순차적으로 변경됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비트코인은 아래의 과정을 2016블록마다 반복함으로써 블록 생성 시간을 10분에 맞춥니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코인 가격이 내려가서 채굴자들이 침을 뱉고 나가면, 해시레이트가 줄어든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시레이트가 줄어들면 블록 생성 시간이 10분보다 오래 걸리고 비트코인은 난이도를 낮춘다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난이도가 내려가면 타겟값이 커진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타겟값이 커지면 채굴자들이 논스값을 빨리 맞추게 되서 블럭 생성 시간이 줄어든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코인 가격이 올라가서 채굴자들이 침을 삼키고 들어오면, 혹은 그래픽카드가 발달하면, 해시레이트가 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시레이트가 증가하면 블록 생성 시간이 10분 보다 적게 걸리고 비트코인은 난이도를 높인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난이도가 높아지면 타겟값이 내려간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타겟값이 내려가면 블럭 생성 시간이 늘어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실습)&amp;nbsp; 실제 트렌젝션의 타겟값을 구하고, 해시값이 타겟값보다 낮은지 확인해보기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-09-16 233402.png&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/miO6e/btrMlcF8KGN/oeQj8vOwZag9BL10hj3gAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/miO6e/btrMlcF8KGN/oeQj8vOwZag9BL10hj3gAk/img.png&quot; data-alt=&quot;https://www.blockchain.com/explorer/blocks/btc/754283&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/miO6e/btrMlcF8KGN/oeQj8vOwZag9BL10hj3gAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmiO6e%2FbtrMlcF8KGN%2FoeQj8vOwZag9BL10hj3gAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;731&quot; data-filename=&quot;화면 캡처 2022-09-16 233402.png&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.blockchain.com/explorer/blocks/btc/754283&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.blockchain.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.blockchain.com&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663339191667&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Blockchain.com - The Most Trusted Crypto Company&quot; data-og-description=&quot;Blockchain.com is the most popular place to securely buy, store, and trade Bitcoin, Ethereum, and other top cryptocurrencies.&quot; data-og-host=&quot;www.blockchain.com&quot; data-og-source-url=&quot;https://www.blockchain.com&quot; data-og-url=&quot;https://www.blockchain.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OYPYQ/hyPNTDU1tX/0klAbXCEKlHlj6ndC4QW21/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/XjDQi/hyPN21UCWT/P1RDv3KlMQbgq4nSpxSVYK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/fg4lH/hyPOQMkFFZ/VB1gGjAsK7lskaVh3HqCsk/img.png?width=921&amp;amp;height=1378&amp;amp;face=0_0_921_1378&quot;&gt;&lt;a href=&quot;https://www.blockchain.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.blockchain.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OYPYQ/hyPNTDU1tX/0klAbXCEKlHlj6ndC4QW21/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/XjDQi/hyPN21UCWT/P1RDv3KlMQbgq4nSpxSVYK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/fg4lH/hyPOQMkFFZ/VB1gGjAsK7lskaVh3HqCsk/img.png?width=921&amp;amp;height=1378&amp;amp;face=0_0_921_1378');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Blockchain.com - The Most Trusted Crypto Company&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Blockchain.com is the most popular place to securely buy, store, and trade Bitcoin, Ethereum, and other top cryptocurrencies.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.blockchain.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사이트에 가면 특정 트렌젝션에 대한 정보를 볼 수 있는데, 여기서 사용할 정보는 Hash와 Difficulty입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 제네시스 블록의 타겟값 구하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;첫번째 블록의 난이도는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;0x1d00ffff로 정의되어 있습니다&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1663339727015&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0x00ffff * 2^(8*(0x1d - 3)) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A * 2^(8*(B - 3)), A는 난이도의 뒷 6자리,&amp;nbsp; B는 난이도의 앞 두자리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 식으로 제네시스 블록의 타겟값을 구할 수 있습니다. (여튼 그럼...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 현재 블록의 타겟값 구하기&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2022-09-16 231948.png&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfJ9oO/btrMlUkV7i2/ddU6TakRJ6tMIpAgCufC41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfJ9oO/btrMlUkV7i2/ddU6TakRJ6tMIpAgCufC41/img.png&quot; data-alt=&quot;https://en.bitcoin.it/wiki/Difficulty&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfJ9oO/btrMlUkV7i2/ddU6TakRJ6tMIpAgCufC41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfJ9oO%2FbtrMlUkV7i2%2FddU6TakRJ6tMIpAgCufC41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;102&quot; data-filename=&quot;화면 캡처 2022-09-16 231948.png&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://en.bitcoin.it/wiki/Difficulty&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 블럭의 난이도 = 제네시스 블록의 타겟값 / 현재 타겟값&amp;nbsp; 이라는 공식이 또 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 알고있는 두 값을 통해 현재블록의 타겟값을 구할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제네시스 블록의 타겟값을 10진수로 변환하면 2.695953529101131e+67 (대충 겁나 큰 숫자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 난이도는 &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;32,045,359,565,303&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제네시스 블록의 타겟값 / 난이도 = 현재 타겟값 이므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.695953529101131e+67 / &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;32,045,359,565,303 = 8.412929565066154e+53&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 타겟값은 &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;8.412929565066154e+53이 되겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.현재 타겟값과 해시값 비교하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 보고있는 #754,283번째의 해쉬값과 16진수로 변환한 #754,283번째의 타겟값을 비교해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;754284번째의&amp;nbsp;타겟값&amp;nbsp;:&amp;nbsp;0000&amp;nbsp;0000&amp;nbsp;0000&amp;nbsp;0000&amp;nbsp;000&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;8&lt;/b&gt;&lt;/span&gt;&amp;nbsp;c894&amp;nbsp;0000&amp;nbsp;000b&amp;nbsp;0000&amp;nbsp;0000&amp;nbsp;0000&amp;nbsp;0000&amp;nbsp;0000&amp;nbsp;0000&amp;nbsp;0000&amp;nbsp;0000&lt;br /&gt;754284번째의 해시값 : 0000 0000 0000 0000 000&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;7&lt;/b&gt;&lt;/span&gt;&amp;nbsp;fcca&amp;nbsp;7a8c&amp;nbsp;980f&amp;nbsp;8493&amp;nbsp;8ca7&amp;nbsp;cc05&amp;nbsp;1f7b&amp;nbsp;2831&amp;nbsp;2567&amp;nbsp;f96a&amp;nbsp;2aab&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해시값 &amp;lt; 타겟값&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해시값이 타겟값보다 낮은 값이 나왔기 때문에 블록이 생성되었습니다.&lt;/p&gt;</description>
      <category>BlockChain</category>
      <category>블록체인</category>
      <category>비트코인</category>
      <category>비트코인 난이도</category>
      <category>비트코인 채굴</category>
      <category>채굴</category>
      <category>채굴 난이도</category>
      <category>채굴 난이도 조정</category>
      <category>코인 채굴</category>
      <author>pangyoelon</author>
      <guid isPermaLink="true">https://gwan.tistory.com/5</guid>
      <comments>https://gwan.tistory.com/5#entry5comment</comments>
      <pubDate>Sat, 17 Sep 2022 00:22:12 +0900</pubDate>
    </item>
  </channel>
</rss>