<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>TechNote.kr</title>
    <link>https://mytechmemo.tistory.com/</link>
    <description>IT Tech Blog</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 17:23:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>TechNote.kr</managingEditor>
    <image>
      <title>TechNote.kr</title>
      <url>https://t1.daumcdn.net/cfile/tistory/257B7B50570912451F</url>
      <link>https://mytechmemo.tistory.com</link>
    </image>
    <item>
      <title>[Javascript] var, let, const 비교 분석</title>
      <link>https://mytechmemo.tistory.com/385</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript 에는 3가지 변수 선언 방식이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재선언, 재할당 가능 여부에 따라 구별되어 사용된다.&lt;/p&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 style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;재선언&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;재할당&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;var&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;let&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;const&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript Code 를 실행하는 방법 참조 링크 : &lt;a href=&quot;https://technote.kr/386&quot;&gt;[Javascript] 코드 동작 확인 방법 (technote.kr)&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재선언과 재할당이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Code #1]&lt;/p&gt;
&lt;pre id=&quot;code_1656858681179&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var a = 1;
a = 2;
var a = 3;

console.log(a);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1656858704604&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\node_test&amp;gt; node main.js
3&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;let&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재할당은 가능하지만 재선언은 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Code #1]&lt;/p&gt;
&lt;pre id=&quot;code_1656858954189&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = 1;
a = 2;

console.log(a);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1656858968860&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\node_test&amp;gt; node main.js
2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Code #2]&lt;/p&gt;
&lt;pre id=&quot;code_1656859204418&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = 1;
var a = 2;

console.log(a);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1656859217612&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\node_test&amp;gt; node main.js
D:\workspace\node_test\main.js:2
var a = 2;
    ^

SyntaxError: Identifier 'a' has already been declared
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1033:15)
    at Module._compile (node:internal/modules/cjs/loader:1069:27)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
    at node:internal/main/run_main_module:17:47&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;const&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재선언, 재할당 모두 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Code #1]&lt;/p&gt;
&lt;pre id=&quot;code_1656859048986&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const a = 1;
a = 2;

console.log(a);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1656859056740&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\node_test&amp;gt; node main.js
D:\workspace\node_test\main.js:2
a = 2;
  ^

TypeError: Assignment to constant variable.
    at Object.&amp;lt;anonymous&amp;gt; (D:\workspace\node_test\main.js:2:3)
    at Module._compile (node:internal/modules/cjs/loader:1105:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
    at node:internal/main/run_main_module:17:47&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Code #2]&lt;/p&gt;
&lt;pre id=&quot;code_1656859325258&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const a = 1;
var a = 2;

console.log(a);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1656859342721&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\node_test&amp;gt; node main.js
D:\workspace\node_test\main.js:2
var a = 2;
    ^

SyntaxError: Identifier 'a' has already been declared
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1033:15)
    at Module._compile (node:internal/modules/cjs/loader:1069:27)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
    at node:internal/main/run_main_module:17:47&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[변수가 var인지, let인지, const인지 판단할 수 있는 코드]&lt;/p&gt;
&lt;pre id=&quot;code_1653920370456&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const x = 5;

var code = `var x = 3`
const original = x;
let isConst = false;
let isNotVar = false;

try {
  eval(code);  
} catch (err) {
  isNotVar = true;
}

if (isNotVar == false) {
  console.log('var x');
  return ;
}

try {
  x = 'anything';
  x = original;
} catch (err) {
  isConst = true;
}

console.log(isConst ? 'const x' : 'let x');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Javascript</category>
      <category>const</category>
      <category>JavaScript</category>
      <category>Let</category>
      <category>VAR</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/385</guid>
      <comments>https://mytechmemo.tistory.com/385#entry385comment</comments>
      <pubDate>Sun, 3 Jul 2022 23:43:46 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] 코드 동작 확인 방법</title>
      <link>https://mytechmemo.tistory.com/386</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript 는 혼자서 동작하는 script 언어라기 보다 html, css 와 같이 동작하기에 자체적인 코드 확인이 쉽지 않아 방법을 확인해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;JSFiddle&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Node.js (with VS Code)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;JSFiddle&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsfiddle.net/&quot;&gt;JSFiddle - Code Playground&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nn5iJ/btrE4Tu1U30/itu7OR9Mvau8cYBjNujNL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nn5iJ/btrE4Tu1U30/itu7OR9Mvau8cYBjNujNL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nn5iJ/btrE4Tu1U30/itu7OR9Mvau8cYBjNujNL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnn5iJ%2FbtrE4Tu1U30%2Fitu7OR9Mvau8cYBjNujNL0%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;1032&quot; height=&quot;625&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript 뿐만 아니라 HTML, CSS 까지 모두 테스트할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript 만으로도 코드를 작성한 후 Run 을 누르면 오른쪽 하단에 Console 창을 통해 코드 동작을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Node.js&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 설치 : &lt;a href=&quot;https://technote.kr/387&quot;&gt;[Node.js] 설치 및 버전 확인 (technote.kr)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 많이 쓰이는 Editor 인 VS Code 기준으로 코드 동작 확인은 다음과 같이 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 실행 후 File &amp;gt; Open Folder 를 선택하여 테스트 코드를 작성할 위치를 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWZiTv/btrFdH0Y8zH/CNyZy2D3Uz2PQls2deVErk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWZiTv/btrFdH0Y8zH/CNyZy2D3Uz2PQls2deVErk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWZiTv/btrFdH0Y8zH/CNyZy2D3Uz2PQls2deVErk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWZiTv%2FbtrFdH0Y8zH%2FCNyZy2D3Uz2PQls2deVErk%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;633&quot; height=&quot;276&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 테스트 코드를 작성하여 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgDX3U/btrFaL3oa8o/zboAym4zEQapAFKkwmm3zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgDX3U/btrFaL3oa8o/zboAym4zEQapAFKkwmm3zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgDX3U/btrFaL3oa8o/zboAym4zEQapAFKkwmm3zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgDX3U%2FbtrFaL3oa8o%2FzboAym4zEQapAFKkwmm3zK%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;770&quot; height=&quot;177&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) CTRL + SHIFT + ` 을 눌러 terminal 을 실행하고, &quot;node 코드파일명&quot; 을 실행한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655650800695&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; node main.js
1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TRroy/btrFdGue7gY/buPrHakzDfHx5LEzDOzKi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TRroy/btrFdGue7gY/buPrHakzDfHx5LEzDOzKi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TRroy/btrFdGue7gY/buPrHakzDfHx5LEzDOzKi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTRroy%2FbtrFdGue7gY%2FbuPrHakzDfHx5LEzDOzKi0%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;913&quot; height=&quot;403&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Javascript</category>
      <category>JavaScript</category>
      <category>jsfiddle</category>
      <category>node.js</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/386</guid>
      <comments>https://mytechmemo.tistory.com/386#entry386comment</comments>
      <pubDate>Mon, 20 Jun 2022 00:01:33 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] 설치 및 버전 확인</title>
      <link>https://mytechmemo.tistory.com/387</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Node.js 다운로드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설치 파일 다운로드 링크 :&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://nodejs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nodejs.org/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특별하게 최신 버전을 다운로드 해야 하는 상황이 아니라면 안정적인 LTS 를 선택하여 다운로드 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btTDjc/btrFciUF7gw/n6R7JaZcyVGPyZDNxGgsVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btTDjc/btrFciUF7gw/n6R7JaZcyVGPyZDNxGgsVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btTDjc/btrFciUF7gw/n6R7JaZcyVGPyZDNxGgsVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtTDjc%2FbtrFciUF7gw%2Fn6R7JaZcyVGPyZDNxGgsVK%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;550&quot; height=&quot;181&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Node.js 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ4e9W/btrE4BBtY12/UgYw5RBu2WreOdpSUV52yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ4e9W/btrE4BBtY12/UgYw5RBu2WreOdpSUV52yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ4e9W/btrE4BBtY12/UgYw5RBu2WreOdpSUV52yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ4e9W%2FbtrE4BBtY12%2FUgYw5RBu2WreOdpSUV52yK%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;449&quot; height=&quot;153&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTS 버전을 받아 설치를 하다보면 아래와 같이 Tools for Native Modules 를 선택하라는 항목이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 부분은 나중에 npm을 통해 modules를 설치할 때 일부 module 에서 C/C++ compile 이 필요할 경우가 있는데 이를 위해 관련 tool 을 설치하겠느냐는 항목이다. 당장을 필요가 없으니 기본 값이 uncheck 로 넘겨도 무방해 보인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekh0pb/btrFe3vXeS1/SEPlfxKVwLfWMbPkiyv0x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekh0pb/btrFe3vXeS1/SEPlfxKVwLfWMbPkiyv0x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekh0pb/btrFe3vXeS1/SEPlfxKVwLfWMbPkiyv0x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fekh0pb%2FbtrFe3vXeS1%2FSEPlfxKVwLfWMbPkiyv0x0%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;495&quot; height=&quot;387&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;387&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;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Node version 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 terminal 에서 node -v 를 실행하면 설치된 node 의 version 확인이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1655650511399&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;D:\&amp;gt;node -v
v16.15.1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eASkTA/btrFcimUcut/BGmvBDOd1NGYZ76MOxBou0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eASkTA/btrFcimUcut/BGmvBDOd1NGYZ76MOxBou0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eASkTA/btrFcimUcut/BGmvBDOd1NGYZ76MOxBou0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeASkTA%2FbtrFcimUcut%2FBGmvBDOd1NGYZ76MOxBou0%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;516&quot; height=&quot;83&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Node.js</category>
      <category>node.js</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/387</guid>
      <comments>https://mytechmemo.tistory.com/387#entry387comment</comments>
      <pubDate>Sun, 19 Jun 2022 23:56:28 +0900</pubDate>
    </item>
    <item>
      <title>[VSCODE] Prettier - Code formatter 설정</title>
      <link>https://mytechmemo.tistory.com/384</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode&quot;&gt;Prettier - Code formatter - Visual Studio Marketplace&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python 코드를 작성하다보면 Shift + Alt + F 를 눌러 코드를 정렬해가며 코드를 작성한다.&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;Prettier 가 해당 정렬을 도와주는 extension 이다.&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;&lt;b&gt;Prettier 의 설정&lt;/b&gt;&lt;/h4&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;1) Extension Tab 에서 Prettier - Code Formatter 를 설치한다.&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;2) Ctrl + ,&amp;nbsp; 혹은 File &amp;gt; Preferences &amp;gt; Settings 를 선택해 설정에 진입한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;설정 중 formatter 를 입력해 Editor: Default Formatter 를 찾아 Prettier - Code formatter를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;374&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FH4di/btrfVt8Dl22/oyG06vTfWYDlvEmZqGAJW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FH4di/btrfVt8Dl22/oyG06vTfWYDlvEmZqGAJW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FH4di/btrfVt8Dl22/oyG06vTfWYDlvEmZqGAJW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFH4di%2FbtrfVt8Dl22%2FoyG06vTfWYDlvEmZqGAJW1%2Fimg.png&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;374&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&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;다른 항목은 별다르게 수정할 필요가 없었지만 한라인 문자열 수는 80에서 160으로 수정하였다.&amp;nbsp;&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-origin-width=&quot;983&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0rRoS/btrf3sUCX5g/t92cNjO0bkJ3AsDkzP0Ng0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0rRoS/btrf3sUCX5g/t92cNjO0bkJ3AsDkzP0Ng0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0rRoS/btrf3sUCX5g/t92cNjO0bkJ3AsDkzP0Ng0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0rRoS%2Fbtrf3sUCX5g%2Ft92cNjO0bkJ3AsDkzP0Ng0%2Fimg.png&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/VS Code</category>
      <category>prettier</category>
      <category>Python</category>
      <category>vscode</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/384</guid>
      <comments>https://mytechmemo.tistory.com/384#entry384comment</comments>
      <pubDate>Sun, 26 Sep 2021 16:41:04 +0900</pubDate>
    </item>
    <item>
      <title>[VSCODE] Google Python Style Guide 적용</title>
      <link>https://mytechmemo.tistory.com/383</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/pyguide.html&quot;&gt;styleguide | Style guides for Google-originated open-source projects&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 명이 협업을 하다보면 가독성을 높히기 위해 같은 Coding Style 을 가지고 코드를 만들게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python 관련하여 Google 에서 사용하는 Python Coding Style Guide 가 있어 VSCODE 와 연동해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Lint 설정&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&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-origin-width=&quot;626&quot; data-origin-height=&quot;69&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caBxAi/btrfscZ6Fx0/I0KqfeQWEXRK1NX6V0bSbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caBxAi/btrfscZ6Fx0/I0KqfeQWEXRK1NX6V0bSbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caBxAi/btrfscZ6Fx0/I0KqfeQWEXRK1NX6V0bSbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaBxAi%2FbtrfscZ6Fx0%2FI0KqfeQWEXRK1NX6V0bSbk%2Fimg.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;69&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;248&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wRq2E/btrfuOYIYGs/fQ2ujAKZVpiqfbbUEyAANK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wRq2E/btrfuOYIYGs/fQ2ujAKZVpiqfbbUEyAANK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wRq2E/btrfuOYIYGs/fQ2ujAKZVpiqfbbUEyAANK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwRq2E%2FbtrfuOYIYGs%2FfQ2ujAKZVpiqfbbUEyAANK%2Fimg.png&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;248&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&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;이후 아래 pylintrc 파일을 다운로드 받아 사용하는 workspace 바로 아래에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/pylintrc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://google.github.io/styleguide/pylintrc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;375&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ApCDf/btrfzkCL2b7/78xDYzkC1r8vsbcfSWIJ5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ApCDf/btrfzkCL2b7/78xDYzkC1r8vsbcfSWIJ5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ApCDf/btrfzkCL2b7/78xDYzkC1r8vsbcfSWIJ5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FApCDf%2FbtrfzkCL2b7%2F78xDYzkC1r8vsbcfSWIJ5K%2Fimg.png&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;375&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&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;위 pylintrc 에 따라 pylintrc 에 따라 경고가 정상적으로 나오는 것을 확인하였고, 코드를 수정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/TechNoteGit/pywebview_example/commit/6f84c8c31fbbfc0e29943cc98fb2a325571b9bf1&quot;&gt;Apply pylint according to google style &amp;middot; TechNoteGit/pywebview_example@6f84c8c (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/TechNoteGit/pywebview_example/commit/459260205ffb092309dbd788f5706fcecd091e77&quot;&gt;Apply pylint according to google style - 1 &amp;middot; TechNoteGit/pywebview_example@4592602 (github.com)&lt;/a&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;하지만 Shift + Alt + F 를 눌러 코드를 정렬하면 pylint 와는 무관하게 코드가 정렬되어 버렸다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 별도의 Code Formatter 설정이 필요하였다.&lt;br /&gt;&lt;a href=&quot;https://mytechmemo.tistory.com/384&quot;&gt;[VSCODE] Prettier - Code formatter 설정 (tistory.com)&lt;/a&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;한 줄에 80 문자는 가독성이 떨어질 것 같아 prettier 뿐만 아니라 pylintrc 에서도 160 문자로 수정하였다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/TechNoteGit/pywebview_example/commit/be8268542fff7c3a415b74c7bf7943d82a5d81c1&quot;&gt;Over 80 characters in one line &amp;middot; TechNoteGit/pywebview_example@be82685 (github.com)&lt;/a&gt;&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;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Naming&lt;/b&gt;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 240px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;Type&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;Public&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;Internal&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Packages&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;lower_with_under&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Modules&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;lower_with_under&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;_lower_with_under&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Classes&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;CapWords&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;_CapWords&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Exceptions&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;CapWords&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Functions&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;lower_with_under()&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;_lower_with_under()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Global/Class Constants&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;CAPS_WITH_UNDER&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;_CAPS_WITH_UNDER&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Global/Class Variables&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;lower_with_under&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;_lower_with_under&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Instance Variables&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;lower_with_under&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;_lower_with_under&amp;nbsp;(protected)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Method Names&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;lower_with_under()&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;_lower_with_under()&amp;nbsp;(protected)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Function/Method Parameters&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;lower_with_under&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Local Variables&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;lower_with_under&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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>Products &amp;amp; Services/VS Code</category>
      <category>CODE</category>
      <category>Google</category>
      <category>Guide</category>
      <category>pylint</category>
      <category>Python</category>
      <category>Style</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/383</guid>
      <comments>https://mytechmemo.tistory.com/383#entry383comment</comments>
      <pubDate>Mon, 20 Sep 2021 12:28:31 +0900</pubDate>
    </item>
    <item>
      <title>[pywebview] &amp;quot;X&amp;quot; 버튼 (close) 누르면 webview hide 하도록 구현</title>
      <link>https://mytechmemo.tistory.com/382</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;81&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE64Ev/btreLgPTpbl/I0GrAux9tMJWCAUKFTmAK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE64Ev/btreLgPTpbl/I0GrAux9tMJWCAUKFTmAK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE64Ev/btreLgPTpbl/I0GrAux9tMJWCAUKFTmAK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE64Ev%2FbtreLgPTpbl%2FI0GrAux9tMJWCAUKFTmAK0%2Fimg.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;81&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&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;Window UI 에서 오른쪽 위 X 버튼을 누르면 창이 사라지고 tray 의 Show 메뉴를 누르면 다시 나타나는 기능을 구현하고자 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;140&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y1y7e/btreOsoxTHK/yZeBZ8V70s9qol0Bs2Hed0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y1y7e/btreOsoxTHK/yZeBZ8V70s9qol0Bs2Hed0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y1y7e/btreOsoxTHK/yZeBZ8V70s9qol0Bs2Hed0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY1y7e%2FbtreOsoxTHK%2FyZeBZ8V70s9qol0Bs2Hed0%2Fimg.png&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;140&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&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;a href=&quot;https://pywebview.flowrl.com/guide/api.html&quot;&gt;API | pywebview (flowrl.com)&lt;/a&gt;)를 검토해 보니 closing event를 처리하는 on_closing 내에서 False 를 return 하면 close 처리를 하지 않는다는 것을 확인했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;157&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3us7U/btreRTlCUPy/znvaPb39TEOiFvJaGpq3rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3us7U/btreRTlCUPy/znvaPb39TEOiFvJaGpq3rK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3us7U/btreRTlCUPy/znvaPb39TEOiFvJaGpq3rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3us7U%2FbtreRTlCUPy%2FznvaPb39TEOiFvJaGpq3rK%2Fimg.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;157&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 아래와 같이 on_closing 구문내에 hide 기능을 넣고 False를 return 하면 될 것으로 생각하고 구현하였지만, 해당 구문을 타게 되면 CPU 를 100%를 먹으면서 프로그램이 &quot;응답 없음&quot;이 되버리면서 죽어 버렸다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1631448971298&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def webview_subprocess(conn_parent, conn_child):
...
    window.closing += on_closing
 
def on_closing():
    webview.windows[0].hide()
    return False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 찾아보니 유사한 이슈를 처리한 이력을 찾을 수 있었다. pywebview 제작자가 답변한 내용이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&lt;a href=&quot;https://github.com/r0x0r/pywebview/issues/573&quot;&gt;https://github.com/r0x0r/pywebview/issues/573&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;142&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DQthE/btreTHL0n6m/DRkeDQ2GtKoLJx3epRQXmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DQthE/btreTHL0n6m/DRkeDQ2GtKoLJx3epRQXmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DQthE/btreTHL0n6m/DRkeDQ2GtKoLJx3epRQXmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDQthE%2FbtreTHL0n6m%2FDRkeDQ2GtKoLJx3epRQXmk%2Fimg.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;142&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;on_closing 은 별도의 thread로 처리되기에 해당 thread 에서 webview window 를 제대로 제어하지 못한다는 것으로 이해하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 on_closing thread에서 바로 hide api를 호출하여 window 를 제어하는 방식이 아니라 on_closing thread에서 webview window 가 실행되고 있는 thread 로 hide cmd 를 전송해 hide 시키는 방식을 생각하였다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;185&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uBrOA/btreKJLBd8e/6THcZv8lWpCjkTZ09cQD8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uBrOA/btreKJLBd8e/6THcZv8lWpCjkTZ09cQD8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uBrOA/btreKJLBd8e/6THcZv8lWpCjkTZ09cQD8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuBrOA%2FbtreKJLBd8e%2F6THcZv8lWpCjkTZ09cQD8K%2Fimg.png&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;185&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 시작시 PIPE를 생성하여 main process (tray 구동) 와 sub process(webview 구동) 가 나눠 가지는데,&amp;nbsp;&lt;br /&gt;이 때 webview쪽으로 cmd(hide/show)를 전송하기 위해 사용하는 main process 쪽 pipe를 sub process 의 on_closing 에서도 사용할 수 있게 넘겨주였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, parent pipe와 child pipe를 모두 subprocess 쪽으로 넘겨준다.&lt;/p&gt;
&lt;pre id=&quot;code_1631449506661&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def webview_subprocess(conn_parent, conn_child):
    window = webview.create_window('TechNote', 'https://technote.kr')
    window.closing += on_closing
    conn.parent = conn_parent
    conn.child = conn_child
    webview.start(cmd_recv, [], gui='cef', debug=True)


if __name__ == '__main__':
    conn.parent, conn.child = Pipe()

    subprocess_handler = Process(target=webview_subprocess, args=(conn.parent, conn.child))
    subprocess_handler.start()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 후 같은 subprocess 내지만 다른 thread 인 on_closing 에서 cmd_recv 로 cmd를 전송하기 위해 parent pipe와 child pipe를 이용하게 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1631449585489&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def on_closing():
    send_cmd_to_window('hide')
    return False

def send_cmd_to_window(cmd):
    conn.parent.send(cmd)

def cmd_recv():
    while True:
        cmd = conn.child.recv()
        if cmd == 'show':
            print('Show - pywebview')
            webview.windows[0].show()
        elif cmd == 'hide':
            print('Hide - pywebview')
            webview.windows[0].hide()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 on_closing 내에서도 webview window를 hide 할 수 있도록 구현할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/TechNoteGit/pywebview_example/commit/71ac8676e260fda6bc15b65e1ebb35992c84dfb7&quot;&gt;hide window in on_closing routine &amp;middot; TechNoteGit/pywebview_example@71ac867 (github.com)&lt;/a&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;</description>
      <category>Language/Python</category>
      <category>HIDE</category>
      <category>Pipe</category>
      <category>pywebview</category>
      <category>SHOW</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/382</guid>
      <comments>https://mytechmemo.tistory.com/382#entry382comment</comments>
      <pubDate>Sun, 12 Sep 2021 21:27:15 +0900</pubDate>
    </item>
    <item>
      <title>[pywebview] pystray를 이용한 hide/show 제어</title>
      <link>https://mytechmemo.tistory.com/381</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pystray 로 Windows tray 를 이용하여 program을 제어할 수 있다.&amp;nbsp;&lt;br /&gt;(pytray 아니고 pystray)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pypi.org/project/pystray/&quot;&gt;pystray &amp;middot; PyPI&lt;/a&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;[pystray 를 이용해 tray에서 Hide, Show, Quit 기능 추가]&lt;/p&gt;
&lt;pre id=&quot;code_1631418531758&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pystray
from pystray import MenuItem
from pystray import Menu
...
    image_path = Image.open(base_path + '/res/tray_icon.png')
    menu = Menu(MenuItem('Hide', lambda: send_cmd_to_window(parent_pipe, 'hide')),
                MenuItem('Show', lambda: send_cmd_to_window(parent_pipe, 'show')),
                MenuItem('Quit', lambda: quit_window(subprocess_handler)))
    icon = pystray.Icon('pyWebView_Sample', image_path, 'pyWebView', menu)
    icon.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;a href=&quot;https://technote.kr/379&quot;&gt;[pywebview] subprocess 를 이용한 pywebview 분리 실행 (technote.kr)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 process 로 pywebview 를 실행시 분리한 상황이라 pipe 를 통해 cmd를 전달한다.&lt;/p&gt;
&lt;pre id=&quot;code_1631418735838&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def send_cmd_to_window(parent_pipe, cmd):
    parent_pipe.send(cmd)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1631418750246&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def cmd_recv(child_pipe):
    while True:
        cmd = child_pipe.recv()
        if cmd == 'show':
            webview.windows[0].show()
        elif cmd == 'hide':
            webview.windows[0].hide()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pywebview 가 실행 중인 process에서는 pipe를 통해 cmd가 전달되면 해당 cmd에 맞게 기능을 수행한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;webview.windows[0] 을 통해 pywebview의 window handler를 hide 하거나 show 한다.&amp;nbsp;&lt;br /&gt;(&lt;a href=&quot;https://pywebview.flowrl.com/examples/hide_window.html&quot;&gt;Hide / show window | pywebview (flowrl.com)&lt;/a&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;a href=&quot;https://github.com/TechNoteGit/pywebview_example/commit/3a35562c78cb7f2a2e582e71d05c52086a35dbda&quot;&gt;Control pywebview show/hide via pystray &amp;middot; TechNoteGit/pywebview_example@3a35562 (github.com)&lt;/a&gt;&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>HIDE</category>
      <category>pywebview</category>
      <category>SHOW</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/381</guid>
      <comments>https://mytechmemo.tistory.com/381#entry381comment</comments>
      <pubDate>Sun, 12 Sep 2021 12:56:45 +0900</pubDate>
    </item>
    <item>
      <title>[python] global - 전역 변수의 사용</title>
      <link>https://mytechmemo.tistory.com/380</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;global을 사용하지 않고 변수를 사용할 경우 해당 변수의 scope는 함수 내로 국한된다.&lt;/p&gt;
&lt;pre id=&quot;code_1631414459196&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = 0

def test():
    # global a
    a = 1

test()
print(a)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1631414471343&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; python .\test.py
0&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;반면 global을 사용할 경우 해당 변수의 scope는 전역으로 변경되어 해당 함수를 벗어나도 수정 내역이 유지된다.&lt;/p&gt;
&lt;pre id=&quot;code_1631414506079&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = 0

def test():
    global a
    a = 1

test()
print(a)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1631414523847&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; python .\test.py
1&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;</description>
      <category>Language/Python</category>
      <category>global</category>
      <category>Python</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/380</guid>
      <comments>https://mytechmemo.tistory.com/380#entry380comment</comments>
      <pubDate>Sun, 12 Sep 2021 11:44:03 +0900</pubDate>
    </item>
    <item>
      <title>[pywebview] subprocess 를 이용한 pywebview 분리 실행</title>
      <link>https://mytechmemo.tistory.com/379</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pywebview를 실행하면 main thread 내에서 다른 코드 수행이 불가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 별도의 process로 분리하여 pywebview를 수행시키면 별도의 코드를 수행할 수 있다.&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://github.com/TechNoteGit/pywebview_example/commit/540c4c9fa861d6645c31726dd00fa07de9c9ac86&quot;&gt;pywebview using subprocess &amp;middot; TechNoteGit/pywebview_example@540c4c9 (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1631346432422&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import webview
from multiprocessing import Process, Pipe


def webview_subprocess(child_pipe):
    window = webview.create_window('TechNote', 'https://technote.kr')
    webview.start(cmd_recv, [window, child_pipe], gui='cef', debug=True)


def cmd_recv(window, child_pipe):
    while True:
        cmd = child_pipe.recv()
        # To Do - cmd handler


if __name__ == '__main__':
    parent_pipe, child_pipe = Pipe()

    subprocess_handler = Process(target=webview_subprocess, args=(child_pipe,))
    subprocess_handler.start()
    subprocess_handler.join()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 process 와 pywebview를 실행하는 subprocess는 pipe를 통해 통신한다.&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>Language/Python</category>
      <category>pywebivew</category>
      <category>subprocess</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/379</guid>
      <comments>https://mytechmemo.tistory.com/379#entry379comment</comments>
      <pubDate>Sat, 11 Sep 2021 16:54:49 +0900</pubDate>
    </item>
    <item>
      <title>[pyinstaller] TypeError: an integer is required (got type bytes)</title>
      <link>https://mytechmemo.tistory.com/378</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pyinstaller 로 작업하다 &quot;TypeError: an integer is required (got type bytes)&quot; 에러가 발생하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 에러가 발생할 때는 pyinstaller의 버전을 업그레이드하면 문제가 해결된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[pyinstaller 업데이트]&lt;/p&gt;
&lt;pre id=&quot;code_1631340127871&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\pywebview_example&amp;gt; pip install --upgrade pyinstaller
Requirement already satisfied: pyinstaller in d:\python38\lib\site-packages (3.3.1)
Collecting pyinstaller
  Downloading pyinstaller-4.5.1-py3-none-win_amd64.whl (1.9 MB)
     |████████████████████████████████| 1.9 MB 6.4 MB/s
Requirement already satisfied: altgraph in d:\python38\lib\site-packages (from pyinstaller) (0.17)
Requirement already satisfied: setuptools in d:\python38\lib\site-packages (from pyinstaller) (56.0.0)
Requirement already satisfied: pefile&amp;gt;=2017.8.1 in d:\python38\lib\site-packages (from pyinstaller) (2019.4.18)
Collecting pyinstaller-hooks-contrib&amp;gt;=2020.6
  Downloading pyinstaller_hooks_contrib-2021.3-py2.py3-none-any.whl (200 kB)
     |████████████████████████████████| 200 kB 6.8 MB/s
Collecting pywin32-ctypes&amp;gt;=0.2.0
  Downloading pywin32_ctypes-0.2.0-py2.py3-none-any.whl (28 kB)
Requirement already satisfied: future in d:\python38\lib\site-packages (from pefile&amp;gt;=2017.8.1-&amp;gt;pyinstaller) (0.18.2)
Installing collected packages: pywin32-ctypes, pyinstaller-hooks-contrib, pyinstaller
  Attempting uninstall: pyinstaller
    Found existing installation: PyInstaller 3.3.1
    Uninstalling PyInstaller-3.3.1:
      Successfully uninstalled PyInstaller-3.3.1
Successfully installed pyinstaller-4.5.1 pyinstaller-hooks-contrib-2021.3 pywin32-ctypes-0.2.0&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;[pyinstaller 업데이트 전 에러 발생]&lt;/p&gt;
&lt;pre id=&quot;code_1631339942714&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\pywebview_example&amp;gt; pyinstaller .\basic.py
389 INFO: PyInstaller: 3.3.1
389 INFO: Python: 3.8.10
422 INFO: Platform: Windows-10-10.0.19043-SP0
423 INFO: wrote D:\workspace\pywebview_example\basic.spec
424 INFO: UPX is not available.
432 INFO: Extending PYTHONPATH with paths
['D:\\workspace\\pywebview_example', 'D:\\workspace\\pywebview_example']
433 INFO: checking Analysis
433 INFO: Building Analysis because out00-Analysis.toc is non existent  
433 INFO: Initializing module dependency graph...
437 INFO: Initializing module graph hooks...
446 INFO: Analyzing base_library.zip ...    
3513 INFO: Processing pre-find module path hook   distutils
7466 INFO: running Analysis out00-Analysis.toc
7470 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  required by d:\python38\python.exe
7522 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\python.exe
7571 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\python.exe
7623 WARNING: lib not found: api-ms-win-crt-locale-l1-1-0.dll dependency of d:\python38\python.exe
7672 WARNING: lib not found: api-ms-win-crt-math-l1-1-0.dll dependency of d:\python38\python.exe
7719 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\python.exe
7788 WARNING: lib not found: api-ms-win-crt-locale-l1-1-0.dll dependency of d:\python38\python38.dll
7835 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\python38.dll
7895 WARNING: lib not found: api-ms-win-crt-conio-l1-1-0.dll dependency of d:\python38\python38.dll
7948 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\python38.dll
7998 WARNING: lib not found: api-ms-win-crt-environment-l1-1-0.dll dependency of d:\python38\python38.dll
8077 WARNING: lib not found: api-ms-win-crt-filesystem-l1-1-0.dll dependency of d:\python38\python38.dll
8161 WARNING: lib not found: api-ms-win-crt-time-l1-1-0.dll dependency of d:\python38\python38.dll
8228 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\python38.dll
8288 WARNING: lib not found: api-ms-win-crt-process-l1-1-0.dll dependency of d:\python38\python38.dll
8349 WARNING: lib not found: api-ms-win-crt-convert-l1-1-0.dll dependency of d:\python38\python38.dll
8412 WARNING: lib not found: api-ms-win-crt-math-l1-1-0.dll dependency of d:\python38\python38.dll
8469 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\python38.dll
8523 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\VCRUNTIME140.dll
8573 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\VCRUNTIME140.dll
8622 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\VCRUNTIME140.dll
8671 WARNING: lib not found: api-ms-win-crt-convert-l1-1-0.dll dependency of d:\python38\VCRUNTIME140.dll
8719 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\VCRUNTIME140.dll
8721 INFO: Caching module hooks...
8727 INFO: Analyzing D:\workspace\pywebview_example\basic.py
9301 INFO: Loading module hooks...
9301 INFO: Loading module hook &quot;hook-clr.py&quot;...
9306 INFO: Loading module hook &quot;hook-distutils.py&quot;...
9310 INFO: Loading module hook &quot;hook-encodings.py&quot;...
9422 INFO: Loading module hook &quot;hook-lib2to3.py&quot;...
9435 INFO: Loading module hook &quot;hook-pydoc.py&quot;...
9437 INFO: Loading module hook &quot;hook-sysconfig.py&quot;...
9439 INFO: Loading module hook &quot;hook-xml.etree.cElementTree.py&quot;...
9441 INFO: Loading module hook &quot;hook-xml.py&quot;...
9537 INFO: Loading module hook &quot;hook-_tkinter.py&quot;...
9621 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\_tkinter.pyd
9675 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_tkinter.pyd
9739 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_tkinter.pyd
9967 INFO: checking Tree
9968 INFO: Building Tree because out00-Tree.toc is non existent
9968 INFO: Building Tree out00-Tree.toc
10083 INFO: checking Tree
10083 INFO: Building Tree because out01-Tree.toc is non existent
10084 INFO: Building Tree out01-Tree.toc
10116 INFO: Looking for ctypes DLLs
10184 INFO: Analyzing run-time hooks ...
10190 INFO: Including run-time hook 'pyi_rth_multiprocessing.py'
10201 INFO: Including run-time hook 'pyi_rth__tkinter.py'
10216 INFO: Looking for dynamic libraries
10279 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\_ssl.pyd
10348 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_ssl.pyd
10405 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_ssl.pyd
10460 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\_elementtree.pyd
10511 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_elementtree.pyd
10562 WARNING: lib not found: api-ms-win-crt-environment-l1-1-0.dll dependency of d:\python38\DLLs\_elementtree.pyd
10612 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\DLLs\_elementtree.pyd
10665 WARNING: lib not found: api-ms-win-crt-utility-l1-1-0.dll dependency of d:\python38\DLLs\_elementtree.pyd
10718 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_elementtree.pyd
10786 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_multiprocessing.pyd
10844 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32api.pyd
10894 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32api.pyd
10949 WARNING: lib not found: pywintypes38.dll dependency of d:\python38\lib\site-packages\win32\win32api.pyd
10996 WARNING: lib not found: api-ms-win-crt-convert-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32api.pyd
11049 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32api.pyd
11122 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32evtlog.pyd
11172 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32evtlog.pyd
11228 WARNING: lib not found: pywintypes38.dll dependency of d:\python38\lib\site-packages\win32\win32evtlog.pyd
11278 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32evtlog.pyd
11333 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\pyexpat.pyd
11386 WARNING: lib not found: api-ms-win-crt-environment-l1-1-0.dll dependency of d:\python38\DLLs\pyexpat.pyd
11433 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\DLLs\pyexpat.pyd
11487 WARNING: lib not found: api-ms-win-crt-utility-l1-1-0.dll dependency of d:\python38\DLLs\pyexpat.pyd
11535 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\pyexpat.pyd
11589 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\_ctypes.pyd
11645 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_ctypes.pyd
11699 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_ctypes.pyd
11755 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\_tkinter.pyd
11806 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_tkinter.pyd
11867 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_tkinter.pyd
11930 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\_testcapi.pyd
11986 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_testcapi.pyd
12036 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\_decimal.pyd
12101 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_decimal.pyd
12152 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\DLLs\_decimal.pyd
12201 WARNING: lib not found: api-ms-win-crt-convert-l1-1-0.dll dependency of d:\python38\DLLs\_decimal.pyd
12253 WARNING: lib not found: api-ms-win-crt-locale-l1-1-0.dll dependency of d:\python38\DLLs\_decimal.pyd
12301 WARNING: lib not found: api-ms-win-crt-math-l1-1-0.dll dependency of d:\python38\DLLs\_decimal.pyd
12354 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_decimal.pyd
12407 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_queue.pyd
12464 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_asyncio.pyd
12518 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_overlapped.pyd
12572 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_overlapped.pyd
12621 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\_bz2.pyd
12672 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_bz2.pyd
12722 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\DLLs\_bz2.pyd
12770 WARNING: lib not found: api-ms-win-crt-math-l1-1-0.dll dependency of d:\python38\DLLs\_bz2.pyd
12823 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_bz2.pyd
12878 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\DLLs\_lzma.pyd
12926 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_lzma.pyd
12982 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_hashlib.pyd
13031 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_hashlib.pyd
13090 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\_socket.pyd
13140 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\_socket.pyd
13193 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\unicodedata.pyd
13245 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\unicodedata.pyd
13294 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\unicodedata.pyd
13357 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\select.pyd
13442 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32wnet.pyd
13491 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32wnet.pyd
13540 WARNING: lib not found: pywintypes38.dll dependency of d:\python38\lib\site-packages\win32\win32wnet.pyd
13591 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\lib\site-packages\win32\win32wnet.pyd
13647 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\libssl-1_1.dll
13698 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\libssl-1_1.dll
13751 WARNING: lib not found: api-ms-win-crt-time-l1-1-0.dll dependency of d:\python38\DLLs\libssl-1_1.dll
13798 WARNING: lib not found: api-ms-win-crt-utility-l1-1-0.dll dependency of d:\python38\DLLs\libssl-1_1.dll
13850 WARNING: lib not found: api-ms-win-crt-convert-l1-1-0.dll dependency of d:\python38\DLLs\libssl-1_1.dll
13902 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\libssl-1_1.dll
13973 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\libcrypto-1_1.dll
14028 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\libcrypto-1_1.dll
14078 WARNING: lib not found: api-ms-win-crt-filesystem-l1-1-0.dll dependency of d:\python38\DLLs\libcrypto-1_1.dll
14128 WARNING: lib not found: api-ms-win-crt-environment-l1-1-0.dll dependency of d:\python38\DLLs\libcrypto-1_1.dll
14176 WARNING: lib not found: api-ms-win-crt-time-l1-1-0.dll dependency of d:\python38\DLLs\libcrypto-1_1.dll
14226 WARNING: lib not found: api-ms-win-crt-utility-l1-1-0.dll dependency of d:\python38\DLLs\libcrypto-1_1.dll
14278 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\DLLs\libcrypto-1_1.dll
14335 WARNING: lib not found: api-ms-win-crt-convert-l1-1-0.dll dependency of d:\python38\DLLs\libcrypto-1_1.dll
14385 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\libcrypto-1_1.dll
14440 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\libffi-7.dll
14500 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\tk86t.dll
14556 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\tk86t.dll
14608 WARNING: lib not found: api-ms-win-crt-time-l1-1-0.dll dependency of d:\python38\DLLs\tk86t.dll
14657 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\DLLs\tk86t.dll
14706 WARNING: lib not found: api-ms-win-crt-utility-l1-1-0.dll dependency of d:\python38\DLLs\tk86t.dll
14765 WARNING: lib not found: api-ms-win-crt-convert-l1-1-0.dll dependency of d:\python38\DLLs\tk86t.dll
14813 WARNING: lib not found: api-ms-win-crt-math-l1-1-0.dll dependency of d:\python38\DLLs\tk86t.dll
14865 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\tk86t.dll
14935 WARNING: lib not found: api-ms-win-crt-stdio-l1-1-0.dll dependency of d:\python38\DLLs\tcl86t.dll
14991 WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency of d:\python38\DLLs\tcl86t.dll
15040 WARNING: lib not found: api-ms-win-crt-environment-l1-1-0.dll dependency of d:\python38\DLLs\tcl86t.dll
15087 WARNING: lib not found: api-ms-win-crt-time-l1-1-0.dll dependency of d:\python38\DLLs\tcl86t.dll
15137 WARNING: lib not found: api-ms-win-crt-utility-l1-1-0.dll dependency of d:\python38\DLLs\tcl86t.dll
15190 WARNING: lib not found: api-ms-win-crt-heap-l1-1-0.dll dependency of d:\python38\DLLs\tcl86t.dll
15244 WARNING: lib not found: api-ms-win-crt-convert-l1-1-0.dll dependency of d:\python38\DLLs\tcl86t.dll
15298 WARNING: lib not found: api-ms-win-crt-math-l1-1-0.dll dependency of d:\python38\DLLs\tcl86t.dll
15349 WARNING: lib not found: api-ms-win-crt-runtime-l1-1-0.dll dependency of d:\python38\DLLs\tcl86t.dll
15350 INFO: Looking for eggs
15351 INFO: Using Python library d:\python38\python38.dll
15352 INFO: Found binding redirects:
[]
15358 INFO: Warnings written to D:\workspace\pywebview_example\build\basic\warnbasic.txt
15413 INFO: Graph cross-reference written to D:\workspace\pywebview_example\build\basic\xref-basic.html
15467 INFO: checking PYZ
15468 INFO: Building PYZ because out00-PYZ.toc is non existent
15469 INFO: Building PYZ (ZlibArchive) D:\workspace\pywebview_example\build\basic\out00-PYZ.pyz
Traceback (most recent call last):
    sys.exit(load_entry_point('PyInstaller==3.3.1', 'console_scripts', 'pyinstaller')())
  File &quot;d:\python38\lib\site-packages\PyInstaller\__main__.py&quot;, line 94, in run
    run_build(pyi_config, spec_file, **vars(args))
  File &quot;d:\python38\lib\site-packages\PyInstaller\__main__.py&quot;, line 46, in run_build
  File &quot;d:\python38\lib\site-packages\PyInstaller\building\build_main.py&quot;, line 791, in main
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
  File &quot;d:\python38\lib\site-packages\PyInstaller\building\build_main.py&quot;, line 737, in build
    exec(text, spec_namespace)
  File &quot;&amp;lt;string&amp;gt;&quot;, line 17, in &amp;lt;module&amp;gt;
  File &quot;d:\python38\lib\site-packages\PyInstaller\building\api.py&quot;, line 98, in __init__
    self.__postinit__()
  File &quot;d:\python38\lib\site-packages\PyInstaller\building\datastruct.py&quot;, line 161, in __postinit__
    self.assemble()
  File &quot;d:\python38\lib\site-packages\PyInstaller\building\api.py&quot;, line 128, in assemble
    self.code_dict = {
  File &quot;d:\python38\lib\site-packages\PyInstaller\building\api.py&quot;, line 129, in &amp;lt;dictcomp&amp;gt;
    key: strip_paths_in_code(code)
  File &quot;d:\python38\lib\site-packages\PyInstaller\building\utils.py&quot;, line 624, in strip_paths_in_code
    consts = tuple(
  File &quot;d:\python38\lib\site-packages\PyInstaller\building\utils.py&quot;, line 625, in &amp;lt;genexpr&amp;gt;
    strip_paths_in_code(const_co, new_filename)
  File &quot;d:\python38\lib\site-packages\PyInstaller\building\utils.py&quot;, line 632, in strip_paths_in_code
    return code_func(co.co_argcount, co.co_kwonlyargcount, co.co_nlocals, co.co_stacksize,
TypeError: an integer is required (got type bytes)
PS D:\workspace\pywebview_example&amp;gt;&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;[pyinstaller 업데이트 후 문제 해결]&lt;/p&gt;
&lt;pre id=&quot;code_1631340005335&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\pywebview_example&amp;gt; pyinstaller .\basic.py
132 INFO: PyInstaller: 4.5.1
132 INFO: Python: 3.8.10
169 INFO: Platform: Windows-10-10.0.19043-SP0
171 INFO: wrote D:\workspace\pywebview_example\basic.spec
174 INFO: UPX is not available.
179 INFO: Extending PYTHONPATH with paths
['D:\\workspace\\pywebview_example', 'D:\\workspace\\pywebview_example']
566 INFO: checking Analysis
567 INFO: Building Analysis because Analysis-00.toc is non existent
567 INFO: Initializing module dependency graph...
569 INFO: Caching module graph hooks...
595 INFO: Analyzing base_library.zip ...
2841 INFO: Processing pre-find module path hook distutils from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks\\pre_find_module_path\\hook-distutils.py'.
2844 INFO: distutils: retargeting to non-venv dir 'd:\\python38\\lib'
5256 INFO: Caching module dependency graph...
5445 INFO: running Analysis Analysis-00.toc
5460 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  required by d:\python38\python.exe
5546 INFO: Analyzing D:\workspace\pywebview_example\basic.py
5920 INFO: Processing module hooks...
5920 INFO: Loading module hook 'hook-clr.py' from 'd:\\python38\\lib\\site-packages\\_pyinstaller_hooks_contrib\\hooks\\stdhooks'...
5936 INFO: Loading module hook 'hook-webview.py' from 'd:\\python38\\lib\\site-packages\\_pyinstaller_hooks_contrib\\hooks\\stdhooks'...
5953 INFO: Loading module hook 'hook-difflib.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
5956 INFO: Loading module hook 'hook-distutils.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
5959 INFO: Loading module hook 'hook-distutils.util.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
5962 INFO: Loading module hook 'hook-encodings.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
6076 INFO: Loading module hook 'hook-heapq.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
6078 INFO: Loading module hook 'hook-lib2to3.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
6197 INFO: Loading module hook 'hook-multiprocessing.util.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
6199 INFO: Loading module hook 'hook-pickle.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
6202 INFO: Loading module hook 'hook-sysconfig.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
6203 INFO: Loading module hook 'hook-xml.etree.cElementTree.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
6205 INFO: Loading module hook 'hook-xml.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
6273 INFO: Loading module hook 'hook-_tkinter.py' from 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks'...
6451 INFO: checking Tree
6453 INFO: Building Tree because Tree-00.toc is non existent
6453 INFO: Building Tree Tree-00.toc
6518 INFO: checking Tree
6519 INFO: Building Tree because Tree-01.toc is non existent
6519 INFO: Building Tree Tree-01.toc
6637 INFO: checking Tree
6638 INFO: Building Tree because Tree-02.toc is non existent
6638 INFO: Building Tree Tree-02.toc
6652 INFO: Looking for ctypes DLLs
6678 INFO: Analyzing run-time hooks ...
6683 INFO: Including run-time hook 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py'
6687 INFO: Including run-time hook 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py'
6690 INFO: Including run-time hook 'd:\\python38\\lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py'
6699 INFO: Looking for dynamic libraries
7207 INFO: Looking for eggs
7207 INFO: Using Python library d:\python38\python38.dll
7207 INFO: Found binding redirects:
[]
7211 INFO: Warnings written to D:\workspace\pywebview_example\build\basic\warn-basic.txt
7266 INFO: Graph cross-reference written to D:\workspace\pywebview_example\build\basic\xref-basic.html
7283 INFO: checking PYZ
7284 INFO: Building PYZ because PYZ-00.toc is non existent
7285 INFO: Building PYZ (ZlibArchive) D:\workspace\pywebview_example\build\basic\PYZ-00.pyz
7843 INFO: Building PYZ (ZlibArchive) D:\workspace\pywebview_example\build\basic\PYZ-00.pyz completed successfully.
7856 INFO: checking PKG
7858 INFO: Building PKG because PKG-00.toc is non existent
7858 INFO: Building PKG (CArchive) PKG-00.pkg
7905 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
7907 INFO: Bootloader d:\python38\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
7908 INFO: checking EXE
7909 INFO: Building EXE because EXE-00.toc is non existent
7909 INFO: Building EXE from EXE-00.toc
7987 INFO: Copying icons from ['d:\\python38\\lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico']
8050 INFO: Writing RT_GROUP_ICON 0 resource with 104 bytes
8050 INFO: Writing RT_ICON 1 resource with 3752 bytes
8050 INFO: Writing RT_ICON 2 resource with 2216 bytes
8051 INFO: Writing RT_ICON 3 resource with 1384 bytes
8051 INFO: Writing RT_ICON 4 resource with 37019 bytes
8051 INFO: Writing RT_ICON 5 resource with 9640 bytes
8051 INFO: Writing RT_ICON 6 resource with 4264 bytes
8053 INFO: Writing RT_ICON 7 resource with 1128 bytes
8059 INFO: Appending archive to EXE D:\workspace\pywebview_example\build\basic\basic.exe
8669 INFO: Building EXE from EXE-00.toc completed successfully.
8673 INFO: checking COLLECT
8674 INFO: Building COLLECT because COLLECT-00.toc is non existent
8675 INFO: Building COLLECT COLLECT-00.toc
9441 INFO: Building COLLECT COLLECT-00.toc completed successfully.
PS D:\workspace\pywebview_example&amp;gt;&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;</description>
      <category>Language/Python</category>
      <category>pyinstaller</category>
      <category>upgrade</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/378</guid>
      <comments>https://mytechmemo.tistory.com/378#entry378comment</comments>
      <pubDate>Sat, 11 Sep 2021 15:04:00 +0900</pubDate>
    </item>
    <item>
      <title>[GIT] 이메일/이름 설정 - git config</title>
      <link>https://mytechmemo.tistory.com/377</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;git commit 시 user.email, user.name 이 설정되어 있지 않으면 에러가 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 따라 git config 를 통해 설정이 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1631321372116&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  &amp;gt; git config --global user.email &quot;you@example.com&quot;
  &amp;gt; git config --global user.name &quot;Your Name&quot;&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1631321515932&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; git config credential.helper store&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[설정 후 임시로 저장, 별도 인자가 없을 경우 15분]&lt;/p&gt;
&lt;pre id=&quot;code_1631321590348&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; git config credential.helper cache
&amp;gt; git config credential.helper 'cache --timeout=3600'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[저장한 credential 삭제]&lt;/p&gt;
&lt;pre id=&quot;code_1631321881260&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; git config --unset-all credential.helper&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1631321270654&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email &quot;you@example.com&quot;
  git config --global user.name &quot;Your Name&quot;

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: no email was given and auto-detection is disabled
&amp;gt; git config --get-all user.name
&amp;gt; git ls-files --stage -- D:\workspace\pyupdater-example\basic.py
&amp;gt; git cat-file -s 80e224de334bce67761204184809ecc88d9b1386
&amp;gt; git show --textconv :basic.py
&amp;gt; git status -z -u
&amp;gt; git ls-files --stage -- D:\workspace\pyupdater-example\basic.py
&amp;gt; git symbolic-ref --short HEAD
&amp;gt; git cat-file -s 80e224de334bce67761204184809ecc88d9b1386
&amp;gt; git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track) refs/heads/main refs/remotes/main
&amp;gt; git show --textconv :basic.py
&amp;gt; git for-each-ref --sort -committerdate --format %(refname) %(objectname) %(*objectname)
&amp;gt; git remote --verbose
Warning: Failed to watch ref 'd:\workspace\pyupdater-example\.git\refs\remotes\origin\main', is most likely packed.
&amp;gt; git config --get commit.template&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;</description>
      <category>Credential</category>
      <category>git</category>
      <category>store</category>
      <category>unset</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/377</guid>
      <comments>https://mytechmemo.tistory.com/377#entry377comment</comments>
      <pubDate>Sat, 11 Sep 2021 09:59:29 +0900</pubDate>
    </item>
    <item>
      <title>[pywebview] python 을 이용한 webview</title>
      <link>https://mytechmemo.tistory.com/376</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) pywebview 설치&lt;/p&gt;
&lt;pre id=&quot;code_1631320857880&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; pip install pywebview&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;278&quot; data-filename=&quot;0.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ujnQA/btreKxwF7aI/gTiCDkEVoYdRhQT12lUgBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ujnQA/btreKxwF7aI/gTiCDkEVoYdRhQT12lUgBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ujnQA/btreKxwF7aI/gTiCDkEVoYdRhQT12lUgBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FujnQA%2FbtreKxwF7aI%2FgTiCDkEVoYdRhQT12lUgBk%2Fimg.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;278&quot; data-filename=&quot;0.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&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;2) 기본 코드 작성&lt;/p&gt;
&lt;pre id=&quot;code_1631323433240&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import webview

webview.create_window('TechNote', 'https://technote.kr')
webview.start()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/TechNoteGit/pywebview_example/commit/7e5b550912c26fa6c7237dbd12ae047cfc5f45b5&quot;&gt;Basic webview implementation &amp;middot; TechNoteGit/pywebview_example@7e5b550 (github.com)&lt;/a&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;3) 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;593&quot; data-filename=&quot;1.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dADGtE/btreIVFEH9W/lXkCDMI4eiml0cw6RhBeb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dADGtE/btreIVFEH9W/lXkCDMI4eiml0cw6RhBeb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dADGtE/btreIVFEH9W/lXkCDMI4eiml0cw6RhBeb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdADGtE%2FbtreIVFEH9W%2FlXkCDMI4eiml0cw6RhBeb1%2Fimg.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;593&quot; data-filename=&quot;1.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>pywebview</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/376</guid>
      <comments>https://mytechmemo.tistory.com/376#entry376comment</comments>
      <pubDate>Sat, 11 Sep 2021 09:42:32 +0900</pubDate>
    </item>
    <item>
      <title>Python - pipenv 설정 및 사용</title>
      <link>https://mytechmemo.tistory.com/375</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기본 python 환경과 별도로 사용할 수 있는 가상 환경 제공&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;원하는 python 버전을 설정하여 사용&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해당 가상 환경만을 위한 python library 를 설치&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pipfile, Pipfile.lock (pip 설정 파일) 을 기반으로 python library 일괄 설치&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;pyinstaller 사용하여 변환시 꼭 필요한 library 만으로 최적화 변환 :&lt;/b&gt;&lt;br /&gt;pipenv 없이 pyinstaller로 exe 실행 환경 생성할 경우 기본 python 환경에서 수행시 설치된 python library 를 기준으로 생성하기 때문에 불필요한 library 들로 인해 변환 용량이 커짐. pipenv 를 사용하여 필요한 library 만 설치한 환경 이용시 최적화하여 변환 가능.&lt;/li&gt;
&lt;/ul&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;pipenv Github : &lt;a href=&quot;https://github.com/pypa/pipenv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/pypa/pipenv&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pipenv pypi : &lt;a href=&quot;https://pypi.org/project/pipenv/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pypi.org/project/pipenv&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;pipenv 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1624796751883&quot; class=&quot;shell&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\cef-pywebview&amp;gt; pip install pipenv 
Collecting pipenv
..........
Installing collected packages: six, filelock, distlib, appdirs, virtualenv-clone, virtualenv, certifi, pipenv
Successfully installed appdirs-1.4.4 certifi-2021.5.30 distlib-0.3.2 filelock-3.0.12 pipenv-2021.5.29 six-1.16.0 virtualenv-20.4.7 virtualenv-clone-0.5.4
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pipenv 는 pip를 이용하여 설치하고 설치시 의존성을 가진 관련 library 들 또한 같이 설치 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가상 환경에서 사용할 python 설정&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1624796919480&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\cef-pywebview&amp;gt; pipenv --python 3.8 
Creating a virtualenv for this project...
Pipfile: D:\workspace\cef-pywebview\Pipfile
Using D:/Python38/python.exe (3.8.10) to create virtualenv...
[=   ] Creating virtual environment...created virtual environment CPython3.8.10.final.0-64 in 4713ms
  creator CPython3Windows(dest=C:\Users\User\.virtualenvs\cef-pywebview-wVQHrn4L, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\User\AppData\Local\pypa\virtualenv)
    added seed packages: pip==21.1.2, setuptools==57.0.0, wheel==0.36.2
  activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

Successfully created virtual environment!
Virtualenv location: C:\Users\User\.virtualenvs\cef-pywebview-wVQHrn4L
Creating a Pipfile for this project...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 환경을 구축할 project 로 경로를 이동한 뒤 pipenv --python 명령으로 사용할 python 버전을 3.8 으로 설정하면 python 3.8 기반으로 가상 환경을 생성한다. 위의 경우 기본 python 환경과 별도로 &quot;C:\Users\User\.virtualenvs\cef-pywebview-wVQHrn4L&quot; 에 가상 환경이 생성되었다.&lt;/p&gt;
&lt;pre id=&quot;code_1624797114377&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\cef-pywebview&amp;gt; pipenv run python --version
Python 3.8.10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령으로 가상환경에서의 python 버전을 확인해보면 앞서 설정한 3.8 인 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pipenv 설정 파일인 Pipfile 이 생성된다.&lt;/p&gt;
&lt;pre id=&quot;code_1624797845353&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[[source]]
url = &quot;https://pypi.org/simple&quot;
verify_ssl = true
name = &quot;pypi&quot;

[packages]

[dev-packages]

[requires]
python_version = &quot;3.8&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가상 환경에서 사용할 python library 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1624797237320&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\cef-pywebview&amp;gt; pipenv install pywebview    
Installing pywebview...
Adding pywebview to Pipfile's [packages]...
Installation Succeeded
Pipfile.lock not found, creating...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
           Building requirements...
Resolving dependencies...
Success!
Updated Pipfile.lock (d1c8a0)!
Installing dependencies from Pipfile.lock (d1c8a0)...
  ================================ 0/0 - 00:00:00&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 pywebview 를 설치할 경우 pipenv install pywebview 명령을 통해 설치하게 된다. 기본 python library 와는 별도로 해당 가상 환경을 위해서만 설치한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1624797659393&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Users\User\.virtualenvs\cef-pywebview-wVQHrn4L\Lib\site-packages\pywebview-3.4.dist-info&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 환경의 기본 경로 하위에 설치된 것을 확인할 수 있고, 가상 환경을 위한 설정 파일인 Pipfile 내에 pywebview 정보가 추가된 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1624797759433&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[[source]]
url = &quot;https://pypi.org/simple&quot;
verify_ssl = true
name = &quot;pypi&quot;

[packages]
pywebview = &quot;*&quot;

[dev-packages]

[requires]
python_version = &quot;3.8&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 설치된 library 는 하기와 같이 확인 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1624798147232&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\cef-pywebview&amp;gt; pipenv graph
pipenv==2021.5.29
  - certifi [required: Any, installed: 2021.5.30]
  - pip [required: &amp;gt;=18.0, installed: 21.1.2]
  - setuptools [required: &amp;gt;=36.2.1, installed: 57.0.0]
  - virtualenv [required: Any, installed: 20.4.7]
    - appdirs [required: &amp;gt;=1.4.3,&amp;lt;2, installed: 1.4.4]
    - distlib [required: &amp;gt;=0.3.1,&amp;lt;1, installed: 0.3.2]
    - filelock [required: &amp;gt;=3.0.0,&amp;lt;4, installed: 3.0.12]
    - six [required: &amp;gt;=1.9.0,&amp;lt;2, installed: 1.16.0]
  - virtualenv-clone [required: &amp;gt;=0.2.5, installed: 0.5.4]
pywebview==3.4
  - pythonnet [required: Any, installed: 2.5.2]
    - pycparser [required: Any, installed: 2.20]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가상 환경에서 python 코드 실행&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1624797970080&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(&quot;Hello, PIPENV&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 내용으로 main.py 를 작성한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1624798001128&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\cef-pywebview&amp;gt; pipenv run main.py
Hello, PIPENV&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pipenv run main.py 명령을 통해 위와 같이 가상 환경 내에서 python code 가 실행되는 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가상 환경 내로 진입&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1624798453522&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\cef-pywebview&amp;gt; pipenv shell
Launching subshell in virtual environment...
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

새로운 크로스 플랫폼 PowerShell 사용 https://aka.ms/pscore6

PS D:\workspace\cef-pywebview&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pipenv shell 명령을 통해 가상 환경 속으로 진입할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1624798482009&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\cef-pywebview&amp;gt; exit
PS D:\workspace\cef-pywebview&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 환경으로 복귀하려면 exit 를 하면 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;pyinstaller 를 이용한 가상 환경 python 코드 exe 변환&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1624798814387&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\workspace\cef-pywebview&amp;gt; pipenv run pyinstaller main.py
97 INFO: PyInstaller: 4.3
98 INFO: Python: 3.8.10
129 INFO: Platform: Windows-10-10.0.19042-SP0
130 INFO: wrote D:\workspace\cef-pywebview\main.spec
132 INFO: UPX is not available.
139 INFO: Extending PYTHONPATH with paths
['D:\\workspace\\cef-pywebview', 'D:\\workspace\\cef-pywebview']
150 INFO: checking Analysis
.....
8994 INFO: Appending archive to EXE D:\workspace\cef-pywebview\build\main\main.exe
10125 INFO: Building EXE from EXE-00.toc completed successfully.
10128 INFO: checking COLLECT
10129 INFO: Building COLLECT because COLLECT-00.toc is non existent
10129 INFO: Building COLLECT COLLECT-00.toc
10791 INFO: Building COLLECT COLLECT-00.toc completed successfully.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pipenv 를 통해 pyinstaller를 사용할 경우 가상 환경에 설치된 library 만을 사용하여 변환하기 때문에 꼭 필요한 코드들만 포함하여 exe 실행 환경으로 변환할 수 있다. (즉, 불필요하게 용량이 커지지 않는다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pipenv run pyinstaller main.py 와 같이 가상 환경 내에서 변환해주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>library</category>
      <category>pip</category>
      <category>pipenv</category>
      <category>pyinstaller</category>
      <category>pyupdater</category>
      <category>virtualenv</category>
      <category>가상 환경</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/375</guid>
      <comments>https://mytechmemo.tistory.com/375#entry375comment</comments>
      <pubDate>Sun, 27 Jun 2021 22:02:01 +0900</pubDate>
    </item>
    <item>
      <title>[VSCODE] Project 관리 (Project Manager Extension)</title>
      <link>https://mytechmemo.tistory.com/374</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;151&quot; data-origin-height=&quot;135&quot; data-filename=&quot;5.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6C1B7/btq8cPXQWxg/lGclWYwEuoPo1gHH1PXIu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6C1B7/btq8cPXQWxg/lGclWYwEuoPo1gHH1PXIu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6C1B7/btq8cPXQWxg/lGclWYwEuoPo1gHH1PXIu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6C1B7%2Fbtq8cPXQWxg%2FlGclWYwEuoPo1gHH1PXIu0%2Fimg.png&quot; data-origin-width=&quot;151&quot; data-origin-height=&quot;135&quot; data-filename=&quot;5.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 프로젝트를 동시에 진행하다 보면 작업 도중 여러 project 의 코드들을 왔다 갔다 해야 하는 경우가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vs code 상에서 project 간 이동을 편리하게 해주는 &quot;Project Manager&quot; extention이 있어 이를 사용하면 손쉽게 프로젝트간 이동을 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC 내에 임의의 폴더를 수동으로 등록하여 project 로 인식하게 할 수도 있고, git, mercurial, svn 등으로 sync 한 project 들을 자동으로 인식하게 할 수도 있다.&amp;nbsp;&lt;/p&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 style=&quot;width: 100%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Save any folder or workspace as a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Project&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Auto-detect&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Git&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Mercurial&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;or&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;SVN&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;repositiories&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;204&quot; data-filename=&quot;0.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oCqna/btq8bsXs9nh/lxYykW1vfe39hKqINRFHv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oCqna/btq8bsXs9nh/lxYykW1vfe39hKqINRFHv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oCqna/btq8bsXs9nh/lxYykW1vfe39hKqINRFHv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoCqna%2Fbtq8bsXs9nh%2FlxYykW1vfe39hKqINRFHv0%2Fimg.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;204&quot; data-filename=&quot;0.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Extension tab 에서 &quot;Project Manager&quot;를 검색하여 install 하면 왼쪽 side bar 에 &quot;Project Manager&quot; tab 이 생성된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;467&quot; data-filename=&quot;1.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjRO7V/btq8ft00a7Z/Hvh2Dy9bIX7U2Ma4LeI491/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjRO7V/btq8ft00a7Z/Hvh2Dy9bIX7U2Ma4LeI491/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjRO7V/btq8ft00a7Z/Hvh2Dy9bIX7U2Ma4LeI491/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjRO7V%2Fbtq8ft00a7Z%2FHvh2Dy9bIX7U2Ma4LeI491%2Fimg.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;467&quot; data-filename=&quot;1.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Porject Manager: Save Project&quot; 버튼을 누르면 현재 작업 중인 folder/workspace 를 가르킬 project 이름을 입력하게 되고 이 이름으로 해당 folder/workspace가 저장되어 추후 바로 접근할 수 있도록 해준다.&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;&quot;Open Settings&quot; 버튼을 누르면 아래와 같은 설정 화면이 나오는데, git project 를 받아두는 폴더를 기입하면 하위 git project 들이 자동으로 인식된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;257&quot; data-filename=&quot;2.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btd9Ou/btq8bsC9nCG/MnyWctSduSp8eqGwGlhx20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btd9Ou/btq8bsC9nCG/MnyWctSduSp8eqGwGlhx20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btd9Ou/btq8bsC9nCG/MnyWctSduSp8eqGwGlhx20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtd9Ou%2Fbtq8bsC9nCG%2FMnyWctSduSp8eqGwGlhx20%2Fimg.png&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;257&quot; data-filename=&quot;2.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;513&quot; data-filename=&quot;3.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsuuWP/btq8cgoGR6q/FjK816tokfbWNqAKlvTFvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsuuWP/btq8cgoGR6q/FjK816tokfbWNqAKlvTFvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsuuWP/btq8cgoGR6q/FjK816tokfbWNqAKlvTFvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsuuWP%2Fbtq8cgoGR6q%2FFjK816tokfbWNqAKlvTFvK%2Fimg.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;513&quot; data-filename=&quot;3.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;vs code &amp;gt; F1 &amp;gt; project manager 를 입력하면 Project Manager 관련 다양한 동작들을 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;438&quot; data-filename=&quot;4.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7zX1J/btq8cE3Z3n9/Owy2tKLBLjTBxgHtMgeleK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7zX1J/btq8cE3Z3n9/Owy2tKLBLjTBxgHtMgeleK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7zX1J/btq8cE3Z3n9/Owy2tKLBLjTBxgHtMgeleK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7zX1J%2Fbtq8cE3Z3n9%2FOwy2tKLBLjTBxgHtMgeleK%2Fimg.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;438&quot; data-filename=&quot;4.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;vs code &amp;gt; &quot;PROJECT MANAGER&quot; tab &amp;gt; FAVORITES &amp;gt; Edit Projects (아래 빨간 네모) &amp;gt; projects.json&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파일을 바로 수정하여 Project Manager의 설정을 수정할 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;513&quot; data-filename=&quot;6.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZyk7i/btq8bta1tIc/nOsrQ5zx5u1hU0NJ4qRmg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZyk7i/btq8bta1tIc/nOsrQ5zx5u1hU0NJ4qRmg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZyk7i/btq8bta1tIc/nOsrQ5zx5u1hU0NJ4qRmg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZyk7i%2Fbtq8bta1tIc%2FnOsrQ5zx5u1hU0NJ4qRmg0%2Fimg.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;513&quot; data-filename=&quot;6.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/VS Code</category>
      <category>extension</category>
      <category>Project Manager</category>
      <category>VS Code</category>
      <category>프로젝트 관리</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/374</guid>
      <comments>https://mytechmemo.tistory.com/374#entry374comment</comments>
      <pubDate>Sat, 26 Jun 2021 23:42:41 +0900</pubDate>
    </item>
    <item>
      <title>[Windows 11] 지원 사양 및 설치 가능 여부 확인</title>
      <link>https://mytechmemo.tistory.com/373</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;314&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDyBou/btq8cF2O66S/ePkc4C6f1CJKpPTzU5RtGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDyBou/btq8cF2O66S/ePkc4C6f1CJKpPTzU5RtGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDyBou/btq8cF2O66S/ePkc4C6f1CJKpPTzU5RtGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDyBou%2Fbtq8cF2O66S%2FePkc4C6f1CJKpPTzU5RtGk%2Fimg.png&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;314&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;윈도우 11이 발표됨에 따라 윈도우 11 사용이 가능한지 확인하는 다양한 방법이 소개되고 있다. &lt;br /&gt;먼저 지원하는 사양은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;357&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LiqaS/btq8al4EMSU/eLM5hy9q6tcZYaEmRLnJzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LiqaS/btq8al4EMSU/eLM5hy9q6tcZYaEmRLnJzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LiqaS/btq8al4EMSU/eLM5hy9q6tcZYaEmRLnJzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLiqaS%2Fbtq8al4EMSU%2FeLM5hy9q6tcZYaEmRLnJzK%2Fimg.png&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;357&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사양만 보고서 현재 PC 가 지원 가능한지 파악하는 것은 쉽지 않기에 다음과 같은 프로그램을 이용하여 확인할 수도 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;#first&quot;&gt;&lt;span&gt;1) Microsoft 에서 제공하는 PC 상태 검사 프로그램&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/b&gt; Microsoft 에서 공식적으로 제공하는 프로그램이지만 사양을 충족시키지 못하는 부분에 대해 제대로 알려주지 않는다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;#second&quot;&gt;&lt;span&gt;2) Github opensource 로 공개된 프로그램&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;Microsoft 에서 공식적으로 제공하는 PC 상태 검사보다 더 상세히 각 사양에 대해 지원 여부를 표시해 준다. 하지만 공식 프로그램이 아니어서 그런지 프로그램 다운로드/실행시 정말 수행할 것인지 보안 경고 알림 및 권한 요청 알림이 발생한다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;first&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) Microsoft 에서 제공하는 PC 상태 검사 프로그램&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;https://www.microsoft.com/ko-kr/windows/windows-11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://www.microsoft.com/ko-kr/windows/windows-11&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;해당 링크 하단을 보면 &quot;현재 새 Windows 10 PC가 Windows 11 하드웨어 요구 사항을 충족하는지 어떻게 알 수 있나요?&quot; 에 대한 질문이 있고, 그에 대한 답으로 &quot;현재 PC가 최소 요구 사항을 충족하는지 확인하려면 PC 상태 검사 앱을 다운로드하여 실행하세요&quot; 라는 답이 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;138&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZhaCF/btq8duztDRp/Q0Ka6yW8sgP9f47AdGmVyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZhaCF/btq8duztDRp/Q0Ka6yW8sgP9f47AdGmVyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZhaCF/btq8duztDRp/Q0Ka6yW8sgP9f47AdGmVyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZhaCF%2Fbtq8duztDRp%2FQ0Ka6yW8sgP9f47AdGmVyK%2Fimg.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;138&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;PC 상태 검사 앱을 사용하면 아래와 같이 Windows 11 소개와 함께 시스템 요구 사항을 충족하는지 확인이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;896&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biyMwv/btq8c1K3sFj/4AIpa9C7WkiSL6dFFP3XGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biyMwv/btq8c1K3sFj/4AIpa9C7WkiSL6dFFP3XGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biyMwv/btq8c1K3sFj/4AIpa9C7WkiSL6dFFP3XGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiyMwv%2Fbtq8c1K3sFj%2F4AIpa9C7WkiSL6dFFP3XGk%2Fimg.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;896&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;896&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxrfPg/btq8exoXmKH/hf1kuqTTgUSpyrdumEXHyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxrfPg/btq8exoXmKH/hf1kuqTTgUSpyrdumEXHyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxrfPg/btq8exoXmKH/hf1kuqTTgUSpyrdumEXHyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxrfPg%2Fbtq8exoXmKH%2Fhf1kuqTTgUSpyrdumEXHyk%2Fimg.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;896&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;331&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q2ucY/btq8cNfbXh4/kAlnUqv4adQ6K2yhH4Vg20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q2ucY/btq8cNfbXh4/kAlnUqv4adQ6K2yhH4Vg20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q2ucY/btq8cNfbXh4/kAlnUqv4adQ6K2yhH4Vg20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ2ucY%2Fbtq8cNfbXh4%2FkAlnUqv4adQ6K2yhH4Vg20%2Fimg.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;331&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 위와 같이 어떤 부분이 충족되지 못하는지 구체적으로 나오지 않는다.&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;second&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) Github opensource 로 공개된 프로그램&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/rcmaehl/WhyNotWin11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://github.com/rcmaehl/WhyNotWin11&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;위 링크에 opensource 로 프로그램이 공개되어 있다. 하지만 microsoft 에서 공식적으로 제공하지 않는 프로그램이라서 그런지 다운로드 할때, 그리고 실행할 때 정말로 다운로드하고 실행할 것인지 UAC 가 계속 발생한다. &lt;br /&gt;그럼에도 불구하고 실행해보니 다음과 같이 결과를 보여주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;602&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JProx/btq8btopZ5r/HiMe7DEa7oh8TKTQAq7xYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JProx/btq8btopZ5r/HiMe7DEa7oh8TKTQAq7xYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JProx/btq8btopZ5r/HiMe7DEa7oh8TKTQAq7xYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJProx%2Fbtq8btopZ5r%2FHiMe7DEa7oh8TKTQAq7xYk%2Fimg.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;602&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;실행한 PC에서는 &quot;Secure Boot&quot; 와 &quot;TPM Minimum&quot; 을 충족시키지 못한다고 나왔다. &lt;br /&gt;하지만 해당 부분의 경우 BIOS 의 설정을 바꿔 주면 지원할 수 있는 기능이다.&lt;br /&gt;이에 기존에 사용하지 않던 security 관련 설정들을 enable 시켜주고 다시 체크해 보니 아래와 같이 결과를 보여 주었다. &lt;br /&gt;CPU Generation 의 경우 아무래도 microsoft 에서 공식적으로 제공하지 않는 프로그램이다 보니 정보가 충분하지 않아 제대로 결과를 보여주지 못하는 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;602&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JEafb/btq8cGgiY60/nrakWE6v5yMLsu3KnYbh60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JEafb/btq8cGgiY60/nrakWE6v5yMLsu3KnYbh60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JEafb/btq8cGgiY60/nrakWE6v5yMLsu3KnYbh60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJEafb%2Fbtq8cGgiY60%2FnrakWE6v5yMLsu3KnYbh60%2Fimg.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;602&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>OS/Windows</category>
      <category>Secure Boot</category>
      <category>tpm</category>
      <category>Windows 11</category>
      <category>사양</category>
      <category>윈도우 11</category>
      <category>최소</category>
      <category>확인</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/373</guid>
      <comments>https://mytechmemo.tistory.com/373#entry373comment</comments>
      <pubDate>Sat, 26 Jun 2021 22:50:39 +0900</pubDate>
    </item>
    <item>
      <title>[Docker][해결방법] WARNING: apt does not have a stable CLI interface. Use with caution in scripts.</title>
      <link>https://mytechmemo.tistory.com/372</link>
      <description>&lt;p&gt;Dockerfile 내에서 apt 를 사용하면 &quot;WARNING: apt does not have a stable CLI interface. Use with caution in scripts.&quot; 문구가 출력된다.&lt;/p&gt;
&lt;p&gt;apt 명령어의 경우 사용자와의 interaction 에 중점을 둔 CLI 이기에 script 내에서 사용하기에 부적절하다는 에러로 apt-get 등의 명령어로 대체하여 사용하면 된다.&lt;/p&gt;
&lt;p&gt;apt 명령어별 대체 CLI는 apt의 manpage 에서 확인 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1613886313973&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;update (apt-get(8))
upgrade (apt-get(8))
full-upgrade (apt-get(8))
install, reinstall, remove, purge (apt-get(8))
autoremove (apt-get(8))
satisfy (apt-get(8))
search (apt-cache(8))
show (apt-cache(8))&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;[에러 발생 상황]&lt;/p&gt;
&lt;pre id=&quot;code_1613886017893&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM ubuntu:16.04

RUN apt update
RUN apt install -y cron&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1613885974878&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~/docker/example1$ docker image build --no-cache -t example/test:latest .
Sending build context to Docker daemon   5.12kB
Step 1/3 : FROM ubuntu:16.04
 ---&amp;gt; 8185511cd5ad
Step 2/3 : RUN apt update
 ---&amp;gt; Running in dba486734465

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://security.ubuntu.com/ubuntu xenial-security InRelease [109 kB]
Get:3 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [1928 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
Get:5 http://archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]
Get:6 http://archive.ubuntu.com/ubuntu xenial/main amd64 Packages [1558 kB]
Get:7 http://archive.ubuntu.com/ubuntu xenial/restricted amd64 Packages [14.1 kB]
Get:8 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages [9827 kB]
Get:9 http://security.ubuntu.com/ubuntu xenial-security/restricted amd64 Packages [15.9 kB]
Get:10 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages [984 kB]
Get:11 http://security.ubuntu.com/ubuntu xenial-security/multiverse amd64 Packages [8820 B]
Get:12 http://archive.ubuntu.com/ubuntu xenial/multiverse amd64 Packages [176 kB]
Get:13 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [2434 kB]
Get:14 http://archive.ubuntu.com/ubuntu xenial-updates/restricted amd64 Packages [16.4 kB]
Get:15 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages [1541 kB]
Get:16 http://archive.ubuntu.com/ubuntu xenial-updates/multiverse amd64 Packages [26.2 kB]
Get:17 http://archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages [10.9 kB]
Get:18 http://archive.ubuntu.com/ubuntu xenial-backports/universe amd64 Packages [12.6 kB]
Fetched 19.1 MB in 5s (3283 kB/s)
Reading package lists...
Building dependency tree...
Reading state information...
All packages are up to date.
Removing intermediate container dba486734465
 ---&amp;gt; 83c1dc63dee6
Step 3/3 : RUN apt install -y cron
 ---&amp;gt; Running in 32f6502dbccc

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Reading package lists...
Building dependency tree...
Reading state information...
Suggested packages:
  anacron logrotate checksecurity exim4 | postfix | mail-transport-agent
The following NEW packages will be installed:
  cron
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 68.4 kB of archives.
After this operation, 249 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 cron amd64 3.0pl1-128ubuntu2 [68.4 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 68.4 kB in 1s (55.1 kB/s)
Selecting previously unselected package cron.
(Reading database ... 4780 files and directories currently installed.)
Preparing to unpack .../cron_3.0pl1-128ubuntu2_amd64.deb ...
Unpacking cron (3.0pl1-128ubuntu2) ...
Processing triggers for systemd (229-4ubuntu21.29) ...
Setting up cron (3.0pl1-128ubuntu2) ...
Adding group `crontab' (GID 106) ...
Done.
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
update-rc.d: warning: stop runlevel arguments (1) do not match cron Default-Stop values (none)
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Processing triggers for systemd (229-4ubuntu21.29) ...
Removing intermediate container 32f6502dbccc
 ---&amp;gt; 044f4f53cc11
Successfully built 044f4f53cc11
Successfully tagged example/test:latest

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Screenshot from 2021-02-21 14-37-49.png&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;961&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p60mB/btqX1n4QEiL/Bndkjip9KNI8RTmAymWLXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p60mB/btqX1n4QEiL/Bndkjip9KNI8RTmAymWLXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p60mB/btqX1n4QEiL/Bndkjip9KNI8RTmAymWLXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp60mB%2FbtqX1n4QEiL%2FBndkjip9KNI8RTmAymWLXK%2Fimg.png&quot; data-filename=&quot;Screenshot from 2021-02-21 14-37-49.png&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;961&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/Docker</category>
      <category>apt</category>
      <category>Dockerfile</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/372</guid>
      <comments>https://mytechmemo.tistory.com/372#entry372comment</comments>
      <pubDate>Sun, 21 Feb 2021 14:45:56 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] docker image - Docker 이미지 관리 명령어</title>
      <link>https://mytechmemo.tistory.com/371</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;docker image 명령어 목록&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613456922985&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~$ docker image --help

Usage:  docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

Run 'docker image COMMAND --help' for more information on a command.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;402&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cENIUm/btqXBXkR9oa/Ds6wxSlQC1knDIuC9nuAdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cENIUm/btqXBXkR9oa/Ds6wxSlQC1knDIuC9nuAdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cENIUm/btqXBXkR9oa/Ds6wxSlQC1knDIuC9nuAdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcENIUm%2FbtqXBXkR9oa%2FDs6wxSlQC1knDIuC9nuAdk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;402&quot; data-ke-mobilestyle=&quot;widthContent&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;/&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&gt;&lt;b&gt;Docker 이미지 빌드 :&lt;br /&gt;Dockerfile을 기반으로 docker 이미지를 빌드한다.&amp;nbsp;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;$ docker image build -t &quot;Image 이름&quot; &quot;Dockerfile 경로&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613457183056&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~/docker$ docker image ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
technote@TechNote:~/docker$ docker image build -t my-test-app .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM python:3
3: Pulling from library/python
0ecb575e629c: Pull complete 
7467d1831b69: Pull complete 
feab2c490a3c: Pull complete 
f15a0f46f8c3: Pull complete 
937782447ff6: Pull complete 
e78b7aaaab2c: Pull complete 
06c4d8634a1a: Pull complete 
42b6aa65d161: Pull complete 
f7fc0748308d: Pull complete 
Digest: sha256:ca8bd3c91af8b12c2d042ade99f7c8f578a9f80a0dbbd12ed261eeba96dd632f
Status: Downloaded newer image for python:3
 ---&amp;gt; 2a93c239d591
Step 2/3 : COPY main.py ./
 ---&amp;gt; 77da3887c4b1
Step 3/3 : CMD [&quot;python3&quot;, &quot;./main.py&quot;]
 ---&amp;gt; Running in d3cc2e0c5522
Removing intermediate container d3cc2e0c5522
 ---&amp;gt; ca344f358767
Successfully built ca344f358767
Successfully tagged my-test-app:latest
technote@TechNote:~/docker$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
my-test-app   latest    ca344f358767   54 seconds ago   885MB
python        3         2a93c239d591   6 days ago       885MB
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;539&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y1LPR/btqXDf6BZs9/f9k54eiN3fJYxE22SLCVHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y1LPR/btqXDf6BZs9/f9k54eiN3fJYxE22SLCVHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y1LPR/btqXDf6BZs9/f9k54eiN3fJYxE22SLCVHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy1LPR%2FbtqXDf6BZs9%2Ff9k54eiN3fJYxE22SLCVHk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;539&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;새로운 docker image 가 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;[Docker 이미지 빌드시 사용된 Dockerfile]&lt;/p&gt;
&lt;pre id=&quot;code_1613457276351&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3

COPY main.py ./

CMD [&quot;python3&quot;, &quot;./main.py&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;새로 생성된 이미지가 공식 python 3 이미지를 기반으로 하기에 python 이미지 또한 다운로드되어 있는 것을 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;b&gt;Docker 이미지 이력 확인 :&lt;br /&gt;Docker 이미지의 생성 이력을 확인한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;$ docker image build -t &quot;Image 이름&quot; &quot;Dockerfile 경로&quot;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613459181031&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~/docker$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
my-test-app   latest    ca344f358767   2 minutes ago   885MB
python        3         2a93c239d591   6 days ago      885MB
technote@TechNote:~/docker$ docker image history my-test-app
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
ca344f358767   2 minutes ago   /bin/sh -c #(nop)  CMD [&quot;python3&quot; &quot;./main.py&amp;hellip;   0B        
77da3887c4b1   2 minutes ago   /bin/sh -c #(nop) COPY file:05e1e101e1853515&amp;hellip;   21B       
2a93c239d591   6 days ago      /bin/sh -c #(nop)  CMD [&quot;python3&quot;]              0B        
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c set -ex;   wget -O get-pip.py &quot;$P&amp;hellip;   8.01MB    
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c #(nop)  ENV PYTHON_GET_PIP_SHA256&amp;hellip;   0B        
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c #(nop)  ENV PYTHON_GET_PIP_URL=ht&amp;hellip;   0B        
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c #(nop)  ENV PYTHON_PIP_VERSION=21&amp;hellip;   0B        
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c cd /usr/local/bin  &amp;amp;&amp;amp; ln -s idle3&amp;hellip;   32B       
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c set -ex   &amp;amp;&amp;amp; wget -O python.tar.x&amp;hellip;   55.7MB    
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c #(nop)  ENV PYTHON_VERSION=3.9.1     0B        
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c #(nop)  ENV GPG_KEY=E3FF2839C048B&amp;hellip;   0B        
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c apt-get update &amp;amp;&amp;amp; apt-get install&amp;hellip;   18MB      
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B        
&amp;lt;missing&amp;gt;      6 days ago      /bin/sh -c #(nop)  ENV PATH=/usr/local/bin:/&amp;hellip;   0B        
&amp;lt;missing&amp;gt;      7 days ago      /bin/sh -c set -ex;  apt-get update;  apt-ge&amp;hellip;   510MB     
&amp;lt;missing&amp;gt;      7 days ago      /bin/sh -c apt-get update &amp;amp;&amp;amp; apt-get install&amp;hellip;   146MB     
&amp;lt;missing&amp;gt;      7 days ago      /bin/sh -c set -ex;  if ! command -v gpg &amp;gt; /&amp;hellip;   17.5MB    
&amp;lt;missing&amp;gt;      7 days ago      /bin/sh -c set -eux;  apt-get update;  apt-g&amp;hellip;   16.5MB    
&amp;lt;missing&amp;gt;      7 days ago      /bin/sh -c #(nop)  CMD [&quot;bash&quot;]                 0B        
&amp;lt;missing&amp;gt;      7 days ago      /bin/sh -c #(nop) ADD file:8f75f11b2bd2d50e5&amp;hellip;   114MB     
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;472&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqDjFH/btqXrDVDFN1/1eBs6abVFgIzzzOMRUysg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqDjFH/btqXrDVDFN1/1eBs6abVFgIzzzOMRUysg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqDjFH/btqXrDVDFN1/1eBs6abVFgIzzzOMRUysg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqDjFH%2FbtqXrDVDFN1%2F1eBs6abVFgIzzzOMRUysg1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;472&quot; data-ke-mobilestyle=&quot;widthContent&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;/&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&gt;&lt;b&gt;Docker 이미지 목록 확인 :&lt;br /&gt;Docker 이미지 목록을 확인한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;$ docker image ls&lt;br /&gt;&lt;b&gt;$ docker image ls -a&lt;/b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613459683614&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~/docker$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
my-test-app   latest    ca344f358767   4 minutes ago   885MB
python        3         2a93c239d591   6 days ago      885MB
technote@TechNote:~/docker$ docker image ls -a
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
my-test-app   latest    ca344f358767   4 minutes ago   885MB
&amp;lt;none&amp;gt;        &amp;lt;none&amp;gt;    77da3887c4b1   4 minutes ago   885MB
python        3         2a93c239d591   6 days ago      885MB&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;161&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4n20r/btqXu4MbS9R/alWl192s1Kc2atDRt9Bfzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4n20r/btqXu4MbS9R/alWl192s1Kc2atDRt9Bfzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4n20r/btqXu4MbS9R/alWl192s1Kc2atDRt9Bfzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4n20r%2FbtqXu4MbS9R%2FalWl192s1Kc2atDRt9Bfzk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;161&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;-a 옵션 : &lt;span&gt;Show all images (default hides intermediate images)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Docker images have intermediate layers that increase reusability, decrease disk usage, and speed up&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;docker build&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;by allowing each step to be cached. These intermediate layers are not shown by default.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Docker image는 cache 와 같은 역할을 하는 intermediate layer 를 가지고 있다. (intermediate image)&lt;br /&gt;기본적으로 ls 시에는 보이지 않고, -a 옵션을 했을 때만 보인다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;docker image history 시 최종 image 생성전 중간에 intermediate image 가 생기는 것을 Image ID를 통해 확인할 수 있다.&amp;nbsp;&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&gt;&lt;b&gt;Docker dangling 이미지 전체 삭제:&lt;br /&gt;Docker 사용 중 발생할 수 있는 dangling 이미지 전체를 삭제한다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;$ docker image prune&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613459696788&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~/docker$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;100&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxiduj/btqXj7wd3F5/udkYqpqblkkv8Lj2Qk9yi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxiduj/btqXj7wd3F5/udkYqpqblkkv8Lj2Qk9yi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxiduj/btqXj7wd3F5/udkYqpqblkkv8Lj2Qk9yi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdxiduj%2FbtqXj7wd3F5%2FudkYqpqblkkv8Lj2Qk9yi0%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;100&quot; data-ke-mobilestyle=&quot;widthContent&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;/&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&gt;&lt;b&gt;Docker 이미지 삭제 :&lt;br /&gt;Docker 이미지를 삭제한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;$ docker image rm &quot;Image 이름:[태그]&quot;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613459779805&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~/docker$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
my-test-app   latest    ca344f358767   7 minutes ago   885MB
python        3         2a93c239d591   6 days ago      885MB
technote@TechNote:~/docker$ docker image rm my-test-app:latest 
Untagged: my-test-app:latest
Deleted: sha256:ca344f358767bed3419c9b9c8ce2f8bb5b115d13b10b536bef8222561c6614cf
Deleted: sha256:77da3887c4b19340a4601cd55d46c74f00611036e18968eddcad176feabc4b1f
Deleted: sha256:3d07b1cb1ba54ae2785be9298208ddcd013358fd3fc1cee403e5ece168aaf0dc
technote@TechNote:~/docker$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
python       3         2a93c239d591   6 days ago   885MB&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;218&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b89T7E/btqXyMcQTf0/LGMaK53f5zalGGKDBolmzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b89T7E/btqXyMcQTf0/LGMaK53f5zalGGKDBolmzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b89T7E/btqXyMcQTf0/LGMaK53f5zalGGKDBolmzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb89T7E%2FbtqXyMcQTf0%2FLGMaK53f5zalGGKDBolmzK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;218&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/Docker</category>
      <category>Command</category>
      <category>Docker</category>
      <category>IMAGE</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/371</guid>
      <comments>https://mytechmemo.tistory.com/371#entry371comment</comments>
      <pubDate>Tue, 16 Feb 2021 16:16:53 +0900</pubDate>
    </item>
    <item>
      <title>[Docker][해결방법] image is being used by stopped container</title>
      <link>https://mytechmemo.tistory.com/370</link>
      <description>&lt;p&gt;Docker Image 삭제시 에러가 발생하는 경우가 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1613398123465&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~/docker$ docker image ls
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
my-test-build   latest    22b5185b193b   2 minutes ago   885MB
python          3         2a93c239d591   6 days ago      885MB
hello-world     latest    bf756fb1ae65   13 months ago   13.3kB
technote@TechNote:~/docker$ docker rmi bf756fb1ae65
Error response from daemon: conflict: unable to delete bf756fb1ae65 (must be forced) - image is being used by stopped container 83afae48b404
technote@TechNote:~/docker$ &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;245&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1v4s7/btqW8Hdk8kr/qxBA56OKplKkUj5wZEva1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1v4s7/btqW8Hdk8kr/qxBA56OKplKkUj5wZEva1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1v4s7/btqW8Hdk8kr/qxBA56OKplKkUj5wZEva1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1v4s7%2FbtqW8Hdk8kr%2FqxBA56OKplKkUj5wZEva1k%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;245&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이는 삭제하려는 Image 가 container 로 사용되고 있어서 발생하는 것이기 때문에 해당 container 를 먼저 제거하고 Image 또한 삭제하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1613398150022&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~/docker$ docker container ls -a
CONTAINER ID   IMAGE         COMMAND    CREATED       STATUS                   PORTS     NAMES
83afae48b404   hello-world   &quot;/hello&quot;   2 weeks ago   Exited (0) 2 weeks ago             nostalgic_hofstadter
technote@TechNote:~/docker$ docker container rm 83afae48b404
83afae48b404
technote@TechNote:~/docker$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
technote@TechNote:~/docker$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;223&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lpjiA/btqW8F0RuAY/lRQhETKYoUStcqCySyD2o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lpjiA/btqW8F0RuAY/lRQhETKYoUStcqCySyD2o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lpjiA/btqW8F0RuAY/lRQhETKYoUStcqCySyD2o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlpjiA%2FbtqW8F0RuAY%2FlRQhETKYoUStcqCySyD2o1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;223&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;해당 Container를 삭제하고 Image 를 삭제하면 아래와 같이 에러없이 삭제되는 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1613398161261&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~/docker$ docker image ls -a
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
&amp;lt;none&amp;gt;          &amp;lt;none&amp;gt;    b7603defdd0d   6 minutes ago   885MB
my-test-build   latest    22b5185b193b   6 minutes ago   885MB
python          3         2a93c239d591   6 days ago      885MB
hello-world     latest    bf756fb1ae65   13 months ago   13.3kB
technote@TechNote:~/docker$ docker image rm bf756fb1ae65
Untagged: hello-world:latest
Untagged: hello-world@sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Untagged: hello-world@sha256:95ddb6c31407e84e91a986b004aee40975cb0bda14b5949f6faac5d2deadb4b9
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63
technote@TechNote:~/docker$ 
technote@TechNote:~/docker$ docker image ls -a
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
my-test-build   latest    22b5185b193b   6 minutes ago   885MB
&amp;lt;none&amp;gt;          &amp;lt;none&amp;gt;    b7603defdd0d   6 minutes ago   885MB
python          3         2a93c239d591   6 days ago      885MB
technote@TechNote:~/docker$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;427&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pfSaV/btqXobxDfid/GyKLKVrKPBiahTvwIxAEQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pfSaV/btqXobxDfid/GyKLKVrKPBiahTvwIxAEQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pfSaV/btqXobxDfid/GyKLKVrKPBiahTvwIxAEQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpfSaV%2FbtqXobxDfid%2FGyKLKVrKPBiahTvwIxAEQ1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;427&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/Docker</category>
      <category>container</category>
      <category>Docker</category>
      <category>rm</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/370</guid>
      <comments>https://mytechmemo.tistory.com/370#entry370comment</comments>
      <pubDate>Mon, 15 Feb 2021 22:44:40 +0900</pubDate>
    </item>
    <item>
      <title>[Docker][해결방법] Got permission denied while trying to connect to the Docker daemon socket</title>
      <link>https://mytechmemo.tistory.com/369</link>
      <description>&lt;p&gt;docker image 를 다운로드 받으려고 했을 때 아래와 같이 권한 에러가 발생하는 경우가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;190&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2EqlS/btqW4g04O6c/dVcryeFglm7HKzZigJjUsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2EqlS/btqW4g04O6c/dVcryeFglm7HKzZigJjUsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2EqlS/btqW4g04O6c/dVcryeFglm7HKzZigJjUsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2EqlS%2FbtqW4g04O6c%2FdVcryeFglm7HKzZigJjUsk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;190&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;해당 문제는 사용자가 /var/run/docker.sock 을 접근하려고 하였지만 권한이 없어 발생하는 문제로 사용자가 root:docker 권한을 가지고 있어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1613398217853&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~$ ls -al /var/run/docker.sock
srw-rw---- 1 root docker 0  2월 15 15:16 /var/run/docker.sock&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;141&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YeSam/btqXgnSyvpg/PkTZGPdPmCjqNoznUB0TT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YeSam/btqXgnSyvpg/PkTZGPdPmCjqNoznUB0TT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YeSam/btqXgnSyvpg/PkTZGPdPmCjqNoznUB0TT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYeSam%2FbtqXgnSyvpg%2FPkTZGPdPmCjqNoznUB0TT1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;141&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;root 권한을 가지고 실행하는 것은 권장되지 않으므로, 사용자를 docker group에 포함시켜주면 된다. &lt;br /&gt;($USER 환경 변수는 현재 로그인한 사용자 아이디를 나타내므로 그대로 입력하면 된다.)&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;technote@TechNote:~$&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;sudo&amp;nbsp;usermod&amp;nbsp;-a&amp;nbsp;-G&amp;nbsp;docker&amp;nbsp;$USER&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;[sudo]&amp;nbsp;password&amp;nbsp;for&amp;nbsp;technote:&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;131&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WAusF/btqXj7PqG89/jSzAOyOBUdQGckpFQ7v0PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WAusF/btqXj7PqG89/jSzAOyOBUdQGckpFQ7v0PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WAusF/btqXj7PqG89/jSzAOyOBUdQGckpFQ7v0PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWAusF%2FbtqXj7PqG89%2FjSzAOyOBUdQGckpFQ7v0PK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;131&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;시스템 재구동 후 해당 ID 에 대해 docker group 권한이 부여되였음을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1613398442093&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;technote@TechNote:~$ id
uid=1000(technote) gid=1000(technote) groups=1000(technote),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),131(lxd),132(sambashare),997(docker),998(vboxsf)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;168&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HNVH9/btqXj7IGbqQ/6fpdPq6t60rs40X65Luq2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HNVH9/btqXj7IGbqQ/6fpdPq6t60rs40X65Luq2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HNVH9/btqXj7IGbqQ/6fpdPq6t60rs40X65Luq2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHNVH9%2FbtqXj7IGbqQ%2F6fpdPq6t60rs40X65Luq2K%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;168&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;technote@TechNote:~$&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;docker&amp;nbsp;image&amp;nbsp;pull&amp;nbsp;hello-world:latest&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;latest:&amp;nbsp;Pulling&amp;nbsp;from&amp;nbsp;library/hello-world&lt;br /&gt;Digest:&amp;nbsp;sha256:95ddb6c31407e84e91a986b004aee40975cb0bda14b5949f6faac5d2deadb4b9&lt;br /&gt;Status:&amp;nbsp;Image&amp;nbsp;is&amp;nbsp;up&amp;nbsp;to&amp;nbsp;date&amp;nbsp;for&amp;nbsp;hello-world:latest&lt;br /&gt;docker.io/library/hello-world:latest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;182&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9T4Ct/btqXu4j2POQ/ACoPtBc6GKMvok1KcCcWMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9T4Ct/btqXu4j2POQ/ACoPtBc6GKMvok1KcCcWMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9T4Ct/btqXu4j2POQ/ACoPtBc6GKMvok1KcCcWMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9T4Ct%2FbtqXu4j2POQ%2FACoPtBc6GKMvok1KcCcWMk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;182&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;docker group 권한 부여 후 정상 동작 확인 가능하다.&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/Docker</category>
      <category>Docker</category>
      <category>error</category>
      <category>IMAGE</category>
      <category>Pull</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/369</guid>
      <comments>https://mytechmemo.tistory.com/369#entry369comment</comments>
      <pubDate>Mon, 15 Feb 2021 15:44:32 +0900</pubDate>
    </item>
    <item>
      <title>[Notepad++] 다크 테마(Dark Theme) 적용하기</title>
      <link>https://mytechmemo.tistory.com/368</link>
      <description>&lt;p&gt;기본 테마는 하얀 바탕에 검은 글씨를 기본으로 하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 개인적인 차이로 인해 다크 테마가 눈에 편안하여 Notepad++에 다크 테마를 적용해보려고 한다. &lt;br /&gt;(Notepad++ 은 기본 테마 외에 별도의 테마 적용이 가능하다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) 기본 설정은 아래와 같이 하얀 바탕을 기본으로 하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;438&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8GKXV/btqXgo4AIQj/9g9t8FOsH0SAHFXO38vBwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8GKXV/btqXgo4AIQj/9g9t8FOsH0SAHFXO38vBwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8GKXV/btqXgo4AIQj/9g9t8FOsH0SAHFXO38vBwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8GKXV%2FbtqXgo4AIQj%2F9g9t8FOsH0SAHFXO38vBwK%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;438&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) Notepad++을 설치하면 기본 테마 외에 다른 테마는 포함되어 있지 않다. &lt;br /&gt;&amp;nbsp; &amp;nbsp;이에 따라 적용하고자 하는 테마를 다운로드 받아 설치해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Notepad++ Dark Theme 다운로드 :&amp;nbsp;&lt;a href=&quot;https://draculatheme.com/notepad-plus-plus/&quot;&gt;Dark theme for Notepad++ and 160+ apps &amp;mdash; Dracula (draculatheme.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;477&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnXxtL/btqW1sUAImW/9SWsenjBfCpWppqQry5FM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnXxtL/btqW1sUAImW/9SWsenjBfCpWppqQry5FM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnXxtL/btqW1sUAImW/9SWsenjBfCpWppqQry5FM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnXxtL%2FbtqW1sUAImW%2F9SWsenjBfCpWppqQry5FM1%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;477&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;해당 웹사이트 접속하여&amp;nbsp; Install manually &amp;gt; Download using Dracula.xml link 의 XML 을 다운로드한다.&lt;/p&gt;
&lt;p&gt;그냥 클릭하면 아래와 같이 xml 이 바로 표시되는 경우가 있기 때문에 마우스 오른쪽 버튼을 눌러 링크 자체를 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;448&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pdnQX/btqW1teU4or/R1YrKufWir2ChSMEmLrgR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pdnQX/btqW1teU4or/R1YrKufWir2ChSMEmLrgR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pdnQX/btqW1teU4or/R1YrKufWir2ChSMEmLrgR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpdnQX%2FbtqW1teU4or%2FR1YrKufWir2ChSMEmLrgR1%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;448&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;385&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tjVqL/btqXgn5DP3U/2dTXklEXBiWPsFVOarHYr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tjVqL/btqXgn5DP3U/2dTXklEXBiWPsFVOarHYr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tjVqL/btqXgn5DP3U/2dTXklEXBiWPsFVOarHYr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtjVqL%2FbtqXgn5DP3U%2F2dTXklEXBiWPsFVOarHYr1%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;385&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3) 다운로드 받은 Dracula.xml은 &lt;span&gt;%AppData%\Notepad++\themes 에 복사한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;하지만 기본 notepad++ 설치하였을 경우 themes 폴더가 없기 때문에 아래와 같이 해당 경로를 찾을 수가 없다.&amp;nbsp;&lt;br /&gt;(&lt;span&gt;%AppData%\Notepad++\themes 는 탐색기 경로창에 똑같이 입력)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;'OOO'을(를)&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;없습니다.&amp;nbsp;맞춤법을&amp;nbsp;확인하고&amp;nbsp;다시&amp;nbsp;시도하십시오.&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;640&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XyCbr/btqW8Fy3Moj/KzYaqPcYaFfapRUHKN3cM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XyCbr/btqW8Fy3Moj/KzYaqPcYaFfapRUHKN3cM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XyCbr/btqW8Fy3Moj/KzYaqPcYaFfapRUHKN3cM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXyCbr%2FbtqW8Fy3Moj%2FKzYaqPcYaFfapRUHKN3cM1%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;640&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;하나 상위 경로인 &lt;span&gt;%AppData%\Notepad++ 로 이동하여 themes 폴더를 생성하고 Dracula.xml을 복사한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;441&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcxxnd/btqXgocqfZZ/P2ksnVNFET6gWRU3hiN4N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcxxnd/btqXgocqfZZ/P2ksnVNFET6gWRU3hiN4N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcxxnd/btqXgocqfZZ/P2ksnVNFET6gWRU3hiN4N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcxxnd%2FbtqXgocqfZZ%2FP2ksnVNFET6gWRU3hiN4N0%2Fimg.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;441&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;221&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pYHmA/btqXrD0RZmV/9KnzHoeqpeiyNZ8IwiygI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pYHmA/btqXrD0RZmV/9KnzHoeqpeiyNZ8IwiygI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pYHmA/btqXrD0RZmV/9KnzHoeqpeiyNZ8IwiygI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpYHmA%2FbtqXrD0RZmV%2F9KnzHoeqpeiyNZ8IwiygI0%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;221&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4) Notepad++ 를 재시작하고 Settings &amp;gt; Style Configurator 를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;443&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHtroc/btqXgpvEFh8/VrNSiUe5HJDn2JltdgbCOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHtroc/btqXgpvEFh8/VrNSiUe5HJDn2JltdgbCOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHtroc/btqXgpvEFh8/VrNSiUe5HJDn2JltdgbCOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHtroc%2FbtqXgpvEFh8%2FVrNSiUe5HJDn2JltdgbCOK%2Fimg.png&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;443&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5) 아래와 같이 Select theme 항목에 Dracula가 표시되는 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;426&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ztLHI/btqW4ijTisF/Mr5OkDs6X5Npu9QThAePgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ztLHI/btqW4ijTisF/Mr5OkDs6X5Npu9QThAePgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ztLHI/btqW4ijTisF/Mr5OkDs6X5Npu9QThAePgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FztLHI%2FbtqW4ijTisF%2FMr5OkDs6X5Npu9QThAePgK%2Fimg.png&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;426&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Dracula를 theme 로 선택하고, Save &amp;amp; Close 버튼을 누른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;426&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IYHRD/btqXgpoSHqB/lH7brxG2FFOOHCzmZk8FR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IYHRD/btqXgpoSHqB/lH7brxG2FFOOHCzmZk8FR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IYHRD/btqXgpoSHqB/lH7brxG2FFOOHCzmZk8FR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIYHRD%2FbtqXgpoSHqB%2FlH7brxG2FFOOHCzmZk8FR0%2Fimg.png&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;426&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6) Dark Theme 가 적용된 Notepad++을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;438&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8W0fw/btqXgoKeGBA/29E4ZzwxordIrm6kuvoykk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8W0fw/btqXgoKeGBA/29E4ZzwxordIrm6kuvoykk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8W0fw/btqXgoKeGBA/29E4ZzwxordIrm6kuvoykk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8W0fw%2FbtqXgoKeGBA%2F29E4ZzwxordIrm6kuvoykk%2Fimg.png&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;438&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Application/Notepad++</category>
      <category>Dark</category>
      <category>Dracula</category>
      <category>Notepad++</category>
      <category>theme</category>
      <category>테마</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/368</guid>
      <comments>https://mytechmemo.tistory.com/368#entry368comment</comments>
      <pubDate>Mon, 15 Feb 2021 10:36:54 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] 설치 on Ubuntu 20.04 Focal</title>
      <link>https://mytechmemo.tistory.com/367</link>
      <description>&lt;p&gt;Docker 를 Ubuntu 에 설치하는 방법은 3가지가 있다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;docker repository를 통해 설치하는 방법&lt;/li&gt;
&lt;li&gt;수동으로 deb 파일을 다운로드하여 설치하는 방법&lt;/li&gt;
&lt;li&gt;별도의 설치 스크립트를 이용하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서는 첫번째인 docker repository를 설정하고 이를 통해 apt로 설치하는 방법을 알아보자.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) 기존 docker 관련 package들을 삭제&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1612075471081&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get remove docker docker-engine docker.io containerd runc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ubuntu 20.04 를 바로 설치한 직후에는 docker 관련 package 들이 설치되어 있지 않지만, 이전에 docker를 사용한 이력이 있을 경우 삭제해 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Screenshot from 2021-01-31 14-28-21.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;186&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q0d78/btqVddKYEn3/0YNd9J5DnBkOatSNz7ynR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q0d78/btqVddKYEn3/0YNd9J5DnBkOatSNz7ynR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q0d78/btqVddKYEn3/0YNd9J5DnBkOatSNz7ynR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ0d78%2FbtqVddKYEn3%2F0YNd9J5DnBkOatSNz7ynR1%2Fimg.png&quot; data-filename=&quot;Screenshot from 2021-01-31 14-28-21.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;186&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2) Docker Repository 를 등록하기 위한 관련 package 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Docker repository 등록에 앞서, 별도 repository 등록하기 위해 필요한 package를 설치한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1612075654705&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1612075676864&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Screenshot from 2021-01-31 14-29-11.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;626&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MgK0s/btqVdfhI4sb/2EK5ZzIkGCUbm1a9Owfap1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MgK0s/btqVdfhI4sb/2EK5ZzIkGCUbm1a9Owfap1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MgK0s/btqVdfhI4sb/2EK5ZzIkGCUbm1a9Owfap1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMgK0s%2FbtqVdfhI4sb%2F2EK5ZzIkGCUbm1a9Owfap1%2Fimg.png&quot; data-filename=&quot;Screenshot from 2021-01-31 14-29-11.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;626&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3) Docker GPG key 등록&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;repository 를 안전하게 등록하고 package를 다운로드 하기 위해 Docker GPG key 를 등록한다.&lt;/p&gt;
&lt;pre id=&quot;code_1612075837632&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Screenshot from 2021-01-31 14-30-36.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;135&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yjb4d/btqVh8oz0zr/EhB8nEYqqkv0gVMVCSKSlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yjb4d/btqVh8oz0zr/EhB8nEYqqkv0gVMVCSKSlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yjb4d/btqVh8oz0zr/EhB8nEYqqkv0gVMVCSKSlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYjb4d%2FbtqVh8oz0zr%2FEhB8nEYqqkv0gVMVCSKSlk%2Fimg.png&quot; data-filename=&quot;Screenshot from 2021-01-31 14-30-36.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;135&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;0EBFCD88 로 끝나는 fingerprint를 가진 key 가 정상적으로 설치되었는지 확인해 본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Screenshot from 2021-01-31 15-52-02.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;198&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w8E5M/btqVkLNq6gE/pygFpXmd38UKShMwijGkQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w8E5M/btqVkLNq6gE/pygFpXmd38UKShMwijGkQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w8E5M/btqVkLNq6gE/pygFpXmd38UKShMwijGkQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw8E5M%2FbtqVkLNq6gE%2FpygFpXmd38UKShMwijGkQ1%2Fimg.png&quot; data-filename=&quot;Screenshot from 2021-01-31 15-52-02.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;198&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;4) Docker Ubuntu Repository 등록&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Docker Repository를 등록한다.&lt;/p&gt;
&lt;pre id=&quot;code_1612076068365&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Screenshot from 2021-01-31 14-33-19.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;263&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBJ4aE/btqVcsuOz2o/0AKhIv5Kd7DVoufZvEFDtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBJ4aE/btqVcsuOz2o/0AKhIv5Kd7DVoufZvEFDtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBJ4aE/btqVcsuOz2o/0AKhIv5Kd7DVoufZvEFDtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBJ4aE%2FbtqVcsuOz2o%2F0AKhIv5Kd7DVoufZvEFDtK%2Fimg.png&quot; data-filename=&quot;Screenshot from 2021-01-31 14-33-19.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;263&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5) Docker 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;apt 를 통해 docker 를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1612076114375&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Screenshot from 2021-01-31 14-33-52.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;568&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dA4qXQ/btqVkLml0nZ/piukRG3FEYYot4evwTL0MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dA4qXQ/btqVkLml0nZ/piukRG3FEYYot4evwTL0MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dA4qXQ/btqVkLml0nZ/piukRG3FEYYot4evwTL0MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdA4qXQ%2FbtqVkLml0nZ%2FpiukRG3FEYYot4evwTL0MK%2Fimg.png&quot; data-filename=&quot;Screenshot from 2021-01-31 14-33-52.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;568&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6) 정상 설치 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;정상 설치 확인을 위해 아래 명령어로 docker를 통해 hello-world 를 실행해 본다.&lt;/p&gt;
&lt;pre id=&quot;code_1612076199416&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo docker run hello-world&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아래와 같이 &quot;Hello from Docker!&quot; 가 출력되면 정상 설치된 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Screenshot from 2021-01-31 14-35-13.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;590&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b13D1V/btqVh8vlHja/I1ZKTcgLMeRahMLvncGQsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b13D1V/btqVh8vlHja/I1ZKTcgLMeRahMLvncGQsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b13D1V/btqVh8vlHja/I1ZKTcgLMeRahMLvncGQsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb13D1V%2FbtqVh8vlHja%2FI1ZKTcgLMeRahMLvncGQsK%2Fimg.png&quot; data-filename=&quot;Screenshot from 2021-01-31 14-35-13.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;590&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/Docker</category>
      <category>20.04</category>
      <category>Docker</category>
      <category>Repository</category>
      <category>ubuntu</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/367</guid>
      <comments>https://mytechmemo.tistory.com/367#entry367comment</comments>
      <pubDate>Sun, 31 Jan 2021 15:57:49 +0900</pubDate>
    </item>
    <item>
      <title>마이크로 서비스 아키텍처 (Microservice Architecture)</title>
      <link>https://mytechmemo.tistory.com/366</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;독립적으로 동작하는 다수의 작은 서비스들이 상호 협업하는 구조의 아키텍처&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;b&gt;기존 모놀리식 (Monolithic) 아키텍처&lt;/b&gt;와 같이 &lt;b&gt;하나의 서비스&lt;/b&gt;로 되어 있는 구조에서 기능을 수정하거나 추가할 경우 해당 코드들이 &lt;b&gt;기존의 코드들에 영향을 미칠 수&lt;/b&gt; 있고, 이는 점점 더 시스템의 유지 보수를 어렵게 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;반면, &lt;b&gt;마이크로 서비스 (Microservice) 아키텍처&lt;/b&gt;는 내부적으로 &lt;b&gt;다수의 작은 서비스들&lt;/b&gt;을 가지고 있고, 각 서비스들은 상호협업 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;각 서비스들은 독립적이고, 자율성을 가지기 때문&lt;/b&gt;에 기능이 수정되거나 추가되더라도 &lt;b&gt;기존 다른 서비스에 미치는 영향은 제한적&lt;/b&gt;이다.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;(각 서비스들은 네트워크 호출을 통해 통신&lt;span style=&quot;color: #333333;&quot;&gt;하기 때문에 서로 다른 기술 기반으로 구현 가능하다는 특징도 있음&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;마이크로 서비스 아키텍처&lt;/b&gt;는...&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;분산 시스템이고, 서비스 지향 아키텍처 (SOA, Service Oriented Architecture) 이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;서로 독립되어 있기 때문에 장애의 전파를 최소화 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;기존 시스템에 영향을 최소화하면서 확장 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;다수의 서비스들로 구분되어 있기 때문에 각 서비스들은&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;독립적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;배포 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;배포&lt;/p&gt;
&lt;p&gt;테스트&lt;/p&gt;
&lt;p&gt;모니터링&lt;/p&gt;
&lt;p&gt;대규모 마이크로 서비스&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software architecture</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/366</guid>
      <comments>https://mytechmemo.tistory.com/366#entry366comment</comments>
      <pubDate>Sun, 3 Jan 2021 18:25:08 +0900</pubDate>
    </item>
    <item>
      <title>Use Case Model - Use Case Diagram</title>
      <link>https://mytechmemo.tistory.com/364</link>
      <description>&lt;p&gt;&lt;b&gt;Use&amp;nbsp;Case&amp;nbsp;Model&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;시스템의 Functional Requirements를 표현한 모형&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Actor&lt;/b&gt;와&amp;nbsp;&lt;b&gt;Use Case(UC)&lt;/b&gt;,&amp;nbsp;그리고&amp;nbsp;이들간의&amp;nbsp;&lt;b&gt;관계(Association)&lt;/b&gt;를&amp;nbsp;Diagram으로&amp;nbsp;표현 &lt;/p&gt;
&lt;p&gt;(Use Case Diagram)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sMZNp/btqQmPndVqH/wMSUFFGkGxSC0rRgYDzxb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sMZNp/btqQmPndVqH/wMSUFFGkGxSC0rRgYDzxb1/img.png&quot; data-alt=&quot;Use Case Model&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sMZNp/btqQmPndVqH/wMSUFFGkGxSC0rRgYDzxb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsMZNp%2FbtqQmPndVqH%2FwMSUFFGkGxSC0rRgYDzxb1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Use Case Model&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;b&gt;Actor&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;시스템과&amp;nbsp;Interaction하는&amp;nbsp;모든&amp;nbsp;요소 &lt;/p&gt;
&lt;p&gt;개발&amp;nbsp;범위&amp;nbsp;외부에&amp;nbsp;존재 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Use&amp;nbsp;Case&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;시스템이&amp;nbsp;제공하는&amp;nbsp;기능을&amp;nbsp;의미 &lt;/p&gt;
&lt;p&gt;사용자&amp;nbsp;관점에서&amp;nbsp;개별적인&amp;nbsp;기능&amp;nbsp;단위&amp;nbsp;표현&amp;nbsp;필요 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Association&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;Actor와&amp;nbsp;Use&amp;nbsp;Case&amp;nbsp;간의&amp;nbsp;관계&amp;nbsp;및&amp;nbsp;방향 &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;Use Case 간에는 association을 쓰면 안되고, &amp;lt;&amp;lt;include&amp;gt;&amp;gt;, &amp;lt;&amp;lt;extend&amp;gt;&amp;gt; 만 허용 &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;lt;&amp;lt;include&amp;gt;&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;임의의&amp;nbsp;UC내에&amp;nbsp;특정&amp;nbsp;UC가&amp;nbsp;있을&amp;nbsp;경우&amp;nbsp;&amp;lt;&amp;lt;include&amp;gt;&amp;gt;로&amp;nbsp;표현 &lt;br /&gt;(공통의&amp;nbsp;부분을&amp;nbsp;떼어&amp;nbsp;내어&amp;nbsp;중복&amp;nbsp;방지를&amp;nbsp;위한&amp;nbsp;모듈화를&amp;nbsp;위함)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt; &amp;lt;&amp;lt;extend&amp;gt;&amp;gt;&lt;/b&gt;&lt;br /&gt;특정&amp;nbsp;조건에&amp;nbsp;발생하는&amp;nbsp;추가&amp;nbsp;UC의&amp;nbsp;경우&amp;nbsp;&amp;lt;&amp;lt;extend&amp;gt;&amp;gt;로&amp;nbsp;표현 &lt;br /&gt;(가변성/variability&amp;nbsp;표현을&amp;nbsp;위함) &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software architecture</category>
      <category>actor</category>
      <category>UC</category>
      <category>UML</category>
      <category>Use Case</category>
      <category>Use Case Model</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/364</guid>
      <comments>https://mytechmemo.tistory.com/364#entry364comment</comments>
      <pubDate>Mon, 7 Dec 2020 21:08:31 +0900</pubDate>
    </item>
    <item>
      <title>SOLID - 객체 지향 디자인을 위한 5가지 기본 원칙</title>
      <link>https://mytechmemo.tistory.com/363</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;유지가능(Maintainable)하고 확장가능(Extensible)한 시스템을 위한 &lt;b&gt;객체 지향 디자인을 위한 5가지 기본 원칙&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;S&lt;/b&gt;&lt;/span&gt;RP: Single Responsibility Principle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;O&lt;/span&gt;&lt;/b&gt;CP: Open-Closed Principle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;L&lt;/span&gt;&lt;/b&gt;SP: Liskov Substitution Principle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;I&lt;/span&gt;&lt;/b&gt;SP: Interface Segregation Principle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;D&lt;/span&gt;&lt;/b&gt;IP: Dependency Inversion Principle&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SRP: Single Responsibility Principle&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;하나의 모듈은 변경을 위한 하나의 이유만 있어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모듈을 변경해야 할 이유가 두개 이상이라면 해당 모듈은 두개 이상의 책임을 가지고 있다는 의미로 SRP를 지키지 못한 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;OCP: Open-Closed Principle&lt;/p&gt;
&lt;p&gt;수정에는 닫혀 있고, 확장에는 열려있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;즉, 수정 없이 모듈의 기능을 확장할 수 있어야 한다는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;LSP: Liskov Substitution Principle&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파생 모듈은 기본 모듈로 교체 가능해야 한다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ISP: Interface Segregation Principle&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Client는 사용하지 않는 Interface에 의해 영향을 받지 않아야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;범용 Interface 하나를 사용하기 보다는 응집도가 높은 여러개의 interface로 분리하여 사용해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DIP: Dependency Inversion Principle&lt;/p&gt;
&lt;p&gt;구현이 아니라 Interface에 의존해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;응집도: SRP 와 관련&lt;/p&gt;
&lt;p&gt;규모: SRP 와 관련&lt;/p&gt;
&lt;p&gt;복잡도: DIP 와 관련&lt;/p&gt;
&lt;p&gt;결합도: LSP, ISP, DIP와 관련&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software architecture</category>
      <category>OOP</category>
      <category>SOLID</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/363</guid>
      <comments>https://mytechmemo.tistory.com/363#entry363comment</comments>
      <pubDate>Sun, 6 Dec 2020 21:41:03 +0900</pubDate>
    </item>
    <item>
      <title>Quality Attribute Scenario</title>
      <link>https://mytechmemo.tistory.com/358</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;어떤 자극(Stimulus)에 대해 시스템이 어떤 측정(Measure)하에 &lt;span style=&quot;color: #333333;&quot;&gt;응답(Response)해야 하는지에 대한 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Description&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ex&amp;gt; The game shall &lt;u&gt;change view modes(response)&lt;/u&gt;&amp;nbsp;&lt;u&gt;in &amp;lt; 500 ms(response measure)&lt;/u&gt; when the &lt;u&gt;user presses the &amp;lt;C&amp;gt; button(stimulus)&lt;/u&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;224&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgcnFg/btqPiasHduy/3oFFAPk2sJRBggxX9DQO61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgcnFg/btqPiasHduy/3oFFAPk2sJRBggxX9DQO61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgcnFg/btqPiasHduy/3oFFAPk2sJRBggxX9DQO61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgcnFg%2FbtqPiasHduy%2F3oFFAPk2sJRBggxX9DQO61%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;224&quot; data-ke-mobilestyle=&quot;widthContent&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;/&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&gt;&lt;b&gt;&amp;lt;Source of Stimulus&amp;gt;는 &amp;lt;Environment&amp;gt; 환경에서 &amp;lt;Stimulus&amp;gt;를 발생시킨다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;lt;Artifact&amp;gt;는 &amp;lt;Response&amp;gt;를 &amp;lt;Response Measure&amp;gt;하에 처리한다.&lt;/b&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&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.9535%;&quot;&gt;Source of Stimulus&lt;/td&gt;
&lt;td style=&quot;width: 81.0465%;&quot;&gt;Stimulus를 생성하는 개체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.9535%;&quot;&gt;Stimulus&lt;/td&gt;
&lt;td style=&quot;width: 81.0465%;&quot;&gt;시스템에 전달되었을 때 Response를 필요로하는 조건&lt;br /&gt;예&amp;gt; 사용자의 요청, 이벤트, interrupt, 에러 등.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.9535%;&quot;&gt;Artifact&lt;/td&gt;
&lt;td style=&quot;width: 81.0465%;&quot;&gt;Stimulus가 전달되는 대상으로 System 전체이거나 일부분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.9535%;&quot;&gt;Environment&lt;/td&gt;
&lt;td style=&quot;width: 81.0465%;&quot;&gt;Stimulus가 발생하는 특정 조건의 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.9535%;&quot;&gt;Response&lt;/td&gt;
&lt;td style=&quot;width: 81.0465%;&quot;&gt;Stimulus 도착 결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.9535%;&quot;&gt;Response Measure&lt;/td&gt;
&lt;td style=&quot;width: 81.0465%;&quot;&gt;Response가 발생하였을 때, 측정할 수 있는 것&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software architecture</category>
      <category>QAS</category>
      <category>Quality Attribute Scenario</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/358</guid>
      <comments>https://mytechmemo.tistory.com/358#entry358comment</comments>
      <pubDate>Sun, 6 Dec 2020 16:23:37 +0900</pubDate>
    </item>
    <item>
      <title>Architectural Drivers - 핵심 요구 사항</title>
      <link>https://mytechmemo.tistory.com/357</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Architectural Drivers (AD)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SW architecture를 Design하기 위해 Architect가 파악해야 할&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;Key Requirements&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;시스템의 Fundamental에 영향을 미침&lt;/li&gt;
&lt;li&gt;시스템을 위한 모든 요구 사항을 의미하지는 않음&lt;br /&gt;(AD는 전체 Requirement의 subset)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Architectural Driver는 architectural decision에 영향을 미치기 때문에 조기 파악이 중요&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&gt;&lt;b&gt;Architectural Driver의 종류&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Functional requirements&lt;br /&gt;=&amp;gt; Use Case Model과 Use Case Specification (Scenarios)를 통해 파악&lt;/li&gt;
&lt;li&gt;Non Functional requirements
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;Quality attributes&lt;br /&gt;=&amp;gt; Quality Attribute Scenarios를 통해 파악&lt;/li&gt;
&lt;li&gt;Constraints&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quality attribute와 funtionality는 밀접하게 관련이 있다.&lt;/p&gt;
&lt;p&gt;Quality Attribute는 &lt;span style=&quot;color: #333333;&quot;&gt;Quality Attribute Scenarios를 통해 &lt;/span&gt;측정 가능하고 테스트 가능하여야 한다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&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&gt;&lt;b&gt;Architectural Driver의 Priority&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Importance (Business적인 측면)&lt;/li&gt;
&lt;li&gt;Difficulty (개발 측면)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;※ AD 사이에 Conflict가 발생할 수도 있음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Software architecture</category>
      <category>ad</category>
      <category>Architectural Driver</category>
      <category>Functional Requirement</category>
      <category>Quality Attribute</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/357</guid>
      <comments>https://mytechmemo.tistory.com/357#entry357comment</comments>
      <pubDate>Sun, 6 Dec 2020 15:53:15 +0900</pubDate>
    </item>
    <item>
      <title>[Design Pattern] Singleton 패턴</title>
      <link>https://mytechmemo.tistory.com/355</link>
      <description>&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인스턴스가 하나 뿐인 객체를 만들 수 있게 해주는 패턴&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;특정 클래스에 대해 객체 인스턴스를 하나만 만들 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;사용 용도&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;자원 관리 Pool, 특정 하드웨어를 Control하는 디바이스 드라이버 등&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;비슷한 역할을 하는 전역 변수와의 비교&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;전역 변수는 애플리케이션 시작될 때 생성&lt;br /&gt;불필요하게 자원을 잡아먹는 경우 발생&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Singleton은 필요할 때 객체 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Singleton 기본 구조]&lt;/p&gt;
&lt;pre id=&quot;code_1606401538908&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Singleton {
	private static Singleton uniqueInstance;

	private Singleton() {}
	public static Singleton getInstance() {
		if(uniqueInstance == null)
			uniqueInstance = new Singleton();

		return uniqueInstance;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Java</category>
      <category>java</category>
      <category>Singleton</category>
      <category>싱글톤</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/355</guid>
      <comments>https://mytechmemo.tistory.com/355#entry355comment</comments>
      <pubDate>Thu, 26 Nov 2020 23:39:50 +0900</pubDate>
    </item>
    <item>
      <title>[VSCODE] Github Pull Requests 생성하기</title>
      <link>https://mytechmemo.tistory.com/354</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KQZXl/btqEnIzT2WW/JpYlkRI0UkU5I2EnHXfHt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KQZXl/btqEnIzT2WW/JpYlkRI0UkU5I2EnHXfHt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KQZXl/btqEnIzT2WW/JpYlkRI0UkU5I2EnHXfHt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKQZXl%2FbtqEnIzT2WW%2FJpYlkRI0UkU5I2EnHXfHt0%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;246&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://technote.kr/353&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;[Github 에 반영하기 (git commit/push)]&lt;/b&gt;&lt;/a&gt; 에서 보았듯이 write 권한이 없는 repository 에는 직접 반영을 할 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이에 write 권한을 가지고 있는 계정의 review를 받고 해당 계정을 통해 반영이 이루어 져야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이러한 과정을 Pull Requests 라고 하며 github 의 tab 들 중 하나에서 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0-0.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNCbye/btqEmqAXLjo/FkSKtXolIPB98rEI0IcO1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNCbye/btqEmqAXLjo/FkSKtXolIPB98rEI0IcO1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNCbye/btqEmqAXLjo/FkSKtXolIPB98rEI0IcO1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNCbye%2FbtqEmqAXLjo%2FFkSKtXolIPB98rEI0IcO1k%2Fimg.png&quot; data-filename=&quot;0-0.png&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;99&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#first&quot;&gt;&lt;b&gt;Pull Request 를 위한 전반적인 Flow 에 대한 이해&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#second&quot;&gt;&lt;b&gt;Pull Request 를 올리는 실제 사례&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#third&quot;&gt;&lt;b&gt;다수 개의 Pull Request 를 올리는 방법에 대한 이해&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 id=&quot;first&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Pull Request 를 위한 전반적인 Flow 에 대한 이해&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Pull Request 는 fork 된 repository 를 통해 이루어지게 되고, 이를 위한 repository &lt;/span&gt;fork / git clone을 포함한 Pull Request 를 올리는 큰 flow 는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;15.png&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8uxYO/btqEcopto1X/lihFywEnDBGzey0jUPbr4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8uxYO/btqEcopto1X/lihFywEnDBGzey0jUPbr4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8uxYO/btqEcopto1X/lihFywEnDBGzey0jUPbr4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8uxYO%2FbtqEcopto1X%2FlihFywEnDBGzey0jUPbr4k%2Fimg.png&quot; data-filename=&quot;15.png&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;425&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Pull Requests를 올리고자 하는 repository를 fork 한다.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;fork한 repository 를 Local PC 에 git clone 한다.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수정 commit 을 fork한 repository에 push 한다.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;push한 commit을 원본 repository 에 pull requests 한다.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 id=&quot;second&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Pull Request 를 올리는 실제 사례&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래의 예는 원본 Repository (TechNoteCode/Sample) 을 fork 하여 신규 Repository (technotekr/Sample) 을 생성하고, 해당 fork된 repository &lt;span style=&quot;color: #333333;&quot;&gt;(technotekr/Sample)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;를 통해 수정 내용을 반영 후 원본 Repository &lt;span style=&quot;color: #333333;&quot;&gt;(TechNoteCode/Sample) &lt;/span&gt;에 Pull Requests 하는 과정이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) 원본 Repository (&lt;span style=&quot;color: #333333;&quot;&gt;TechNoteCode/Sample) 의 왼쪽 상단 &quot;Fork&quot; 버튼을 눌러 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; fork repository &lt;span style=&quot;color: #333333;&quot;&gt;(technotekr/Sample) 생성&lt;/span&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rIDdn/btqEcmkTZqx/oLLucKNH6iHBTEAsyYWcMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rIDdn/btqEcmkTZqx/oLLucKNH6iHBTEAsyYWcMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rIDdn/btqEcmkTZqx/oLLucKNH6iHBTEAsyYWcMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrIDdn%2FbtqEcmkTZqx%2FoLLucKNH6iHBTEAsyYWcMK%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;168&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Fork 과정이 시작되면 아래와 같은 화면이 나오면서 진행된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KQ0eV/btqEcGDqmnH/E3bZl8PcWOAFwf7CVK2FV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KQ0eV/btqEcGDqmnH/E3bZl8PcWOAFwf7CVK2FV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KQ0eV/btqEcGDqmnH/E3bZl8PcWOAFwf7CVK2FV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKQ0eV%2FbtqEcGDqmnH%2FE3bZl8PcWOAFwf7CVK2FV0%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;541&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 Fork가 완료되면 동일 이름을 가진 Fork 된 repository (technotekr/Sample) 이 생성된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfJ8f6/btqEd8FMysg/I91pBMTDanKKX0hmw09gSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfJ8f6/btqEd8FMysg/I91pBMTDanKKX0hmw09gSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfJ8f6/btqEd8FMysg/I91pBMTDanKKX0hmw09gSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfJ8f6%2FbtqEd8FMysg%2FI91pBMTDanKKX0hmw09gSk%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;467&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) vscode 에 fork 된 repository 를 연동.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;상세 과정은 [&lt;b&gt;&lt;a href=&quot;https://technote.kr/352&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github 와 연동하기 (git clone)&lt;/a&gt;&lt;/b&gt;] 참조&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) 수정 코드를 fork 된 repository 에 반영&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;상세 과정은 [&lt;b&gt;&lt;a href=&quot;https://technote.kr/353&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github 에 반영하기 (git commit/push)&lt;/a&gt;&lt;/b&gt;] 참조&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4) vscode에 'GitHub Pull Requests and Issues' extension 설치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqbGQO/btqEd8ltF3T/OqpyT1zscImDvmKArujFQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqbGQO/btqEd8ltF3T/OqpyT1zscImDvmKArujFQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqbGQO/btqEd8ltF3T/OqpyT1zscImDvmKArujFQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqbGQO%2FbtqEd8ltF3T%2FOqpyT1zscImDvmKArujFQ1%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;440&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Install 을 하게 되면 아래 팝업이 나오고 github pull requests를 위한 로그인 및 권한 설정을 진행하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9sPUE/btqEd8Tix0R/xvyPO4VNxVrPNzk2xOIPh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9sPUE/btqEd8Tix0R/xvyPO4VNxVrPNzk2xOIPh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9sPUE/btqEd8Tix0R/xvyPO4VNxVrPNzk2xOIPh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9sPUE%2FbtqEd8Tix0R%2FxvyPO4VNxVrPNzk2xOIPh1%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;255&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qfguE/btqEdjVmCKC/IDhQrwhhfGUIqBOQfI8Jn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qfguE/btqEdjVmCKC/IDhQrwhhfGUIqBOQfI8Jn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qfguE/btqEdjVmCKC/IDhQrwhhfGUIqBOQfI8Jn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqfguE%2FbtqEdjVmCKC%2FIDhQrwhhfGUIqBOQfI8Jn1%2Fimg.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;743&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ci00e/btqEbQmeDk0/uyFhC2K5xpVvd8YJmE3mDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ci00e/btqEbQmeDk0/uyFhC2K5xpVvd8YJmE3mDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ci00e/btqEbQmeDk0/uyFhC2K5xpVvd8YJmE3mDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCi00e%2FbtqEbQmeDk0%2FuyFhC2K5xpVvd8YJmE3mDk%2Fimg.png&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;743&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K9EXA/btqEcGwGwa0/DwxjM4EK41mvwsYOtD7Fjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K9EXA/btqEcGwGwa0/DwxjM4EK41mvwsYOtD7Fjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K9EXA/btqEcGwGwa0/DwxjM4EK41mvwsYOtD7Fjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK9EXA%2FbtqEcGwGwa0%2FDwxjM4EK41mvwsYOtD7Fjk%2Fimg.png&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;174&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모든 설치 및 설정이 끝나게 되면 아래와 같은 아이콘이 왼쪽 메뉴 리스트에 나타나게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TxSxQ/btqEcnxkTBa/HShpHUmDcaRK4phXNjcRG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TxSxQ/btqEcnxkTBa/HShpHUmDcaRK4phXNjcRG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TxSxQ/btqEcnxkTBa/HShpHUmDcaRK4phXNjcRG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTxSxQ%2FbtqEcnxkTBa%2FHShpHUmDcaRK4phXNjcRG0%2Fimg.png&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;441&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;5) 원본 repository 설정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;fork 된 repository 에서 원본 repository 에 pull requests 하기 위해서는 원본 repository를 upstream repository 로 아래와 같이 등록해 주어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;gt; git remote add upstream '원본 repository'&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/configuring-a-remote-for-a-fork&quot;&gt;https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/configuring-a-remote-for-a-fork&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1589729553023&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS D:\Github\Sample&amp;gt; git remote -v
origin  https://github.com/technotekr/Sample.git (fetch)
origin  https://github.com/technotekr/Sample.git (push)

PS D:\Github\Sample&amp;gt; git remote add upstream https://github.com/TechNoteCode/Sample.git   

PS D:\Github\Sample&amp;gt; git remote -v
origin  https://github.com/technotekr/Sample.git (fetch)
origin  https://github.com/technotekr/Sample.git (push)
upstream        https://github.com/TechNoteCode/Sample.git (fetch)
upstream        https://github.com/TechNoteCode/Sample.git (push)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dL9YQN/btqEcmrGnmV/A891N81dNlNPvEcWgp4ypK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dL9YQN/btqEcmrGnmV/A891N81dNlNPvEcWgp4ypK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dL9YQN/btqEcmrGnmV/A891N81dNlNPvEcWgp4ypK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdL9YQN%2FbtqEcmrGnmV%2FA891N81dNlNPvEcWgp4ypK%2Fimg.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;692&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;6) Pull Requests 진행&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;수정 내용을 commit/push 하였고, upstream repository 설정도 되었다면 P&lt;span style=&quot;color: #333333;&quot;&gt;ULL REQUESTS 옆 ' + ' 버튼을 눌러 &lt;/span&gt;pull requests 를 진행할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;10-0.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uWmeL/btqEepAwOsz/gIlipQmIs3hcFhfsYCYmj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uWmeL/btqEepAwOsz/gIlipQmIs3hcFhfsYCYmj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uWmeL/btqEepAwOsz/gIlipQmIs3hcFhfsYCYmj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuWmeL%2FbtqEepAwOsz%2FgIlipQmIs3hcFhfsYCYmj0%2Fimg.png&quot; data-filename=&quot;10-0.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;392&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pull request를 할 대상인 원본 repository (TechNoteCode:Sample) 을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQXvTh/btqEcTWSuFZ/2hL5nt58DKKtEgZ6LZnaik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQXvTh/btqEcTWSuFZ/2hL5nt58DKKtEgZ6LZnaik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQXvTh/btqEcTWSuFZ/2hL5nt58DKKtEgZ6LZnaik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQXvTh%2FbtqEcTWSuFZ%2F2hL5nt58DKKtEgZ6LZnaik%2Fimg.png&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;234&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pull Requests 대상 branch 를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b93rNi/btqEcopsSdV/mwhO6K7j7EKZwZ2nqbSS50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b93rNi/btqEcopsSdV/mwhO6K7j7EKZwZ2nqbSS50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b93rNi/btqEcopsSdV/mwhO6K7j7EKZwZ2nqbSS50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb93rNi%2FbtqEcopsSdV%2FmwhO6K7j7EKZwZ2nqbSS50%2Fimg.png&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;235&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pull Requests 의 제목으로 사용된 message/name 을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDkKD8/btqEbvvMowE/lRKpZBskukXPfaNzB74FS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDkKD8/btqEbvvMowE/lRKpZBskukXPfaNzB74FS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDkKD8/btqEbvvMowE/lRKpZBskukXPfaNzB74FS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDkKD8%2FbtqEbvvMowE%2FlRKpZBskukXPfaNzB74FS1%2Fimg.png&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;237&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;7) Pull Requests 등록 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;모든 선택을 마치면 아래와 같이 Pull Requests 가 등록됨을 확인할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qbrF3/btqEdxMwDKh/QVWStk1BFxnZ4KisG4CkM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qbrF3/btqEdxMwDKh/QVWStk1BFxnZ4KisG4CkM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qbrF3/btqEdxMwDKh/QVWStk1BFxnZ4KisG4CkM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqbrF3%2FbtqEdxMwDKh%2FQVWStk1BFxnZ4KisG4CkM0%2Fimg.png&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;692&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Web 으로는 아래와 같이 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pull Requests 를 등록한 계정의 입장에서는 반영을 할 수 없기 때문에 merge 버튼이 보이지 않지만 해당 repository에 write 권한이 있을 경우 수정 내용 리뷰 후에 merge 버튼을 통해 해당 수정 내용을 반영할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;14.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RxzNH/btqEdjA0gCx/gXI9OluMAcbxatD4dIuz40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RxzNH/btqEdjA0gCx/gXI9OluMAcbxatD4dIuz40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RxzNH/btqEdjA0gCx/gXI9OluMAcbxatD4dIuz40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRxzNH%2FbtqEdjA0gCx%2FgXI9OluMAcbxatD4dIuz40%2Fimg.png&quot; data-filename=&quot;14.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;584&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 id=&quot;third&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다수 개의 Pull Request 를 올리는 방법에 대한 이해&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;추가 수정의 PR (Pull Request) 등록&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 추가 수정을 PR 로 올리려면 어떻게 해야 할까.&lt;/p&gt;
&lt;p&gt;먼저 step3 과 같이 추가 수정 사항을 만들어 fork 된 origin/master branch 에 push 해보자&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) 추가 수정 내용 작성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2-0.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clu4M6/btqEn8rzUV4/8nZeofj4ZMnlY0VrtmMEX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clu4M6/btqEn8rzUV4/8nZeofj4ZMnlY0VrtmMEX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clu4M6/btqEn8rzUV4/8nZeofj4ZMnlY0VrtmMEX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fclu4M6%2FbtqEn8rzUV4%2F8nZeofj4ZMnlY0VrtmMEX1%2Fimg.png&quot; data-filename=&quot;2-0.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;244&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) Commit 내용 기입하여 git push 까지 진행&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2-1.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjmmY/btqEnHVgwkb/bzzc8cNYirsSWyShlr5kd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjmmY/btqEnHVgwkb/bzzc8cNYirsSWyShlr5kd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjmmY/btqEnHVgwkb/bzzc8cNYirsSWyShlr5kd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqjmmY%2FbtqEnHVgwkb%2Fbzzc8cNYirsSWyShlr5kd1%2Fimg.png&quot; data-filename=&quot;2-1.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;236&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2-2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LPAaw/btqEmKyryBx/HGVlABOdEToogUPO129Nl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LPAaw/btqEmKyryBx/HGVlABOdEToogUPO129Nl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LPAaw/btqEmKyryBx/HGVlABOdEToogUPO129Nl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLPAaw%2FbtqEmKyryBx%2FHGVlABOdEToogUPO129Nl1%2Fimg.png&quot; data-filename=&quot;2-2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;90&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) Pull Request 를 올리려고 하면 아래와 같이 Error 가 발생한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1590246771790&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Creating pull requests for 'technotekr:master' failed:
Validation Failed: A pull request already exists for technotekr:master

Source: GitHub Pull Requests and Issues (Extension)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2-4.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q3zTi/btqEmpao1En/Ki8R1yVnGbD3WzTikkd6VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q3zTi/btqEmpao1En/Ki8R1yVnGbD3WzTikkd6VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q3zTi/btqEmpao1En/Ki8R1yVnGbD3WzTikkd6VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq3zTi%2FbtqEmpao1En%2FKi8R1yVnGbD3WzTikkd6VK%2Fimg.png&quot; data-filename=&quot;2-4.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;234&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 이유를 알아보면 다음과 같이 새로운 수정에 대해 새로운 Pull Request가 올라가는게 아니라 현재 존재하는 Pull Request 에 새로운 Commit 으로 추가되어 올라간 것을 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2-3.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vPNn3/btqEnJeuOuh/GoYHgzWNOJ3BWx0jAmsjLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vPNn3/btqEnJeuOuh/GoYHgzWNOJ3BWx0jAmsjLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vPNn3/btqEnJeuOuh/GoYHgzWNOJ3BWx0jAmsjLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvPNn3%2FbtqEnJeuOuh%2FGoYHgzWNOJ3BWx0jAmsjLK%2Fimg.png&quot; data-filename=&quot;2-3.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;449&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;새로운 수정 사항에 대해 별도의 Pull Request 를 올리려면 어떻게 해야 할까.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 예에서는 기본으로 주어진 master branch 를 가지고 Pull Request의 예를 보여주었지만 Pull Request를 올리기 위해서는 fork 된 repository내에서 Pull Request 별로 별도의 branch를 만들고 Pull Request를 올리는 것으로 이해 하면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;즉, 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) fork 된 repository 내에 Pull Request를 작업하기 위한 branch를 생성한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) 해당 branch 에서 수정을 한 후 git push 후 Pull Request 를 올린다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) 작업 완료한 branch를 삭제한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) [Ctrl + Shift + `] 를 통해 terminal 을 연 후 아래 명령어로 원하는 commit 으로 부터의 branch를 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;Fork된 repository의 HEAD commit 으로 branch를 분기하여 생성할 수도 있겠지만 원본 repository (upstream/master) 의 HEAD 이후 commit 은 모두 같이 Pull Request로 올라가기 때문에 Fork 된 repository의 HEAD가 아닌 원본 repository 의 HEAD commit 으로 분기하는게 일반적이다.&amp;nbsp;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1590330425888&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout -b 'branch 이름' 'commit'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4-0.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;697&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be9kli/btqEm2lRGiG/Y2lsu9FXnkd5YOJkE4v7I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be9kli/btqEm2lRGiG/Y2lsu9FXnkd5YOJkE4v7I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be9kli/btqEm2lRGiG/Y2lsu9FXnkd5YOJkE4v7I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe9kli%2FbtqEm2lRGiG%2FY2lsu9FXnkd5YOJkE4v7I1%2Fimg.png&quot; data-filename=&quot;4-0.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;697&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) 코드 수정 후 원본 repository에 Pull Request 를 올린다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4-4.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJT1qM/btqEmv9T74V/heCkf2k9Ns8cU69AqjVntk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJT1qM/btqEmv9T74V/heCkf2k9Ns8cU69AqjVntk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJT1qM/btqEmv9T74V/heCkf2k9Ns8cU69AqjVntk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJT1qM%2FbtqEmv9T74V%2FheCkf2k9Ns8cU69AqjVntk%2Fimg.png&quot; data-filename=&quot;4-4.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;233&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3) 아래와 같이 이전 Pull Request 와는 분리되어 새로운 Pull Request 가 올라간 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4-7.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb9CcC/btqEoBt4ZAq/qiJtEk3KYrlbn5rzQgpUek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb9CcC/btqEoBt4ZAq/qiJtEk3KYrlbn5rzQgpUek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb9CcC/btqEoBt4ZAq/qiJtEk3KYrlbn5rzQgpUek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb9CcC%2FbtqEoBt4ZAq%2FqiJtEk3KYrlbn5rzQgpUek%2Fimg.png&quot; data-filename=&quot;4-7.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;488&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4-8.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JgQif/btqEn77NqTt/2eDIy4N31TuOnWGEgBvpZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JgQif/btqEn77NqTt/2eDIy4N31TuOnWGEgBvpZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JgQif/btqEn77NqTt/2eDIy4N31TuOnWGEgBvpZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJgQif%2FbtqEn77NqTt%2F2eDIy4N31TuOnWGEgBvpZ1%2Fimg.png&quot; data-filename=&quot;4-8.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;316&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4-9.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccnmKl/btqEo6AmXC7/nNio7KX9hN6wIvD9H1cnk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccnmKl/btqEo6AmXC7/nNio7KX9hN6wIvD9H1cnk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccnmKl/btqEo6AmXC7/nNio7KX9hN6wIvD9H1cnk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccnmKl%2FbtqEo6AmXC7%2FnNio7KX9hN6wIvD9H1cnk0%2Fimg.png&quot; data-filename=&quot;4-9.png&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;359&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;Trouble Shooting&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) Upstream repository 등록이 되어 있지 않을 경우 아래와 같은 에러가 발생할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이와 같은 Error Message 가 발생할 경우 step 5 와 같이 원본 repository 를 upstream repository 로 등록해 주어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1589730525892&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[Info] Review&amp;gt; Validating state...
[Info] No remote with name 'upstream' found. Please update your 'githubPullRequests.remotes' setting.
[Info] Found GitHub remote
[Info] Review&amp;gt; no matching pull request metadata found for current branch master
[Info] GitHubRepository&amp;gt; Creating pull requests failed: Error: No matching repository Sample found for TechNoteCode&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/VS Code</category>
      <category>github</category>
      <category>origin</category>
      <category>pull requests</category>
      <category>Repository</category>
      <category>Upstream</category>
      <category>vscode</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/354</guid>
      <comments>https://mytechmemo.tistory.com/354#entry354comment</comments>
      <pubDate>Mon, 18 May 2020 00:50:05 +0900</pubDate>
    </item>
    <item>
      <title>[VSCODE] Github 에 반영하기 (git commit/push)</title>
      <link>https://mytechmemo.tistory.com/353</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coygFI/btqElWfg9nP/wwGXOWkCmsHckCzARA5M61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coygFI/btqElWfg9nP/wwGXOWkCmsHckCzARA5M61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coygFI/btqElWfg9nP/wwGXOWkCmsHckCzARA5M61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoygFI%2FbtqElWfg9nP%2FwwGXOWkCmsHckCzARA5M61%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;253&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;git clone 하여 local PC 에 코드를 sync 한 이후 코드를 주성하여 다시 github repository 에 반영해야 하는 경우가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Github 와 연동하기 : &lt;a href=&quot;https://technote.kr/352&quot;&gt;https://technote.kr/352&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코드 반영은 Flow는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;1) 코드 수정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZjTdn/btqEeZBmJJL/X4kNZgdF8gyvXSgYUAJKL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZjTdn/btqEeZBmJJL/X4kNZgdF8gyvXSgYUAJKL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZjTdn/btqEeZBmJJL/X4kNZgdF8gyvXSgYUAJKL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZjTdn%2FbtqEeZBmJJL%2FX4kNZgdF8gyvXSgYUAJKL0%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;239&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) [Ctrl + Shit + `] 을 눌러서 teminal 을 실행시킨 후 수정 코드 실행해서 에러 유무 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba2Dao/btqEbRrHC9M/Y3tcA0bktsYha1XJ8IpKK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba2Dao/btqEbRrHC9M/Y3tcA0bktsYha1XJ8IpKK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba2Dao/btqEbRrHC9M/Y3tcA0bktsYha1XJ8IpKK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba2Dao%2FbtqEbRrHC9M%2FY3tcA0bktsYha1XJ8IpKK0%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3) 문제가 없을 경우 왼쪽 세번째 아이콘 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bajNGh/btqEbupXmn1/optuNWpqw3mFhKAV2PrxGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bajNGh/btqEbupXmn1/optuNWpqw3mFhKAV2PrxGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bajNGh/btqEbupXmn1/optuNWpqw3mFhKAV2PrxGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbajNGh%2FbtqEbupXmn1%2FoptuNWpqw3mFhKAV2PrxGk%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;347&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4) 자동으로 수정된 파일들이 탐지되고, 상단에 수정 내용 작성한 후 &quot;V&quot; 아이콘 선택하여&amp;nbsp; commit 생성 (git commit)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWgus5/btqEcHPFfGP/me0EmuF7oBVDChkfE9rJOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWgus5/btqEcHPFfGP/me0EmuF7oBVDChkfE9rJOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWgus5/btqEcHPFfGP/me0EmuF7oBVDChkfE9rJOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWgus5%2FbtqEcHPFfGP%2Fme0EmuF7oBVDChkfE9rJOk%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5) 하단에 push 가능한 commit 의 수가 나오고 해당 버튼 누르면 github repository 로 push 진행 (git push)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA6a3V/btqEd86CkSD/cskeF4QnW9UOyoOtEow500/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA6a3V/btqEd86CkSD/cskeF4QnW9UOyoOtEow500/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA6a3V/btqEd86CkSD/cskeF4QnW9UOyoOtEow500/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA6a3V%2FbtqEd86CkSD%2FcskeF4QnW9UOyoOtEow500%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;426&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;첫 push 시 아래와 같은 popup 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b25Oip/btqEcGwsNmp/igbuR9pzeLpundHqknQ6s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b25Oip/btqEcGwsNmp/igbuR9pzeLpundHqknQ6s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b25Oip/btqEcGwsNmp/igbuR9pzeLpundHqknQ6s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb25Oip%2FbtqEcGwsNmp%2FigbuR9pzeLpundHqknQ6s0%2Fimg.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;120&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6) 첫 push 시 vscode에서 반영하고자 하는 github repository 에 push 권한 여부 확인이 필요하여 아래와 같은 절차가 진행됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbcqF2/btqEeqsqL24/LoGu6MAGt3wplBwK4nxkIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbcqF2/btqEeqsqL24/LoGu6MAGt3wplBwK4nxkIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbcqF2/btqEeqsqL24/LoGu6MAGt3wplBwK4nxkIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbcqF2%2FbtqEeqsqL24%2FLoGu6MAGt3wplBwK4nxkIk%2Fimg.png&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;413&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/69pHP/btqEeY3w7r9/SDMr95PN3kFNIAa3Caa5MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/69pHP/btqEeY3w7r9/SDMr95PN3kFNIAa3Caa5MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/69pHP/btqEeY3w7r9/SDMr95PN3kFNIAa3Caa5MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F69pHP%2FbtqEeY3w7r9%2FSDMr95PN3kFNIAa3Caa5MK%2Fimg.png&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;580&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0KyN8/btqEd9qVgBw/LrsegAd7Itt2juY9BDCju1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0KyN8/btqEd9qVgBw/LrsegAd7Itt2juY9BDCju1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0KyN8/btqEd9qVgBw/LrsegAd7Itt2juY9BDCju1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0KyN8%2FbtqEd9qVgBw%2FLrsegAd7Itt2juY9BDCju1%2Fimg.png&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;729&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHU4DJ/btqEbvvzHTW/WfswJfuMDNHlDvmxMFvBg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHU4DJ/btqEbvvzHTW/WfswJfuMDNHlDvmxMFvBg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHU4DJ/btqEbvvzHTW/WfswJfuMDNHlDvmxMFvBg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHU4DJ%2FbtqEbvvzHTW%2FWfswJfuMDNHlDvmxMFvBg1%2Fimg.png&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;743&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;7) 일련의 과정들이 진행되고 하면 하단에 commit 가능한 숫자가 사라진 것을 확인할 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SGCD5/btqEdydr4JI/7lYrsE9sfe6AHy9z5koOb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SGCD5/btqEdydr4JI/7lYrsE9sfe6AHy9z5koOb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SGCD5/btqEdydr4JI/7lYrsE9sfe6AHy9z5koOb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSGCD5%2FbtqEdydr4JI%2F7lYrsE9sfe6AHy9z5koOb0%2Fimg.png&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;426&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;8) Github repository 에 가보면 수정한 파일이 push 되어 있음을 확인할 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oGxA5/btqEcnRqTou/ZkIqIi7Cp9DU1vb0U8WAA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oGxA5/btqEcnRqTou/ZkIqIi7Cp9DU1vb0U8WAA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oGxA5/btqEcnRqTou/ZkIqIi7Cp9DU1vb0U8WAA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoGxA5%2FbtqEcnRqTou%2FZkIqIi7Cp9DU1vb0U8WAA1%2Fimg.png&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;772&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;TroubleShooting&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) 자신의 repository 가 아닌 타 repository 에 반영시 권한이 없을 경우 아래와 같은 에러가 발생할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예&amp;gt; technotekr 이 TechNoteCode 가 생성한 repository 에 반영을 시도하였을 경우&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Git: remote: Permission to TechNoteCode/Sample.git denied to technotekr.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IDGA6/btqEbuwMCIc/3MqcCkX3nkk83Ifk4oNmFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IDGA6/btqEbuwMCIc/3MqcCkX3nkk83Ifk4oNmFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IDGA6/btqEbuwMCIc/3MqcCkX3nkk83Ifk4oNmFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIDGA6%2FbtqEbuwMCIc%2F3MqcCkX3nkk83Ifk4oNmFk%2Fimg.png&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;120&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;[상세 Git error log]&lt;/p&gt;
&lt;pre id=&quot;code_1589697922467&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; git pull --tags origin master
&amp;gt; git ls-files --stage -- D:\GithubCode\Sample\test.py
&amp;gt; git cat-file -s 29977e7f62693b29697d057e9b23e51f56d6df94
&amp;gt; git show :test.py
&amp;gt; git ls-files --stage -- D:\GithubCode\Sample\test.py
From https://github.com/TechNoteCode/Sample
 * branch            master     -&amp;gt; FETCH_HEAD
&amp;gt; git push origin master:master
&amp;gt; git cat-file -s 29977e7f62693b29697d057e9b23e51f56d6df94
&amp;gt; git show :test.py
&amp;gt; git ls-files --stage -- D:\GithubCode\Sample\test.py
&amp;gt; git cat-file -s 29977e7f62693b29697d057e9b23e51f56d6df94
remote: Permission to TechNoteCode/Sample.git denied to technotekr.
fatal: unable to access 'https://github.com/TechNoteCode/Sample.git/': The requested URL returned error: 403&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/VS Code</category>
      <category>github</category>
      <category>vscode</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/353</guid>
      <comments>https://mytechmemo.tistory.com/353#entry353comment</comments>
      <pubDate>Sun, 17 May 2020 15:35:13 +0900</pubDate>
    </item>
    <item>
      <title>[VSCODE] Github 와 연동하기 (git clone)</title>
      <link>https://mytechmemo.tistory.com/352</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCBZIf/btqEn8kOqY9/jxWlgEoPilW2uYgJ8c0eV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCBZIf/btqEn8kOqY9/jxWlgEoPilW2uYgJ8c0eV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCBZIf/btqEn8kOqY9/jxWlgEoPilW2uYgJ8c0eV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCBZIf%2FbtqEn8kOqY9%2FjxWlgEoPilW2uYgJ8c0eV1%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;260&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;vscode 를 기반으로 github project 를 작업할 때 가장 먼저 진행되어야 할 것은 github repository를 local PC로 git clone 하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;cmd 로 진행시에는 아래와 같이 진행하면 되지만 vscode 와 연동시에는 vscode의 UI 를 통해 진행해야 자동으로 vscode의 workspace까지 생성된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1589676695581&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;D:\Github&amp;gt;git clone https://github.com/technotekr/Sample.git
Cloning into 'Sample'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;vscode로 github repository clone 하는 과정은 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;1) git clone 메뉴 선택하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;F1 &amp;gt; 'git clone' 입력 &amp;gt; 'Git: Clone' 메뉴 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1-1.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1IrSa/btqEcGpAHAU/LtEHkrI01Y6MTmKipVZEyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1IrSa/btqEcGpAHAU/LtEHkrI01Y6MTmKipVZEyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1IrSa/btqEcGpAHAU/LtEHkrI01Y6MTmKipVZEyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1IrSa%2FbtqEcGpAHAU%2FLtEHkrI01Y6MTmKipVZEyk%2Fimg.png&quot; data-filename=&quot;1-1.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;141&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;혹은&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;왼쪽 위 문서 아이콘 선택 &amp;gt; 'Clone Repository' 버튼 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1-2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NaISa/btqEdyj4mkx/C9ZQLlaQMlzKTDNNM60YK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NaISa/btqEdyj4mkx/C9ZQLlaQMlzKTDNNM60YK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NaISa/btqEdyj4mkx/C9ZQLlaQMlzKTDNNM60YK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNaISa%2FbtqEdyj4mkx%2FC9ZQLlaQMlzKTDNNM60YK0%2Fimg.png&quot; data-filename=&quot;1-2.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;399&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) git 주소 입력하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZPhee/btqEepmDNEh/kmSnp5aki04XVce727AKBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZPhee/btqEepmDNEh/kmSnp5aki04XVce727AKBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZPhee/btqEepmDNEh/kmSnp5aki04XVce727AKBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZPhee%2FbtqEepmDNEh%2FkmSnp5aki04XVce727AKBk%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;125&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;github 사이트에서 'Clone or download' 버튼 선택 후 주소 복사 아이콘 선택하면 git 주소 자동 복사 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5PYkO/btqEcUgO7U8/T5Z4vLUgIH9AkPmWxhlKX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5PYkO/btqEcUgO7U8/T5Z4vLUgIH9AkPmWxhlKX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5PYkO/btqEcUgO7U8/T5Z4vLUgIH9AkPmWxhlKX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5PYkO%2FbtqEcUgO7U8%2FT5Z4vLUgIH9AkPmWxhlKX1%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;273&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) git 주소 입력 후 local PC 에 저장될 위치 선택하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L6boR/btqEdxZKPv1/xQJuOuDIqJeA2eA0E8IQ5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L6boR/btqEdxZKPv1/xQJuOuDIqJeA2eA0E8IQ5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L6boR/btqEdxZKPv1/xQJuOuDIqJeA2eA0E8IQ5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL6boR%2FbtqEdxZKPv1%2FxQJuOuDIqJeA2eA0E8IQ5k%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;432&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4) local PC 저장 위치 선택 후 현재 창에서 열 경우 'Open', 새로운 창에서 열 경우 'Open in New Window' 선택&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmnrLl/btqEd7NhVVs/nN5qwZVYWqf1sf6kXuqzc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmnrLl/btqEd7NhVVs/nN5qwZVYWqf1sf6kXuqzc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmnrLl/btqEd7NhVVs/nN5qwZVYWqf1sf6kXuqzc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmnrLl%2FbtqEd7NhVVs%2FnN5qwZVYWqf1sf6kXuqzc0%2Fimg.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;140&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biHz7s/btqEdjHqY4C/cJKU4TWV73zuDrOVKV7Swk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biHz7s/btqEdjHqY4C/cJKU4TWV73zuDrOVKV7Swk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biHz7s/btqEdjHqY4C/cJKU4TWV73zuDrOVKV7Swk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiHz7s%2FbtqEdjHqY4C%2FcJKU4TWV73zuDrOVKV7Swk%2Fimg.png&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;121&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;5) 이후 github 에서 local PC 로 clone 된 workspace 를 확인 가능&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBOa39/btqEdw7BlEf/FG7IQ9PXRxdNn1NwbitGNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBOa39/btqEdw7BlEf/FG7IQ9PXRxdNn1NwbitGNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBOa39/btqEdw7BlEf/FG7IQ9PXRxdNn1NwbitGNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBOa39%2FbtqEdw7BlEf%2FFG7IQ9PXRxdNn1NwbitGNK%2Fimg.png&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;671&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/VS Code</category>
      <category>github</category>
      <category>visual studio code</category>
      <category>vscode</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/352</guid>
      <comments>https://mytechmemo.tistory.com/352#entry352comment</comments>
      <pubDate>Sun, 17 May 2020 09:52:58 +0900</pubDate>
    </item>
    <item>
      <title>Chromium Edge 에서 chromecast 사용하기.</title>
      <link>https://mytechmemo.tistory.com/351</link>
      <description>&lt;p&gt;Microsoft Chromium Edge 를 사용하다 보면 chromecast 와 같이 외부에서 미디어를 재생하게 해주는 아이콘이 보이지 않는 경우가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Chromium Edge 관련 링크 : &lt;a href=&quot;https://technote.kr/326&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;Chromium Edge 의 사용 및 비교&lt;/b&gt;&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같이&amp;nbsp; Chromium Edge 를 통해 Youtube 를 볼 경우 Chrome 에서는 보이는 &quot;TV에서 재생&quot; 아이콘이 보이지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dbwzo/btqC1GR5A2u/amksLN8mtdSxBUikxcAzuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dbwzo/btqC1GR5A2u/amksLN8mtdSxBUikxcAzuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dbwzo/btqC1GR5A2u/amksLN8mtdSxBUikxcAzuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDbwzo%2FbtqC1GR5A2u%2FamksLN8mtdSxBUikxcAzuK%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;628&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이런 상황에서 빈 화면의 아무 곳을 선택하여 마우스 오른 버튼을 눌러 나오는 메뉴 중 &quot;장치로 미디어 캐스트&quot; 를 선택하거나,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3Slt8/btqC4uQpBcv/kkxgfaeCkInOwqC9nSXlOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3Slt8/btqC4uQpBcv/kkxgfaeCkInOwqC9nSXlOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3Slt8/btqC4uQpBcv/kkxgfaeCkInOwqC9nSXlOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3Slt8%2FbtqC4uQpBcv%2FkkxgfaeCkInOwqC9nSXlOK%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;623&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오른쪽 위 메뉴 버튼을 눌러 &quot;메뉴 &amp;gt; 기타 도구 &amp;gt; 장치로 미디어 캐스트&quot; 를 선택하여 원하는 기능을 동작시켜도 된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvWVYx/btqC1GqWDPm/PlwMMr6UTi79pKvxobZTz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvWVYx/btqC1GqWDPm/PlwMMr6UTi79pKvxobZTz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvWVYx/btqC1GqWDPm/PlwMMr6UTi79pKvxobZTz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvWVYx%2FbtqC1GqWDPm%2FPlwMMr6UTi79pKvxobZTz0%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;636&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;반면 chrome 과 동일하게 &quot;TV에서 재생&quot; 아이콘이 나오게 하려면 다음과 같이 하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) 주소창에 &quot;edge://flags&quot; 입력&lt;/p&gt;
&lt;p&gt;2) 검색창에 load-media-router-component-extension 입력&lt;/p&gt;
&lt;p&gt;3) 결과로 나온 &quot;Load Media Router Component Extension&quot; 에서 &quot;Enabled&quot; 선택&lt;/p&gt;
&lt;p&gt;4) 브라우저 재실행&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYpTs2/btqC3qnoGbW/rZ7iMl35qlbkHCLS6rwDX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYpTs2/btqC3qnoGbW/rZ7iMl35qlbkHCLS6rwDX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYpTs2/btqC3qnoGbW/rZ7iMl35qlbkHCLS6rwDX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYpTs2%2FbtqC3qnoGbW%2FrZ7iMl35qlbkHCLS6rwDX1%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;433&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;재실행 직후 확인해 보면 아래와 같이 &quot;TV에서 재생&quot; 아이콘이 생긴 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약 아이콘이 보이지 않을 경우 &quot;F5&quot; 를 통해 새로 고침을 하면 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3MmRQ/btqC219gI3d/cL0AIkiv1wqm0io9kgL810/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3MmRQ/btqC219gI3d/cL0AIkiv1wqm0io9kgL810/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3MmRQ/btqC219gI3d/cL0AIkiv1wqm0io9kgL810/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3MmRQ%2FbtqC219gI3d%2FcL0AIkiv1wqm0io9kgL810%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;626&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services</category>
      <category>cast</category>
      <category>Chromium Edge</category>
      <category>Media</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/351</guid>
      <comments>https://mytechmemo.tistory.com/351#entry351comment</comments>
      <pubDate>Sun, 29 Mar 2020 15:30:45 +0900</pubDate>
    </item>
    <item>
      <title>Python - pywinauto, Microsoft Windows GUI 제어 자동화</title>
      <link>https://mytechmemo.tistory.com/350</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;title.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqC0TU/btqEni9iw5g/gPJ8X6eUY6AQOsqP2serfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqC0TU/btqEni9iw5g/gPJ8X6eUY6AQOsqP2serfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqC0TU/btqEni9iw5g/gPJ8X6eUY6AQOsqP2serfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqC0TU%2FbtqEni9iw5g%2FgPJ8X6eUY6AQOsqP2serfK%2Fimg.png&quot; data-filename=&quot;title.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;400&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;pywinauto&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;WebSite : &lt;a href=&quot;http://pywinauto.github.io/&quot;&gt;http://pywinauto.github.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Github :&amp;nbsp;&lt;a href=&quot;https://github.com/pywinauto/pywinauto&quot;&gt;https://github.com/pywinauto/pywinauto&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Doc :&amp;nbsp;&lt;a href=&quot;https://pywinauto.readthedocs.io/en/latest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pywinauto.readthedocs.io/en/latest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Microsoft Windows GUI 제어를 자동화할 수 있는 Python Module&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;gt; pip3 install pywinauto&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(pywinauto 설치시 six, comtypes, pywin32 또한 의존성에 의해 자동 설치된다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용의 예&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) &quot;메모장&quot; 실행 후 &quot;Sample&quot; 문자열을 입력하는 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1582905318647&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pywinauto.application import Application
app = Application(backend=&quot;uia&quot;).start(&quot;notepad.exe&quot;)
app['Dialog']['Edit'].set_text(&quot;Sample&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위에서 사용된 app[&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;'Dialog'&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;'Edit'&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;].set_text(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;Sample&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;) 은 아래와 같이 바꿔서 사용이 가능하다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;app['제목 없음 - Windows 메모장Dialog']['Edit'].set_text(&quot;Sample&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;app['제목 없음 - Windows 메모장']['Edit'].set_text(&quot;Sample&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;app['Dia']['Edit'].set_text(&quot;Sample&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;pywinauto.findbestmatch (&lt;a href=&quot;https://pywinauto.readthedocs.io/en/latest/code/pywinauto.findbestmatch.html&quot;&gt;https://pywinauto.readthedocs.io/en/latest/code/pywinauto.findbestmatch.html&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;를 통해 아래 리스트 중 하나를 대략적으로 입력하면 가장 적절한 하위 element 를 골라 준다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(pywinauto 에서는 magic attribute name 이라고 칭하고 있음.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) title (window text, name) &lt;br /&gt;2) title and control type &lt;br /&gt;3) control type and number &lt;br /&gt;4) top-left label and control type &lt;br /&gt;5) control type and item text&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) 이미 실행되어 있는 &quot;메모장&quot;에 &quot;Sample&quot; 문자열을 입력하는 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1582964879306&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pywinauto.application import Application
app = Application(backend=&quot;uia&quot;).connect(path=&quot;notepad.exe&quot;)
app['Dialog']['Edit'].set_text(&quot;Sample&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약 &quot;메모장&quot;이 실해되어 있지 않다면 아래 에러가 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1582964932962&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Traceback (most recent call last):
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\timings.py&quot;, line 436, in wait_until_passes
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\application.py&quot;, line 1458, in process_from_module
    raise ProcessNotFoundError(message)
pywinauto.application.ProcessNotFoundError: Could not find any accessible process with a module of 'notepad.exe'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\application.py&quot;, line 976, in connect
    self.process = timings.wait_until_passes(
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\timings.py&quot;, line 458, in wait_until_passes
    raise err
pywinauto.timings.TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File &quot;d:/workspace/PythonStudy/test01.py&quot;, line 2, in &amp;lt;module&amp;gt;
    app = Application(backend=&quot;uia&quot;).connect(path=&quot;notepad.exe&quot;)
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\application.py&quot;, line 981, in connect
    raise ProcessNotFoundError('Process &quot;{}&quot; not found!'.format(kwargs['path']))
pywinauto.application.ProcessNotFoundError: Process &quot;notepad.exe&quot; not found!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) 메뉴 Control 하기&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1582985236628&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pywinauto.application import Application
app = Application(backend=&quot;uia&quot;).connect(path=&quot;notepad.exe&quot;)
app['Dialog'].menu_select(&quot;파일(F)-&amp;gt;열기(O)&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;메뉴의 Text 를 이용하여 menu_select 함수로 처리한다. 만약 입력한 Text를 이용해 유사한 메뉴 조차 찾지 못한다면 아래와 같이 선택 가능한 리스트와 함께 에러가 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1582985365785&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\controls\uiawrapper.py&quot;, line 723, in menu_select
    menu.item_by_path(path, exact).select()
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\controls\uia_controls.py&quot;, line 1064, in item_by_path
    menu = next_level_menu(menu, menu_items[i], items_cnt == i + 1)
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\controls\uia_controls.py&quot;, line 1044, in next_level_menu
    return self._sub_item_by_text(parent_menu, item_name, exact, is_last)
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\controls\uia_controls.py&quot;, line 1006, in _sub_item_by_text
    sub_item = findbestmatch.find_best_match(name, texts, items)
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\findbestmatch.py&quot;, line 133, in find_best_match
    raise MatchError(items = text_item_map.keys(), tofind = search_text)
pywinauto.findbestmatch.MatchError: Could not find '열기' in 'dict_keys(['새로 만들기(N)', '새 창(W)', '열기(O)...', '저장(S)', '다른 이름으로 저장(A)...', '페이지 설정(U)...', '인쇄(P)...', '끝내기(X)'])'  &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특이사항&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Python 3.8.1 에서 import pywinauto 시 아래와 같은 error 발생한다.&lt;/p&gt;
&lt;p&gt;Python 3.8.0 이나 3.8.2 사용이 필요하다.&lt;/p&gt;
&lt;pre id=&quot;code_1582905166014&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;D:\&amp;gt;python
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&amp;gt;&amp;gt;&amp;gt; import pywinauto
Traceback (most recent call last):
  File &quot;D:\Python\381_64\lib\ctypes\__init__.py&quot;, line 123, in WINFUNCTYPE
    return _win_functype_cache[(restype, argtypes, flags)]
KeyError: (&amp;lt;class 'ctypes.HRESULT'&amp;gt;, (&amp;lt;class 'ctypes.c_long'&amp;gt;, &amp;lt;class 'comtypes.automation.tagVARIANT'&amp;gt;, &amp;lt;class 'comtypes.LP_POINTER(IUIAutomationCondition)'&amp;gt;), 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
  File &quot;D:\Python\381_64\lib\site-packages\pywinauto\__init__.py&quot;, line 89, in &amp;lt;module&amp;gt;
    from . import findwindows
  File &quot;D:\Python\381_64\lib\site-packages\pywinauto\findwindows.py&quot;, line 42, in &amp;lt;module&amp;gt;
    from . import controls
  File &quot;D:\Python\381_64\lib\site-packages\pywinauto\controls\__init__.py&quot;, line 36, in &amp;lt;module&amp;gt;
    from . import uiawrapper # register &quot;uia&quot; back-end (at the end of uiawrapper module)
  File &quot;D:\Python\381_64\lib\site-packages\pywinauto\controls\uiawrapper.py&quot;, line 47, in &amp;lt;module&amp;gt;
    from ..uia_defines import IUIA
  File &quot;D:\Python\381_64\lib\site-packages\pywinauto\uia_defines.py&quot;, line 181, in &amp;lt;module&amp;gt;
    pattern_ids = _build_pattern_ids_dic()
  File &quot;D:\Python\381_64\lib\site-packages\pywinauto\uia_defines.py&quot;, line 169, in _build_pattern_ids_dic
    if hasattr(IUIA().ui_automation_client, cls_name):
  File &quot;D:\Python\381_64\lib\site-packages\pywinauto\uia_defines.py&quot;, line 50, in __call__
    cls._instances[cls] = super(_Singleton, cls).__call__(*args, **kwargs)
  File &quot;D:\Python\381_64\lib\site-packages\pywinauto\uia_defines.py&quot;, line 60, in __init__
    self.UIA_dll = comtypes.client.GetModule('UIAutomationCore.dll')
  File &quot;D:\Python\381_64\lib\site-packages\comtypes\client\_generate.py&quot;, line 110, in GetModule
    mod = _CreateWrapper(tlib, pathname)
  File &quot;D:\Python\381_64\lib\site-packages\comtypes\client\_generate.py&quot;, line 184, in _CreateWrapper
    mod = _my_import(fullname)
  File &quot;D:\Python\381_64\lib\site-packages\comtypes\client\_generate.py&quot;, line 24, in _my_import
    return __import__(fullname, globals(), locals(), ['DUMMY'])
  File &quot;D:\Python\381_64\lib\site-packages\comtypes\gen\_944DE083_8FB8_45CF_BCB7_C477ACB2F897_0_1_0.py&quot;, line 1071, in &amp;lt;module&amp;gt;
    IUIAutomation._methods_ = [
  File &quot;D:\Python\381_64\lib\site-packages\comtypes\__init__.py&quot;, line 329, in __setattr__
    self._make_methods(value)
  File &quot;D:\Python\381_64\lib\site-packages\comtypes\__init__.py&quot;, line 698, in _make_methods
    prototype = WINFUNCTYPE(restype, *argtypes)
  File &quot;D:\Python\381_64\lib\ctypes\__init__.py&quot;, line 125, in WINFUNCTYPE
    class WinFunctionType(_CFuncPtr):
TypeError: item 2 in _argtypes_ passes a union by value, which is unsupported.
&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>pywinauto</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/350</guid>
      <comments>https://mytechmemo.tistory.com/350#entry350comment</comments>
      <pubDate>Sat, 29 Feb 2020 01:03:47 +0900</pubDate>
    </item>
    <item>
      <title>Python - PyInspect 설치 및 실행</title>
      <link>https://mytechmemo.tistory.com/349</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1)&amp;nbsp;&lt;a href=&quot;https://github.com/pywinauto/py_inspect&quot;&gt;https://github.com/pywinauto/py_inspect&lt;/a&gt;&amp;nbsp;에 접속하여 code 다운로드&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHQbBd/btqClxAS3tP/n9rmusSreNqGcTi178WCK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHQbBd/btqClxAS3tP/n9rmusSreNqGcTi178WCK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHQbBd/btqClxAS3tP/n9rmusSreNqGcTi178WCK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHQbBd%2FbtqClxAS3tP%2Fn9rmusSreNqGcTi178WCK1%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;466&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) python 3.5 이상, pywinauto, PyQt5 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3) &quot;python py_inspect.py&quot; 으로 실행&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XVemN/btqCkRfkXHj/hLOCn9w9yfdKm5BMm5Ha9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XVemN/btqCkRfkXHj/hLOCn9w9yfdKm5BMm5Ha9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XVemN/btqCkRfkXHj/hLOCn9w9yfdKm5BMm5Ha9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXVemN%2FbtqCkRfkXHj%2FhLOCn9w9yfdKm5BMm5Ha9k%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;663&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특이사항&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) 실행시 2회 실패 후 3회시 부터 정상 실행됨.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1회 실패시 에러 내용&lt;/p&gt;
&lt;pre id=&quot;code_1582888378043&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;D:\workspace\py_inspect-master&amp;gt;python py_inspect.py
QWindowsContext: OleInitialize() failed:  &quot;COM error 0xffffffff80010106 RPC_E_CHANGED_MODE (Unknown error 0x080010106)&quot;
Traceback (most recent call last):
  File &quot;py_inspect.py&quot;, line 147, in &amp;lt;module&amp;gt;
    main()
  File &quot;py_inspect.py&quot;, line 12, in main
    w = MyWindow()
  File &quot;py_inspect.py&quot;, line 41, in __init__
    self.__initialize_calc()
  File &quot;py_inspect.py&quot;, line 50, in __initialize_calc
    self.tree_model = MyTreeModel(self.element_info, _backend)
  File &quot;py_inspect.py&quot;, line 77, in __init__
    self.__get_next(element_info, self.branch)
  File &quot;py_inspect.py&quot;, line 81, in __get_next
    self.__generate_props_dict(child)
  File &quot;py_inspect.py&quot;, line 96, in __generate_props_dict
    ['enabled', str(element_info.enabled)],
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\uia_element_info.py&quot;, line 321, in enabled
    return bool(self._element.CurrentIsEnabled)
_ctypes.COMError: (-2147024891, '액세스가 거부되었습니다.', (None, None, None, 0, None))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2회 실패시 에러 내용&lt;/p&gt;
&lt;pre id=&quot;code_1582888408091&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;D:\workspace\py_inspect-master&amp;gt;python py_inspect.py
QWindowsContext: OleInitialize() failed:  &quot;COM error 0xffffffff80010106 RPC_E_CHANGED_MODE (Unknown error 0x080010106)&quot;
Traceback (most recent call last):
  File &quot;py_inspect.py&quot;, line 147, in &amp;lt;module&amp;gt;
    main()
  File &quot;py_inspect.py&quot;, line 12, in main
    w = MyWindow()
  File &quot;py_inspect.py&quot;, line 41, in __init__
    self.__initialize_calc()
  File &quot;py_inspect.py&quot;, line 50, in __initialize_calc
    self.tree_model = MyTreeModel(self.element_info, _backend)
  File &quot;py_inspect.py&quot;, line 77, in __init__
    self.__get_next(element_info, self.branch)
  File &quot;py_inspect.py&quot;, line 81, in __get_next
    self.__generate_props_dict(child)
  File &quot;py_inspect.py&quot;, line 100, in __generate_props_dict
    ['rectangle', str(element_info.rectangle)],
  File &quot;D:\Python\382_64\lib\site-packages\pywinauto\uia_element_info.py&quot;, line 326, in rectangle
    bound_rect = self._element.CurrentBoundingRectangle
_ctypes.COMError: (-2147220991, '이벤트에서 가입자를 불러낼 수 없습니다.', (None, None, None, 0, None))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) Microsoft Inspect 와 달리 표시 내용이 제한적임&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Microsoft Inspect : &lt;a href=&quot;https://technote.kr/348&quot;&gt;https://technote.kr/348&lt;span style=&quot;color: #333333;&quot;&gt;oft Inspe&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>PyInspect</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/349</guid>
      <comments>https://mytechmemo.tistory.com/349#entry349comment</comments>
      <pubDate>Fri, 28 Feb 2020 20:15:23 +0900</pubDate>
    </item>
    <item>
      <title>Microsoft Inspect 설치 및 실행</title>
      <link>https://mytechmemo.tistory.com/348</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://visualstudio.microsoft.com/&quot;&gt;https://visualstudio.microsoft.com/&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에 접속&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cofhON/btqCl9fub1s/8w0spXuRjtxyjA1p9PUkf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cofhON/btqCl9fub1s/8w0spXuRjtxyjA1p9PUkf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cofhON/btqCl9fub1s/8w0spXuRjtxyjA1p9PUkf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcofhON%2FbtqCl9fub1s%2F8w0spXuRjtxyjA1p9PUkf1%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;692&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) 설치 파일을 실행하고 &quot;Windows 10 SDK&quot; 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yAX4Y/btqCjRNpiQ3/EraNZVF36ktw1bDkXOE1Fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yAX4Y/btqCjRNpiQ3/EraNZVF36ktw1bDkXOE1Fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yAX4Y/btqCjRNpiQ3/EraNZVF36ktw1bDkXOE1Fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyAX4Y%2FbtqCjRNpiQ3%2FEraNZVF36ktw1bDkXOE1Fk%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;720&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3) &quot;C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64&quot; 내 inspect.exe 실행&lt;/p&gt;
&lt;p&gt;(버전에 따라 경로는 상이할 수 있음)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cB67WR/btqChG61nKJ/uPbMk6YCTYEPn7sMJfQz1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cB67WR/btqChG61nKJ/uPbMk6YCTYEPn7sMJfQz1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cB67WR/btqChG61nKJ/uPbMk6YCTYEPn7sMJfQz1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcB67WR%2FbtqChG61nKJ%2FuPbMk6YCTYEPn7sMJfQz1k%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;224&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4) 아래와 같이 Inspect 가 실행&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1e6c/btqCn0P7Acm/bCl0RpTX6nw7USqkClUvP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1e6c/btqCn0P7Acm/bCl0RpTX6nw7USqkClUvP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1e6c/btqCn0P7Acm/bCl0RpTX6nw7USqkClUvP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1e6c%2FbtqCn0P7Acm%2FbCl0RpTX6nw7USqkClUvP0%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;349&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Windows</category>
      <category>Inspect</category>
      <category>Microsoft</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/348</guid>
      <comments>https://mytechmemo.tistory.com/348#entry348comment</comments>
      <pubDate>Fri, 28 Feb 2020 19:51:17 +0900</pubDate>
    </item>
    <item>
      <title>Microsoft Spy++ 설치 및 실행</title>
      <link>https://mytechmemo.tistory.com/347</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) &lt;a href=&quot;https://visualstudio.microsoft.com/&quot;&gt;https://visualstudio.microsoft.com/&lt;/a&gt; 에 접속&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvegkK/btqChGlwe3E/x3HLbkfCVGGT6a6t7h3yo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvegkK/btqChGlwe3E/x3HLbkfCVGGT6a6t7h3yo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvegkK/btqChGlwe3E/x3HLbkfCVGGT6a6t7h3yo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvegkK%2FbtqChGlwe3E%2Fx3HLbkfCVGGT6a6t7h3yo1%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;692&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) 설치 파일을 실행하고 &quot;C++를 사용한 데스크톱 개발&quot; 및 &quot;C++ 프로파일링 도구&quot; 선택 후 설치&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ea5euE/btqCjSrXRBu/kGlklKyb5NUxXhZ6LL6rkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ea5euE/btqCjSrXRBu/kGlklKyb5NUxXhZ6LL6rkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ea5euE/btqCjSrXRBu/kGlklKyb5NUxXhZ6LL6rkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fea5euE%2FbtqCjSrXRBu%2FkGlklKyb5NUxXhZ6LL6rkk%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;720&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3) 설치된 Visual Studio 2019 를 실행하고 &quot;도구 &amp;gt; Spy++&quot; 을 선택&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qcOnF/btqCjSerFUf/iFOzP6nkVuhNZS7tuObvy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qcOnF/btqCjSerFUf/iFOzP6nkVuhNZS7tuObvy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qcOnF/btqCjSerFUf/iFOzP6nkVuhNZS7tuObvy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqcOnF%2FbtqCjSerFUf%2FiFOzP6nkVuhNZS7tuObvy0%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;734&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4) 아래와 같이 Microsoft Spy++ 가 실행&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brTE7E/btqCpP8oKMC/txIBuerkxc5QGbhGNuOTok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brTE7E/btqCpP8oKMC/txIBuerkxc5QGbhGNuOTok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brTE7E/btqCpP8oKMC/txIBuerkxc5QGbhGNuOTok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrTE7E%2FbtqCpP8oKMC%2FtxIBuerkxc5QGbhGNuOTok%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;543&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Windows</category>
      <category>Microsoft</category>
      <category>Spy++</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/347</guid>
      <comments>https://mytechmemo.tistory.com/347#entry347comment</comments>
      <pubDate>Fri, 28 Feb 2020 19:41:43 +0900</pubDate>
    </item>
    <item>
      <title>Python - reduce(), 인자를 누적적으로 적용하여 결과를 반환</title>
      <link>https://mytechmemo.tistory.com/344</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;reduce&lt;/h3&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; functools.reduce(function,&amp;nbsp;iterable[,&amp;nbsp;initializer])&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;iterable 한 data를 왼쪽에서 오른쪽으로 누적적으로 fuction 의 인자로 넣어 하나의 결과를 반환하는 함수&lt;/p&gt;
&lt;p&gt;python2 에서는 builtin 함수로 바로 사용할 수 있었지만 python3 에서는 functools 모듈의 함수로 포함되어 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[Link :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://technote.kr/325&quot;&gt;iterable 과 iterator, 그리고 반복문&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;functools.reduce(function,&amp;nbsp;iterable[,&amp;nbsp;initializer])&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Apply&amp;nbsp;function&amp;nbsp;of two arguments cumulatively to the items of&amp;nbsp;iterable, from left to right, so as to reduce the iterable to a single value. For example,&amp;nbsp;reduce(lambda&amp;nbsp;x,&amp;nbsp;y:&amp;nbsp;x+y,&amp;nbsp;[1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5])&amp;nbsp;calculates&amp;nbsp;((((1+2)+3)+4)+5). The left argument,&amp;nbsp;x, is the accumulated value and the right argument,&amp;nbsp;y, is the update value from the&amp;nbsp;iterable. If the optional&amp;nbsp;initializer&amp;nbsp;is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If&amp;nbsp;initializer&amp;nbsp;is not given and&amp;nbsp;iterable&amp;nbsp;contains only one item, the first item is returned.&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;[Python3 기준 예제]&lt;/p&gt;
&lt;pre id=&quot;code_1582426731207&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from functools import reduce
&amp;gt;&amp;gt;&amp;gt; data = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; def sum(a, b):
...     return a + b
...
&amp;gt;&amp;gt;&amp;gt; reduce(sum, data)            
15 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 reduce 를 풀어 써보면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;sum(sum(sum(sum(1, 2), 3), 4), 5)&lt;/p&gt;
&lt;p&gt;==&amp;gt; ((((1 + 2) + 3) + 4) +5)&lt;/p&gt;
&lt;p&gt;==&amp;gt; 15&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;functools.reduce 에 정의된 바와 같이 two arguments 에 대해 동작하고, 만약 인자가 3개인 function 을 넣을 경우 아래와 같이 Exception 이 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1582427231714&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; def sum(a, b, c):
...     return a + b + c
... 
&amp;gt;&amp;gt;&amp;gt; reduce(sum, data)
Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
TypeError: sum() missing 1 required positional argument: 'c'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;가장 흔하게 쓰이는 factorial 계산을 위해 reduce를 아래와 같이 사용할 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;[Case 1]&lt;/p&gt;
&lt;pre id=&quot;code_1582427390058&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import functools 

def mult(x, y):
    return x * y


def factorial(n):
    if n == 0:
        return 1
    else:
        functools.reduce(mult(n,factorial(n - 1)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Case 2]&lt;/p&gt;
&lt;pre id=&quot;code_1582427415834&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import functools, operator
&amp;gt;&amp;gt;&amp;gt; functools.reduce(operator.mul, xrange(1, 6))
120&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;help(reduce) &lt;br /&gt;Help&amp;nbsp;on&amp;nbsp;built-in&amp;nbsp;function&amp;nbsp;reduce&amp;nbsp;in&amp;nbsp;module&amp;nbsp;_functools:&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;&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;&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;&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;&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;&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;&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;&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;&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;&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;&lt;br /&gt;reduce(...) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reduce(function,&amp;nbsp;sequence[,&amp;nbsp;initial])&amp;nbsp;-&amp;gt;&amp;nbsp;value &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Apply&amp;nbsp;a&amp;nbsp;function&amp;nbsp;of&amp;nbsp;two&amp;nbsp;arguments&amp;nbsp;cumulatively&amp;nbsp;to&amp;nbsp;the&amp;nbsp;items&amp;nbsp;of&amp;nbsp;a&amp;nbsp;sequence, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;left&amp;nbsp;to&amp;nbsp;right,&amp;nbsp;so&amp;nbsp;as&amp;nbsp;to&amp;nbsp;reduce&amp;nbsp;the&amp;nbsp;sequence&amp;nbsp;to&amp;nbsp;a&amp;nbsp;single&amp;nbsp;value. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&amp;nbsp;example,&amp;nbsp;reduce(lambda&amp;nbsp;x,&amp;nbsp;y:&amp;nbsp;x+y,&amp;nbsp;[1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5])&amp;nbsp;calculates &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((((1+2)+3)+4)+5).&amp;nbsp;&amp;nbsp;If&amp;nbsp;initial&amp;nbsp;is&amp;nbsp;present,&amp;nbsp;it&amp;nbsp;is&amp;nbsp;placed&amp;nbsp;before&amp;nbsp;the&amp;nbsp;items &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;of&amp;nbsp;the&amp;nbsp;sequence&amp;nbsp;in&amp;nbsp;the&amp;nbsp;calculation,&amp;nbsp;and&amp;nbsp;serves&amp;nbsp;as&amp;nbsp;a&amp;nbsp;default&amp;nbsp;when&amp;nbsp;the &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sequence&amp;nbsp;is&amp;nbsp;empty.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고 문헌&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/26152469/using-reduce-function-in-python-to-find-factorial&quot;&gt;https://stackoverflow.com/questions/26152469/using-reduce-function-in-python-to-find-factorial&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>functools</category>
      <category>Python</category>
      <category>reduce</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/344</guid>
      <comments>https://mytechmemo.tistory.com/344#entry344comment</comments>
      <pubDate>Sun, 23 Feb 2020 12:12:45 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] libuv 의 Design overview</title>
      <link>https://mytechmemo.tistory.com/346</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;libuv&lt;/h3&gt;
&lt;p&gt;Node.js 를 위해 작성된 cross-platform 을 지원하는 라이브러리&lt;br /&gt;(&lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;Event-driven (이벤트 기반) asynchronous (비동기) I/O (입출력)을 지원하기 위해 설계&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;libuv 의 전반적인 Design overview&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvIhyi/btqCcV9rgvQ/OvqH3TRFlx8QYTykkmeVhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvIhyi/btqCcV9rgvQ/OvqH3TRFlx8QYTykkmeVhK/img.png&quot; data-alt=&quot;출처 : http://docs.libuv.org&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvIhyi/btqCcV9rgvQ/OvqH3TRFlx8QYTykkmeVhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvIhyi%2FbtqCcV9rgvQ%2FOvqH3TRFlx8QYTykkmeVhK%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;493&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : http://docs.libuv.org&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;I/O (혹은 Event) loop&lt;/b&gt; 는 libuv 의 핵심 부분으로 모든 I/O 동작에 대해 &lt;b&gt;Single thread&lt;/b&gt; 에서 처리 될 수 있도록 한다. 그리고 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;loop 가 반복되는 동안 I/O waiting 을 하지 않으므로 별도로 들어온 I/O 작업에 대해 수행할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Network I/O&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;libuv의 모든 Network I/O 는 non-blocking socket 위에서 동작하도록 되어 있다. &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이를 위해 각 platform 에서 지원하는 방식을 사용하는데 &lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;Linux 에서는 epoll&lt;/b&gt;&lt;/span&gt;, &lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;OSX 및 기타 BSD 에서는 kqueue&lt;/b&gt;&lt;/span&gt;, &lt;b&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;SunOS 에서는 event ports&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;Windows 에서는 IOCP&lt;/span&gt;&lt;/b&gt; 를 사용한다. &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Network I/O 외 기타 I/O&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;libuv 에서는 Network I/O 외에도 하기 I/O 들 또한 지원한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;File system operations&lt;/li&gt;
&lt;li&gt;DNS functions (getaddrinfo and getnameinfo)&lt;/li&gt;
&lt;li&gt;User&amp;nbsp;specified&amp;nbsp;code&amp;nbsp;via&amp;nbsp;uv_queue_work()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Network I/O 와는 달리 각 platform에서는 해당 기능을 위한 non-blocking I/O 를 지원하는 기능이 마땅치 않다. 이에 따라 기본적으로 사용되는 blocking 을 &lt;b&gt;&lt;span style=&quot;color: #953b34;&quot;&gt;thread pool 을 통해 접근&lt;/span&gt;&lt;/b&gt;하는 방식을 취하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;File I/O의 경우 thread pool 을 통한 접근 외에도 &lt;b&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;cross-platform file I/O 방식&lt;/span&gt;&lt;/b&gt;을 통하기도 한다.&lt;/p&gt;
&lt;p&gt;(관련 링크 : &lt;a href=&quot;https://blog.libtorrent.org/2012/10/asynchronous-disk-io/&quot;&gt;https://blog.libtorrent.org/2012/10/asynchronous-disk-io/&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고 문헌&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://docs.libuv.org/en/v1.x/design.html&quot;&gt;http://docs.libuv.org/en/v1.x/design.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Node.js</category>
      <category>File</category>
      <category>I/O</category>
      <category>libuv</category>
      <category>network</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/346</guid>
      <comments>https://mytechmemo.tistory.com/346#entry346comment</comments>
      <pubDate>Sun, 23 Feb 2020 00:27:20 +0900</pubDate>
    </item>
    <item>
      <title>Python - filter(), iterable 변수 내 값 중 조건에 맞는 값만 반환</title>
      <link>https://mytechmemo.tistory.com/343</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;filter&lt;/h3&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; filter(function,&amp;nbsp;iterable)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;iterable 한 data를 function 의 인자로 넣어 False 가 아닌 결과를 반환하는 인자들만 iterator 형태로 반환해 주는 함수&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[Link :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://technote.kr/325&quot;&gt;iterable 과 iterator, 그리고 반복문&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;]&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-size: 0.87em; letter-spacing: 0px; color: #000000; background-color: #f6e199;&quot;&gt;&lt;span style=&quot;font-size: 0.87em; letter-spacing: 0px; background-color: #f6e199;&quot;&gt;&lt;b&gt;filter(function,&amp;nbsp;iterable)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Construct an iterator from those elements of&lt;span&gt;&amp;nbsp;&lt;/span&gt;iterable&lt;span&gt;&amp;nbsp;&lt;/span&gt;for which&lt;span&gt;&amp;nbsp;&lt;/span&gt;function&lt;span&gt;&amp;nbsp;&lt;/span&gt;returns true.&lt;span&gt;&amp;nbsp;&lt;/span&gt;iterable&lt;span&gt;&amp;nbsp;&lt;/span&gt;may be either a sequence, a container which supports iteration, or an iterator. If&lt;span&gt;&amp;nbsp;&lt;/span&gt;function&lt;span&gt;&amp;nbsp;&lt;/span&gt;is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;, the identity function is assumed, that is, all elements of&lt;span&gt;&amp;nbsp;&lt;/span&gt;iterable&lt;span&gt;&amp;nbsp;&lt;/span&gt;that are false are removed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Note that&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;filter(function,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;iterable)&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is equivalent to the generator expression&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;(item&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;iterable&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;function(item))&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;if function is not&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;(item&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;iterable&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;item)&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;if function is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;See&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.python.org/3/library/itertools.html#itertools.filterfalse&quot;&gt;&lt;span&gt;itertools.filterfalse()&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;for the complementary function that returns elements of&lt;span&gt;&amp;nbsp;&lt;/span&gt;iterable&lt;span&gt;&amp;nbsp;&lt;/span&gt;for which&lt;span&gt;&amp;nbsp;&lt;/span&gt;function&lt;span&gt;&amp;nbsp;&lt;/span&gt;returns false.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 0.87em; letter-spacing: 0px;&quot;&gt;&lt;br /&gt;[Python3 기준 예제]&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1582381706072&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; data = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; def mul(item):
...     if item &amp;gt; 3:
...             return True
...     else:
...             return None
... 
&amp;gt;&amp;gt;&amp;gt; list(filter(mul,data))
[4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1582381774205&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; data = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; def mul_dup(item): 
...     if item &amp;gt; 3:
...             return True
...     else:
...             return False
... 
&amp;gt;&amp;gt;&amp;gt; list(filter(mul_dup,data))  
[4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1582382050526&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; data = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; def mul_dup2(item):
...     if item &amp;gt; 3:
...             return True
...     else:
...             return 0
... 
&amp;gt;&amp;gt;&amp;gt; list(filter(mul_dup2,data)) 
[4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위와 같이 iterable 한 data (여기서는 list 형) 를 인자로 넣어 True 로 판단되는 값을 반환할 경우 해당 인자를 추려 결과로 돌려준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위에서 볼 수 있듯이 &lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;False, None, 0&lt;/b&gt;&lt;/span&gt; 과 같은 값들이 False 로 판단되어 해당 인자는 무시되는 것을 확인할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다만, 아래와 같이 음수를 리턴할 경우는 False 로 판단하지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1582382359206&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; data = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; def mul_dup3(item): 
...     if item &amp;gt; 3:
...             return True
...     else:
...             return -1
... 
&amp;gt;&amp;gt;&amp;gt; list(filter(mul_dup3,data)) 
[1, 2, 3, 4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;유사한 함수인 map 과 마찬가지로 지능형 리스트를 통해 filter 함수를 사용하지 않고 더욱 간단하게 표현을 할 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[Link :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://technote.kr/306&quot;&gt;지능형 리스트에 대한 이해&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1582382256953&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; data = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; [item for item in data if item &amp;gt; 3]     
[4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;help(filter) &lt;br /&gt;Help&amp;nbsp;on&amp;nbsp;class&amp;nbsp;filter&amp;nbsp;in&amp;nbsp;module&amp;nbsp;builtins: &lt;br /&gt;&lt;br /&gt;class&amp;nbsp;filter(object) &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;filter(function&amp;nbsp;or&amp;nbsp;None,&amp;nbsp;iterable)&amp;nbsp;--&amp;gt;&amp;nbsp;filter&amp;nbsp;object &lt;br /&gt;&amp;nbsp;| &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;Return&amp;nbsp;an&amp;nbsp;iterator&amp;nbsp;yielding&amp;nbsp;those&amp;nbsp;items&amp;nbsp;of&amp;nbsp;iterable&amp;nbsp;for&amp;nbsp;which&amp;nbsp;function(item) &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;is&amp;nbsp;true.&amp;nbsp;If&amp;nbsp;function&amp;nbsp;is&amp;nbsp;None,&amp;nbsp;return&amp;nbsp;the&amp;nbsp;items&amp;nbsp;that&amp;nbsp;are&amp;nbsp;true. &lt;br /&gt;&amp;nbsp;| &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;Methods&amp;nbsp;defined&amp;nbsp;here: &lt;br /&gt;&amp;nbsp;| &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;__getattribute__(self,&amp;nbsp;name,&amp;nbsp;/) &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return&amp;nbsp;getattr(self,&amp;nbsp;name). &lt;br /&gt;&amp;nbsp;| &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;__iter__(self,&amp;nbsp;/) &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Implement&amp;nbsp;iter(self). &lt;br /&gt;&amp;nbsp;| &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;__next__(self,&amp;nbsp;/) &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Implement&amp;nbsp;next(self). &lt;br /&gt;&amp;nbsp;| &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;__reduce__(...) &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return&amp;nbsp;state&amp;nbsp;information&amp;nbsp;for&amp;nbsp;pickling. &lt;br /&gt;&amp;nbsp;| &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;---------------------------------------------------------------------- &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;Static&amp;nbsp;methods&amp;nbsp;defined&amp;nbsp;here: &lt;br /&gt;&amp;nbsp;| &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;__new__(*args,&amp;nbsp;**kwargs)&amp;nbsp;from&amp;nbsp;&lt;a href=&quot;builtins.type&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;builtins.type&lt;/a&gt; &lt;br /&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Create&amp;nbsp;and&amp;nbsp;return&amp;nbsp;a&amp;nbsp;new&amp;nbsp;object.&amp;nbsp;&amp;nbsp;See&amp;nbsp;help(type)&amp;nbsp;for&amp;nbsp;accurate&amp;nbsp;signature. &lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>Filter</category>
      <category>List Comprehension</category>
      <category>Python</category>
      <category>지능형 리스트</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/343</guid>
      <comments>https://mytechmemo.tistory.com/343#entry343comment</comments>
      <pubDate>Sat, 22 Feb 2020 23:42:43 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] 학습 관련 정보</title>
      <link>https://mytechmemo.tistory.com/345</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Javascript Event Loop 에 대한 이해]&lt;/p&gt;
&lt;p&gt;What&amp;nbsp;the&amp;nbsp;heck&amp;nbsp;is&amp;nbsp;the&amp;nbsp;event&amp;nbsp;loop&amp;nbsp;anyway?&amp;nbsp;|&amp;nbsp;Philip&amp;nbsp;Roberts&amp;nbsp;|&amp;nbsp;JSConf&amp;nbsp;EU&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=8aGhZQkoFbQ&quot;&gt;https://www.youtube.com/watch?v=8aGhZQkoFbQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[libuv 에 대한 이해]&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Node.js 에서 event-driven 비동기 I/O 모델을 지원 가능하게 하는 라이브러리의 Design Overview&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://docs.libuv.org/en/v1.x/design.html&quot;&gt;http://docs.libuv.org/en/v1.x/design.html&lt;span style=&quot;color: #333333;&quot;&gt;[libuv 에 대한 이해]&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/ko/docs/guides/event-loop-timers-and-nexttick/&quot;&gt;https://nodejs.org/ko/docs/guides/event-loop-timers-and-nexttick/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Node.js 에 대한 이해]&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.dev/the-nodejs-event-loop&quot;&gt;https://nodejs.dev/the-nodejs-event-loop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Electron 학습]&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.tutorialspoint.com/electron/index.htm&quot;&gt;https://www.tutorialspoint.com/electron/index.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Node.js</category>
      <category>JavaScript</category>
      <category>libuv</category>
      <category>node.js</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/345</guid>
      <comments>https://mytechmemo.tistory.com/345#entry345comment</comments>
      <pubDate>Sat, 22 Feb 2020 11:29:07 +0900</pubDate>
    </item>
    <item>
      <title>Python - map(), 함수와 iterable 변수를 인자로 받아 iterator 결과를 반환</title>
      <link>https://mytechmemo.tistory.com/342</link>
      <description>&lt;h3&gt;map&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; map(func, *iterables)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;iterable 한 data를 func 의 인자로 넣어 나온 결과들을 iterator 형태로 반환해 주는 함수&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[Link : &lt;a class=&quot;tx-link&quot; href=&quot;https://technote.kr/325&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;iterable 과 iterator, 그리고 반복문&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;code class=&quot;sig-name descname&quot; style=&quot;background-color: transparent; padding: 0px 1px; font-size: 19.2px; font-family: monospace, sans-serif; font-weight: bold; border-radius: 3px;&quot;&gt;map&lt;/code&gt;&lt;span style=&quot;font-size: larger;&quot; class=&quot;sig-paren&quot;&gt;(&lt;/span&gt;&lt;i&gt;function&lt;/i&gt;,&amp;nbsp;&lt;i&gt;iterable&lt;/i&gt;,&amp;nbsp;&lt;i&gt;...&lt;/i&gt;&lt;span style=&quot;font-size: larger;&quot; class=&quot;sig-paren&quot;&gt;)&lt;/span&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;Return an iterator that applies&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;function&lt;/i&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;to every item of&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;iterable&lt;/i&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;, yielding the results. If additional&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;iterable&lt;/i&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;arguments are passed,&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;function&lt;/i&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;must take that many arguments and is applied to the items from all iterables in parallel. With multiple iterables, the iterator stops when the shortest iterable is exhausted. For cases where the function inputs are already arranged into argument tuples, see&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a class=&quot;reference internal&quot; style=&quot;font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify; color: #6363bb;&quot; title=&quot;itertools.starmap&quot; href=&quot;https://docs.python.org/3/library/itertools.html#itertools.starmap&quot;&gt;&lt;code class=&quot;xref py py-func docutils literal notranslate&quot; style=&quot;background-color: transparent; padding: 0px 1px; font-size: 15.44px; font-family: monospace, sans-serif; border-radius: 3px;&quot;&gt;&lt;span style=&quot;hyphens: none;&quot; class=&quot;pre&quot;&gt;itertools.starmap()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;span style=&quot;color: #222222; font-family: 'Lucida Grande', Arial, sans-serif; font-size: 16px; text-align: justify;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[python3 기준]&lt;/p&gt;
&lt;pre id=&quot;code_1582121841974&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; data = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; def mul(item): 
...     return item * 4
... 
&amp;gt;&amp;gt;&amp;gt; map(mul, data)
&amp;lt;map object at 0x0000024658BC7448&amp;gt;
&amp;gt;&amp;gt;&amp;gt; list(map(mul, data))  
[4, 8, 12, 16, 20]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 mul (function) 과 iterable 한 data (list) 를 map 의 인자로 전달하면 list의 각 element를 인자로 하여 mul 에 넣어 계산 후 결과들을 iterator 형태로 반환하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;iterator 를 list 형태로 변환 시키면 위와 같이 실제 값 확인이 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 지능형 리스트의 소개 이후 map() 함수의 효용성은 떨어지고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[Link : &lt;a href=&quot;https://technote.kr/306&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;지능형 리스트에 대한 이해&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음과 같이 하면 지능형 리스트를 이용해 위의 map 예제를 동일하게 표현할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1582122530154&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; data = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; def mul(item): 
...     return item * 4
... 
&amp;gt;&amp;gt;&amp;gt; [mul(n) for n in data]
[4, 8, 12, 16, 20]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; help(map)&lt;/p&gt;
&lt;p&gt;Help on class map in module builtins:&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; &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; &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; &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; &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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;class map(object)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; map(func, *iterables) --&amp;gt; map object&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; Make an iterator that computes the function using arguments from&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; each of the iterables.&amp;nbsp; Stops when the shortest iterable is exhausted.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; Methods defined here:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; __getattribute__(self, name, /)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; Return getattr(self, name).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; __iter__(self, /)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; Implement iter(self).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; __next__(self, /)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; Implement next(self).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; __reduce__(...)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; Return state information for pickling.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; ----------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; Static methods defined here:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; __new__(*args, **kwargs) from builtins.type&lt;/p&gt;
&lt;p&gt;&amp;nbsp;|&amp;nbsp; &amp;nbsp; &amp;nbsp; Create and return a new object.&amp;nbsp; See help(type) for accurate signature.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>List Comprehension</category>
      <category>map</category>
      <category>Python</category>
      <category>지능형 리스트</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/342</guid>
      <comments>https://mytechmemo.tistory.com/342#entry342comment</comments>
      <pubDate>Wed, 19 Feb 2020 23:21:25 +0900</pubDate>
    </item>
    <item>
      <title>MacOS - 특정 Application 실행 단축키 만들기</title>
      <link>https://mytechmemo.tistory.com/330</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#first&quot;&gt;1. 특정 Application을 실행하는 서비스 만들기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#second&quot;&gt;2. 해당 서비스에 단축키 설정하기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;#third&quot;&gt;3. 단축키를 통한 해당 Application의 실행&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot; id=&quot;first&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;특정 Application을 실행하는 서비스 만들기&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Finder &amp;gt; 응용 프로그램 &amp;gt; Automator 를 실행한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Naj1g/btqB1n5HORM/keOgL7MXssbo4QRcBZlsHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Naj1g/btqB1n5HORM/keOgL7MXssbo4QRcBZlsHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Naj1g/btqB1n5HORM/keOgL7MXssbo4QRcBZlsHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNaj1g%2FbtqB1n5HORM%2FkeOgL7MXssbo4QRcBZlsHk%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;391&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로그램을 실행시킬 서비스 생성을 위해 도큐먼트 유형로 &quot;서비스&quot;를 선택한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zmqmv/btqBYeJj5YP/nmWlvWkgmOXAm7OoRKt4hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zmqmv/btqBYeJj5YP/nmWlvWkgmOXAm7OoRKt4hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zmqmv/btqBYeJj5YP/nmWlvWkgmOXAm7OoRKt4hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzmqmv%2FbtqBYeJj5YP%2FnmWlvWkgmOXAm7OoRKt4hK%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;748&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;응용 프로그램 실행&quot; 을 클릭 한 후 오른쪽 &quot;동작 또는 파일을 여기로 드래그하여 작업흐름을 구축하십시오.&quot; 부분에 Drag &amp;amp; Drop 한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GnYjv/btqBYvqvjXb/vNwOiBAeO74gDziJOqcSa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GnYjv/btqBYvqvjXb/vNwOiBAeO74gDziJOqcSa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GnYjv/btqBYvqvjXb/vNwOiBAeO74gDziJOqcSa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGnYjv%2FbtqBYvqvjXb%2FvNwOiBAeO74gDziJOqcSa0%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;748&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;서비스가 받는 항목&quot; 을 &lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;&quot;입력 없음&quot;&lt;/b&gt; &lt;/span&gt;으로 선택, &quot;선택 항목 위치&quot;를 &lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;&quot;모든 응용 프로그램&quot;&lt;/b&gt;&lt;/span&gt; 으로 선택한 후 &quot;응용 프로그램 실행&quot; 부분에 실행하기 원하는 프로그램을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdHOKl/btqB1m6KvQN/dR2Yn2jv0kyXqkSOvFQ4p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdHOKl/btqB1m6KvQN/dR2Yn2jv0kyXqkSOvFQ4p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdHOKl/btqB1m6KvQN/dR2Yn2jv0kyXqkSOvFQ4p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdHOKl%2FbtqB1m6KvQN%2FdR2Yn2jv0kyXqkSOvFQ4p0%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;748&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;kbd&gt;command&lt;/kbd&gt; + &lt;kbd&gt;s&lt;/kbd&gt; 를 눌러 지금까지 설정한 서비스를 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4SxEE/btqBZq950io/4DPi4eIY2UrnYBaYTwyAg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4SxEE/btqBZq950io/4DPi4eIY2UrnYBaYTwyAg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4SxEE/btqBZq950io/4DPi4eIY2UrnYBaYTwyAg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4SxEE%2FbtqBZq950io%2F4DPi4eIY2UrnYBaYTwyAg1%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;748&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot; id=&quot;second&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해당 서비스에 단축키 설정하기&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;시스템 환경설정 &amp;gt; 키보드 를 실행한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwpLVt/btqB1GcUfm9/J81mNEH5TCtvFaOsZo50W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwpLVt/btqB1GcUfm9/J81mNEH5TCtvFaOsZo50W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwpLVt/btqB1GcUfm9/J81mNEH5TCtvFaOsZo50W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwpLVt%2FbtqB1GcUfm9%2FJ81mNEH5TCtvFaOsZo50W1%2Fimg.png&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;710&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;단축키 탭을 선택하고 아까 만들었던 &quot;OneNote 실행하기&quot; 를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GJAxl/btqBZrgVrWL/CSUqHkmUTlfEHxNLuZwVU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GJAxl/btqBZrgVrWL/CSUqHkmUTlfEHxNLuZwVU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GJAxl/btqBZrgVrWL/CSUqHkmUTlfEHxNLuZwVU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGJAxl%2FbtqBZrgVrWL%2FCSUqHkmUTlfEHxNLuZwVU1%2Fimg.png&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;693&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;선택후 오른쪽 &quot;없음&quot; 부분을 선택하고 단축키를 추가한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOMwyE/btqBYuFbY5e/Eyxv2dMAOFVG382wXlhFF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOMwyE/btqBYuFbY5e/Eyxv2dMAOFVG382wXlhFF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOMwyE/btqBYuFbY5e/Eyxv2dMAOFVG382wXlhFF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOMwyE%2FbtqBYuFbY5e%2FEyxv2dMAOFVG382wXlhFF1%2Fimg.png&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;693&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot; id=&quot;third&quot;&gt;단축키를 통한 해당 Application의 실행&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 &quot;OneNote 실행하기&quot; 에서는 단축키로&lt;/p&gt;
&lt;p&gt;&lt;kbd&gt;control&lt;/kbd&gt; + &lt;kbd&gt;option&lt;/kbd&gt; + &lt;kbd&gt;command&lt;/kbd&gt; + &lt;kbd&gt;o&lt;/kbd&gt; 를 지정해 두었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;해당 키 조합을 누르면 OneNote 가 한 번에 실행되는 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Mac</category>
      <category>MacOS</category>
      <category>단축키</category>
      <category>응용 프로그램</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/330</guid>
      <comments>https://mytechmemo.tistory.com/330#entry330comment</comments>
      <pubDate>Mon, 17 Feb 2020 23:30:18 +0900</pubDate>
    </item>
    <item>
      <title>일급 객체 (first-class object)</title>
      <link>https://mytechmemo.tistory.com/339</link>
      <description>&lt;p&gt;일급 객체 (first-class object) 는 아래와 같이 불리기도 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;first-class citizen&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;first-class&amp;nbsp;&lt;/span&gt;type&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;first-class&amp;nbsp;&lt;/span&gt;entity&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;first-class&amp;nbsp;&lt;/span&gt;value&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;일급 객체의 특징&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&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;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Python 에서는 정수, 문자열, list 등과 더불어 함수 또한 일급 객체이다. 이에 따라 아래와 같이 하나의 함수를 다른 함수의 인자로 넘겨줄 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1581948831548&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; def reverse(data):
...     return data[::-1]
... 
&amp;gt;&amp;gt;&amp;gt; data = ['zbc', 'tde', 'dcd', 'xfg']
&amp;gt;&amp;gt;&amp;gt; sorted(data, key=reverse)
['zbc', 'dcd', 'tde', 'xfg']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&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;/ul&gt;
&lt;p&gt;Python 에서는 함수가 일급 객체이기 때문에 다른 변수에 할당을 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1581948959335&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; def show():
...     print(&quot;RET&quot;)
... 
&amp;gt;&amp;gt;&amp;gt; a = show
&amp;gt;&amp;gt;&amp;gt; a()
RET&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&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;Runtime 에 생성 가능 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language</category>
      <category>first-class</category>
      <category>Python</category>
      <category>일급객체</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/339</guid>
      <comments>https://mytechmemo.tistory.com/339#entry339comment</comments>
      <pubDate>Mon, 17 Feb 2020 23:19:09 +0900</pubDate>
    </item>
    <item>
      <title>Windows - 스크린샷 찍는 법</title>
      <link>https://mytechmemo.tistory.com/341</link>
      <description>&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 350px; width: 350px; height: 242px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D405365E48185A2A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D405365E48185A2A&quot; width=&quot;350&quot; height=&quot;242&quot; filename=&quot;3.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 350px; height: 242px;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Windows 에서 기본적으로 화면을 캡쳐하는 방법은 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot;&gt;&lt;li&gt;&lt;kbd&gt;Print Screen&lt;/kbd&gt; : 전체 화면 스크린샷 찍기&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt&lt;/kbd&gt; + &lt;kbd&gt;Print Screen&lt;/kbd&gt; : 특정 Window 스크린샷 찍기&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Windows&lt;/kbd&gt; + &lt;kbd&gt;Print Screen&lt;/kbd&gt; :&amp;nbsp;전체 화면 스크린샷 찍은 후 자동 저장&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Windows&lt;/kbd&gt; + &lt;kbd&gt;Alt&lt;/kbd&gt; + &lt;kbd&gt;Print Screen&lt;/kbd&gt; : 특정 Window 스크린샷 찍은 후 자동 저장&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;kbd&gt;Print Screen&lt;/kbd&gt; : 기본적으로 화면을 캡쳐하는 역할&lt;/p&gt;
&lt;p&gt;&lt;kbd&gt;Alt&lt;/kbd&gt; : 누르면 전체 화면이 아닌 현재 선택된 창을 캡쳐하는 역할&lt;/p&gt;
&lt;p&gt;&lt;kbd&gt;Windows&lt;/kbd&gt; : 누르면 클립보드가 아닌 파일로 자동 저장하는 역할&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;위 3개의 key 조합에 따라 원하는 방식으로 화면 캡쳐를 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Windows 10 (ver. 1809) 이후로는&amp;nbsp;UI 를 통해 아래 항목 중 원하는 스크린샷을 찍을 수 있는 기능이 추가 되었다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;kbd&gt;Shift&lt;/kbd&gt;&amp;nbsp;+&amp;nbsp;&lt;kbd&gt;Windows&lt;/kbd&gt;&amp;nbsp;+&amp;nbsp;&lt;kbd&gt;s&lt;/kbd&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;사각형 캡쳐 : 화면 원하는 곳 사각형으로 선택하여 해당 부분만 찍기&lt;/li&gt;
&lt;li&gt;자유형 캡쳐 : 화면 원하는 곳 자유롭게 선택하여 해당 부분만 찍기&lt;/li&gt;
&lt;li&gt;창 캡쳐 : 특정 Window 찍기&lt;/li&gt;
&lt;li&gt;전체 화면 캡쳐 : 전체 화면 찍기&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 600px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A3A7445E4814C933&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A3A7445E4814C933&quot; width=&quot;600&quot; height=&quot;52&quot; filename=&quot;0.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>OS/Windows</category>
      <category>windows</category>
      <category>스크린샷</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/341</guid>
      <comments>https://mytechmemo.tistory.com/341#entry341comment</comments>
      <pubDate>Sun, 16 Feb 2020 00:47:44 +0900</pubDate>
    </item>
    <item>
      <title>Tistory - 글 작성시 Keypad 이미지 표시하기</title>
      <link>https://mytechmemo.tistory.com/337</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKLvVT/btqBZfmVDkZ/6fGhlfhJrhJZnlckeBkC30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKLvVT/btqBZfmVDkZ/6fGhlfhJrhJZnlckeBkC30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKLvVT/btqBZfmVDkZ/6fGhlfhJrhJZnlckeBkC30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKLvVT%2FbtqBZfmVDkZ%2F6fGhlfhJrhJZnlckeBkC30%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;352&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;티스토리에서 글을 작성하다 보면 keyboard key 조합에 대해 언급해야 할 경우가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예를 들면 control 키와 R 키를 누르는 것을 표현해야 하는데, 이럴 경우 기존에는 Ctrl + R 로 표현하였다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;티스토리 글작성시 &amp;lt;kdb&amp;gt; tag 와 css 를 이용해 좀 더 가독성이 높게 표현하는 법을 확인하여 정리해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[기존]&lt;/p&gt;
&lt;p&gt;Ctrl + R&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[개선]&lt;/p&gt;
&lt;p&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;R&lt;/kbd&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;1) CSS 설정을 추가&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;티스토리 &amp;gt; 블로그관리 &amp;gt; 꾸미기 &amp;gt; 스킨 편집&quot; 진입&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;221&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bauSes/btqBZL6HXHi/fYhzn44YkcVkwH32dthksk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bauSes/btqBZL6HXHi/fYhzn44YkcVkwH32dthksk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bauSes/btqBZL6HXHi/fYhzn44YkcVkwH32dthksk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbauSes%2FbtqBZL6HXHi%2FfYhzn44YkcVkwH32dthksk%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;221&quot; data-origin-height=&quot;209&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&quot;스킨 편집&quot; 화면에서 &quot;html 편집&quot; 버튼 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;177&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NOmZp/btqBXUDJv3J/ogNO3gjxGKaH78bBsvghK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NOmZp/btqBXUDJv3J/ogNO3gjxGKaH78bBsvghK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NOmZp/btqBXUDJv3J/ogNO3gjxGKaH78bBsvghK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNOmZp%2FbtqBXUDJv3J%2FogNO3gjxGKaH78bBsvghK0%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;177&quot; data-origin-height=&quot;262&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 CSS 항목을 선택하고 임의의 위치에 하기 설정을 추가한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1581647946845&quot; class=&quot;css&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kbd {
  border: 1px solid #aaa;
  border-bottom-width: 2px;
  border-radius: 3px;
  padding: 3px 5px;
  font-size: .85em;
  line-height: 20px;
  color: #333;
  background-color: #fcfcfc;
  font-family: monospace;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) 에디터 내 HTML 모드로 변환 후 key 표현이 필요한 부분 앞뒤로 &amp;lt;kbd&amp;gt;&amp;lt;/kbd&amp;gt; 를 추가&lt;/p&gt;
&lt;pre id=&quot;code_1581648400859&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;kbd&amp;gt;Ctrl&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참고문헌&lt;/b&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&gt;&lt;a href=&quot;https://dev.to/samanthaming/html-kbd-tag-8di&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dev.to/samanthaming/html-kbd-tag-8di&lt;/a&gt;&lt;/p&gt;</description>
      <category>Products &amp;amp; Services/Tistory</category>
      <category>CSS</category>
      <category>KEY</category>
      <category>key 표현</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/337</guid>
      <comments>https://mytechmemo.tistory.com/337#entry337comment</comments>
      <pubDate>Fri, 14 Feb 2020 11:50:52 +0900</pubDate>
    </item>
    <item>
      <title>MacOS - CPU, Storage, Memory 등 실시간 사용량 확인</title>
      <link>https://mytechmemo.tistory.com/335</link>
      <description>&lt;p&gt;Windows 에는 &quot;작업 관리자&quot;&quot;가 있다면 MacOS 에는 &quot;활성 상태 보기&quot; (Activity Monitor) 가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[접근 경로]&lt;/p&gt;
&lt;p&gt;Launchpad &amp;gt; 기타 &amp;gt; 활성 상태 보기&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;활성 상태 보기&quot; 에서는 5가지 상태를 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU&lt;/li&gt;
&lt;li&gt;메모리&lt;/li&gt;
&lt;li&gt;에너지&lt;/li&gt;
&lt;li&gt;디스크&lt;/li&gt;
&lt;li&gt;네트워크&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) CPU&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;각 프로세스의 CPU 점유율, Process ID, 사용자 등을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KDBsM/btqBYePt8Cv/TGkFoqJkVjtN3QHhu516w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KDBsM/btqBYePt8Cv/TGkFoqJkVjtN3QHhu516w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KDBsM/btqBYePt8Cv/TGkFoqJkVjtN3QHhu516w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKDBsM%2FbtqBYePt8Cv%2FTGkFoqJkVjtN3QHhu516w0%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Process 를 하나 선택하고 왼쪽 상단의 &quot;X&quot; 아이콘을 선택하면 프로세스 종료도 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;01.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUnoG/btqBXUX1vIW/ATiKMODa2ApTK0AtZhOBx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUnoG/btqBXUX1vIW/ATiKMODa2ApTK0AtZhOBx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUnoG/btqBXUX1vIW/ATiKMODa2ApTK0AtZhOBx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUnoG%2FbtqBXUX1vIW%2FATiKMODa2ApTK0AtZhOBx1%2Fimg.png&quot; data-filename=&quot;01.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;247&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) 메모리&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;각 프로세스의 메모리 점유율을 확인 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mANgP/btqBW1i0RBm/yCg2iObTMupm1GX6xR4sWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mANgP/btqBW1i0RBm/yCg2iObTMupm1GX6xR4sWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mANgP/btqBW1i0RBm/yCg2iObTMupm1GX6xR4sWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmANgP%2FbtqBW1i0RBm%2FyCg2iObTMupm1GX6xR4sWK%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3) 에너지&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;각 프로세스의 전력 소모 영향을 확인 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QuAFp/btqBZg69K3e/9ZkQmfvwSMEnspTDEDGbj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QuAFp/btqBZg69K3e/9ZkQmfvwSMEnspTDEDGbj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QuAFp/btqBZg69K3e/9ZkQmfvwSMEnspTDEDGbj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQuAFp%2FbtqBZg69K3e%2F9ZkQmfvwSMEnspTDEDGbj1%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4) 디스크&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;각 프로세스의 Disk I/O 상태를 확인 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTDa6x/btqBZftBTSB/bg6A7ISIiE2iblklsSooak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTDa6x/btqBZftBTSB/bg6A7ISIiE2iblklsSooak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTDa6x/btqBZftBTSB/bg6A7ISIiE2iblklsSooak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTDa6x%2FbtqBZftBTSB%2Fbg6A7ISIiE2iblklsSooak%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5) 네트워크&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;각 프로세스의 네트워크 사용 현황을 확인 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llwFX/btqBZqIsFBb/hXSAZPU7IIna99QjLnvv11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llwFX/btqBZqIsFBb/hXSAZPU7IIna99QjLnvv11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llwFX/btqBZqIsFBb/hXSAZPU7IIna99QjLnvv11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllwFX%2FbtqBZqIsFBb%2FhXSAZPU7IIna99QjLnvv11%2Fimg.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;712&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Mac</category>
      <category>Activity Monitor</category>
      <category>MacOS</category>
      <category>활성상태보기</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/335</guid>
      <comments>https://mytechmemo.tistory.com/335#entry335comment</comments>
      <pubDate>Fri, 14 Feb 2020 10:33:48 +0900</pubDate>
    </item>
    <item>
      <title>스팀(Steam) 계정 해지/탈퇴</title>
      <link>https://mytechmemo.tistory.com/336</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;예전에 스팀(Steam)에 가입만 해두고 사용하지 않는 ID가 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;언젠가 부터 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;지속적으로 누군가 로그인 시도를 했다는 메일이 계속 날라왔다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uLR30/btqBW0YFpWb/McRk4jTPw0eA2jikNdNKOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uLR30/btqBW0YFpWb/McRk4jTPw0eA2jikNdNKOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uLR30/btqBW0YFpWb/McRk4jTPw0eA2jikNdNKOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuLR30%2FbtqBW0YFpWb%2FMcRk4jTPw0eA2jikNdNKOk%2Fimg.png&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;55&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5wQ0q/btqBXGZTRkw/suLQSb9wIY9XwLkc6GlVKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5wQ0q/btqBXGZTRkw/suLQSb9wIY9XwLkc6GlVKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5wQ0q/btqBXGZTRkw/suLQSb9wIY9XwLkc6GlVKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5wQ0q%2FbtqBXGZTRkw%2FsuLQSb9wIY9XwLkc6GlVKk%2Fimg.png&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;55&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YJhp0/btqBW1iUAVe/RQssGy0A9Izk2WwKTGK4T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YJhp0/btqBW1iUAVe/RQssGy0A9Izk2WwKTGK4T0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YJhp0/btqBW1iUAVe/RQssGy0A9Izk2WwKTGK4T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYJhp0%2FbtqBW1iUAVe%2FRQssGy0A9Izk2WwKTGK4T0%2Fimg.png&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;57&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzsYic/btqBZgeVeIp/utSiPKy9bLQPdNxauumnsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzsYic/btqBZgeVeIp/utSiPKy9bLQPdNxauumnsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzsYic/btqBZgeVeIp/utSiPKy9bLQPdNxauumnsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzsYic%2FbtqBZgeVeIp%2FutSiPKy9bLQPdNxauumnsK%2Fimg.png&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;55&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;더 이상 사용하지 않는 계정을 삭제해 보았다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1) 처음 화면에서 SUPPORT 메뉴를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pDGkF/btqBXVie9N3/Pv1deYwFKnMjthgUKVSIrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pDGkF/btqBXVie9N3/Pv1deYwFKnMjthgUKVSIrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pDGkF/btqBXVie9N3/Pv1deYwFKnMjthgUKVSIrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpDGkF%2FbtqBXVie9N3%2FPv1deYwFKnMjthgUKVSIrk%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;345&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) SUPPORT 화면 하단에 검색 창이 있는데, &quot;terminate&quot; 를 입력한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUi8VA/btqBZrAvLzQ/ZpKCPI6Mkqogpzv5TbAmNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUi8VA/btqBZrAvLzQ/ZpKCPI6Mkqogpzv5TbAmNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUi8VA/btqBZrAvLzQ/ZpKCPI6Mkqogpzv5TbAmNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUi8VA%2FbtqBZrAvLzQ%2FZpKCPI6Mkqogpzv5TbAmNk%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;355&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3) &quot;terminate&quot;를 입력 후 하단에 보이는 &quot;Account Deletion&quot; 을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcy4c6/btqBZgss4UD/22JBWl7Exce83XncW19Lm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcy4c6/btqBZgss4UD/22JBWl7Exce83XncW19Lm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcy4c6/btqBZgss4UD/22JBWl7Exce83XncW19Lm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcy4c6%2FbtqBZgss4UD%2F22JBWl7Exce83XncW19Lm1%2Fimg.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;551&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4) &quot;Account Deletion&quot; 을 선택하면 나오는 항목 중 &quot;How do I delete my account&quot; 내 &quot;you can request that Steam Support delete your account&quot; 링크를 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzuZ9V/btqBXGMpK73/3INW70wGl1HOqbrm2epvKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzuZ9V/btqBXGMpK73/3INW70wGl1HOqbrm2epvKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzuZ9V/btqBXGMpK73/3INW70wGl1HOqbrm2epvKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzuZ9V%2FbtqBXGMpK73%2F3INW70wGl1HOqbrm2epvKk%2Fimg.png&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;178&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5) &quot;Delete my Steam account&quot; 페이지 하단 &quot;Proceed to account deletion&quot; 을 선택한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nvFzW/btqBXWanEok/BraCIhCcnesLrKIfxFiANk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nvFzW/btqBXWanEok/BraCIhCcnesLrKIfxFiANk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nvFzW/btqBXWanEok/BraCIhCcnesLrKIfxFiANk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnvFzW%2FbtqBXWanEok%2FBraCIhCcnesLrKIfxFiANk%2Fimg.png&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;642&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6) 해당 메뉴에서 &quot;first email&quot; 과 사유를 작성하고 Send 버튼을 누른다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uI9IL/btqBWCX3CLO/kZ2Bw0jYZPWhni4koi4vk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uI9IL/btqBWCX3CLO/kZ2Bw0jYZPWhni4koi4vk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uI9IL/btqBWCX3CLO/kZ2Bw0jYZPWhni4koi4vk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuI9IL%2FbtqBWCX3CLO%2FkZ2Bw0jYZPWhni4koi4vk0%2Fimg.png&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;860&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;7) &quot;Send&quot; 버튼을 누르면 아래와 같이 요청이 접수되었다는 화면이 나오고 별도로 관련 이메일이 전달된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5J8U0/btqBW0xCBQk/cww14h3ZjVDJipxKVhKFFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5J8U0/btqBW0xCBQk/cww14h3ZjVDJipxKVhKFFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5J8U0/btqBW0xCBQk/cww14h3ZjVDJipxKVhKFFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5J8U0%2FbtqBW0xCBQk%2Fcww14h3ZjVDJipxKVhKFFk%2Fimg.png&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;1062&quot; data-origin-height=&quot;822&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC</category>
      <category>Account</category>
      <category>steam</category>
      <category>스팀</category>
      <category>탈퇴</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/336</guid>
      <comments>https://mytechmemo.tistory.com/336#entry336comment</comments>
      <pubDate>Tue, 11 Feb 2020 09:23:18 +0900</pubDate>
    </item>
    <item>
      <title>MacOS - 저장공간 현황 확인하기</title>
      <link>https://mytechmemo.tistory.com/332</link>
      <description>&lt;p&gt;MacOS 에서는 디스크 용량 확인을 다음과 같이 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;왼쪽 상단 사과 모양 아이콘 &amp;gt; 이 MAC에 관하여 &amp;gt; 저장공간&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djWt4l/btqBS5LNikR/XmQ9LiwUe2BIUexAYn2kvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djWt4l/btqBS5LNikR/XmQ9LiwUe2BIUexAYn2kvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djWt4l/btqBS5LNikR/XmQ9LiwUe2BIUexAYn2kvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjWt4l%2FbtqBS5LNikR%2FXmQ9LiwUe2BIUexAYn2kvk%2Fimg.png&quot; data-filename=&quot;0.png&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;302&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JH26w/btqBS6KHhwY/G6NEnI8oyIOSWk4TObqONK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JH26w/btqBS6KHhwY/G6NEnI8oyIOSWk4TObqONK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JH26w/btqBS6KHhwY/G6NEnI8oyIOSWk4TObqONK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJH26w%2FbtqBS6KHhwY%2FG6NEnI8oyIOSWk4TObqONK%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;286&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;저장 공간 탭을 선택하면 위와 같이 각 항목별로 얼마나 저장 장치를 사용하고 있는지 파악이 가능하고,&lt;/p&gt;
&lt;p&gt;관리 버튼을 누르면 아래와 같이 좀 더 상세하게 파악이 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저장 공간이 부족할 경우 최적화를 통해 불필요한 파일이나 프로그램들을 삭제할 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F4FO9/btqBQnT6v6L/63gFABsgKHvBPRtbKLd1g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F4FO9/btqBQnT6v6L/63gFABsgKHvBPRtbKLd1g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F4FO9/btqBQnT6v6L/63gFABsgKHvBPRtbKLd1g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF4FO9%2FbtqBQnT6v6L%2F63gFABsgKHvBPRtbKLd1g0%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;644&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm6bBz/btqBUTqi7kh/dF0n7BVNZR80bBzfY6DKmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm6bBz/btqBUTqi7kh/dF0n7BVNZR80bBzfY6DKmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm6bBz/btqBUTqi7kh/dF0n7BVNZR80bBzfY6DKmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm6bBz%2FbtqBUTqi7kh%2FdF0n7BVNZR80bBzfY6DKmk%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;644&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Mac</category>
      <category>MacOS</category>
      <category>저장공간</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/332</guid>
      <comments>https://mytechmemo.tistory.com/332#entry332comment</comments>
      <pubDate>Mon, 10 Feb 2020 23:47:13 +0900</pubDate>
    </item>
    <item>
      <title>MacOS - 스크린샷 찍는 법</title>
      <link>https://mytechmemo.tistory.com/329</link>
      <description>&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#first&quot;&gt;&lt;b&gt;전체 화면 찍기 : Shift + Command + 3&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#second&quot;&gt;&lt;b&gt;화면 일부 찍기 (파일 저장) : Shift + Command + 4 이후 화면 부분 선택 &lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#third&quot;&gt;&lt;b&gt;화면 일부 찍기 (클립보드 저장) : Shift + Control + Command + 4 이후 화면 부분 선택&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#fourth&quot;&gt;&lt;b&gt;원하는 Window 찍기&amp;nbsp;(파일 저장)&amp;nbsp;: Shift + Command + 4 + Space 이후 원하는 Window 선택 &lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#fifth&quot;&gt;&lt;b&gt;원하는 Window 찍기&amp;nbsp;(클립보드 저장)&amp;nbsp;: Shift + Control + Command + 4 + Space 이후 원하는 Window 선택&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p id=&quot;first&quot;&gt;&lt;b&gt;1. 전체 화면 찍기 : Shift + Command + 3&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;전체 화면을 캡쳐하게 되면 바탕화면에 캡쳐 화면이 PNG 파일로 저장된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-02-09 오후 11.01.13.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AYXOo/btqBRvpPUuA/Tuk5S8Fqf0mi4xWQQPRN30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AYXOo/btqBRvpPUuA/Tuk5S8Fqf0mi4xWQQPRN30/img.png&quot; data-alt=&quot;전체 화면 캡쳐한 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AYXOo/btqBRvpPUuA/Tuk5S8Fqf0mi4xWQQPRN30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAYXOo%2FbtqBRvpPUuA%2FTuk5S8Fqf0mi4xWQQPRN30%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-02-09 오후 11.01.13.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;900&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;전체 화면 캡쳐한 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;second&quot;&gt;&lt;b&gt;2. 화면 일부 찍기 (파일 저장) :&amp;nbsp; Shift + Command + 4 이후 화면 부분 선택&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;전체 화면 찍기와 마찬가지로 결과물은 바탕화면에 저장된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-02-09 오후 11.05.54.png&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhbTsI/btqBTL6zVuM/xqBIXk05sLQisDaXp0KxQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhbTsI/btqBTL6zVuM/xqBIXk05sLQisDaXp0KxQK/img.png&quot; data-alt=&quot;화면 일부 찍은 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhbTsI/btqBTL6zVuM/xqBIXk05sLQisDaXp0KxQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhbTsI%2FbtqBTL6zVuM%2FxqBIXk05sLQisDaXp0KxQK%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-02-09 오후 11.05.54.png&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;419&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;화면 일부 찍은 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;third&quot;&gt;&lt;b&gt;3. 화면 일부 찍기 (클립보드 저장) :&amp;nbsp; Shift + Control + Command + 4 이후 화면 부분 선택&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기존 Capture 와 달리 어디든 바로 붙여 넣기 할 수 있도록 클립보드에 저장된다. (별도의 파일 저장은 없음)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 원하는 곳에 Command + v 하여 바로 붙여 넣을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekyj0C/btqBQoY1AXx/qGwBVW5ezVOzeH2jJ09Fvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekyj0C/btqBQoY1AXx/qGwBVW5ezVOzeH2jJ09Fvk/img.png&quot; data-alt=&quot;화면 일부 찍고 붙여 넣기한 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekyj0C/btqBQoY1AXx/qGwBVW5ezVOzeH2jJ09Fvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fekyj0C%2FbtqBQoY1AXx%2FqGwBVW5ezVOzeH2jJ09Fvk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;299&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;화면 일부 찍고 붙여 넣기한 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;fourth&quot;&gt;&lt;b&gt;4. 원하는 Window 찍기&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(파일 저장)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: Shift + Command + 4 + Space 이후 원하는 Window 선택&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Shift + Command + 4 후에 Space 를 누르면 카메라 아이콘으로 커서가 변경된다. (혹은 Shift + Command + 4 + Space)&lt;/p&gt;
&lt;p&gt;이후 캡쳐하고자 하는 Window를 선택하면 해당 창만 캡쳐되어 바탕화면에 파일로 저장된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-02-09 오후 11.15.23.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;819&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjWg6S/btqBPXm6AD8/FYXOdMreGqyIpgskgvu7sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjWg6S/btqBPXm6AD8/FYXOdMreGqyIpgskgvu7sk/img.png&quot; data-alt=&quot;특정 Window 를 캡쳐한 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjWg6S/btqBPXm6AD8/FYXOdMreGqyIpgskgvu7sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjWg6S%2FbtqBPXm6AD8%2FFYXOdMreGqyIpgskgvu7sk%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-02-09 오후 11.15.23.png&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;819&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;특정 Window 를 캡쳐한 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;fifth&quot;&gt;&lt;b&gt;5. 원하는 Window 찍기&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(클립보드 저장)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: Shift + Control + Command + 4 + Space 이후 원하는 Window 선택&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;파일로 저장되지 않고, 다른 곳에 바로 붙여 넣을 수 있게 Control 도 같이 눌러주면 클립보드에 화면이 저장된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Command + v 를 통해 원하는 곳에 바로 붙여 넣을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-02-09 오후 11.22.37.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q9SFe/btqBTLZOfbz/NeKN7bGLrBRMVnAOP00zk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q9SFe/btqBTLZOfbz/NeKN7bGLrBRMVnAOP00zk0/img.png&quot; data-alt=&quot;특정 Window 를 캡쳐하고 붙여넣기한 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q9SFe/btqBTLZOfbz/NeKN7bGLrBRMVnAOP00zk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq9SFe%2FbtqBTLZOfbz%2FNeKN7bGLrBRMVnAOP00zk0%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-02-09 오후 11.22.37.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;486&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;특정 Window 를 캡쳐하고 붙여넣기한 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Mac</category>
      <category>MacOS</category>
      <category>screenshot</category>
      <category>화면캡쳐</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/329</guid>
      <comments>https://mytechmemo.tistory.com/329#entry329comment</comments>
      <pubDate>Sun, 9 Feb 2020 17:10:51 +0900</pubDate>
    </item>
    <item>
      <title>Python - iterable 과 iterator, 그리고 반복문</title>
      <link>https://mytechmemo.tistory.com/325</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;#first&quot;&gt;iterable 의 정의 및 이해&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;#second&quot;&gt;iterator 의 정의 및 이해&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 id=&quot;first&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;iterable 의 정의 및 이해&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;iterable : 한 번에 하나의 member를 반환할 수 있는 object (객체)를 의미.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;iterator 로 변환이 가능.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;list, str, tuple 와 같은 모든 Sequence type&lt;/li&gt;
&lt;li&gt;dict,&amp;nbsp;file&amp;nbsp;object&amp;nbsp;혹은&amp;nbsp;sequence&amp;nbsp;semantic&amp;nbsp;을&amp;nbsp;가진&amp;nbsp;__iter__()&amp;nbsp;method&amp;nbsp;나&amp;nbsp;__getitem__()&amp;nbsp;method&amp;nbsp;가&amp;nbsp;구현된&amp;nbsp;object&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;iterable 은 for loop 나 sequence 가 필요한 zip(), map() 등에 사용될 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일반적으로 iterator 로 변환 후 사용된다.&lt;/p&gt;
&lt;p&gt;iter() 를 이용해 해당 object의 iterator를 생성하여 사용할 수도 있지만, for 와 같은 statement에서는 자동으로 임의의 iterator를 생성하여 사용된다.&lt;/p&gt;
&lt;pre id=&quot;code_1577889634405&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class oneDigitList_iterable:
    # Class to implement an iterable of oneDigitCount

    def __init__(self, max = 10):
        if max &amp;gt;= 10:
            self.max = 10
        else:
            self.max = max
        self.n = 1

    def __iter__(self):
        while self.n &amp;lt; self.max:
            yield self.n
            self.n += 1

oneList = oneDigitList_iterable()
print(oneList)
print(type(oneList))

for item in oneList:
    print(item)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1577889663791&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user@TechNote:~$ python3 iterable.py 
&amp;lt;__main__.oneDigitList object at 0x7fdb1847b748&amp;gt;
&amp;lt;class '__main__.oneDigitList'&amp;gt;
1
2
3
4
5
6
7
8
9&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 경우 oneDigitList instance 내에 __iter__() method 가 구현되어 있어 iterable 하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 iterable 한 상태로 바로 사용되지 않고, for ~ in 구문과 같이 사용되어 자동으로 iterator 로 변환 후 사용되었다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7oD61/btqz74gRtS3/uSLnZWB1m8hzmnrBXoK9M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7oD61/btqz74gRtS3/uSLnZWB1m8hzmnrBXoK9M1/img.png&quot; data-alt=&quot;참조 : https://docs.python.org/3/glossary.html#term-iterable&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7oD61/btqz74gRtS3/uSLnZWB1m8hzmnrBXoK9M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7oD61%2Fbtqz74gRtS3%2FuSLnZWB1m8hzmnrBXoK9M1%2Fimg.png&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;279&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;참조 : https://docs.python.org/3/glossary.html#term-iterable&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 id=&quot;second&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;iterator&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;의 정의 및 이해&lt;/b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;iterator : 데이터의 흐름 (stream)을 의미. &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 흐름 (stream) 내에서 바로 다음에 처리해야 할 데이터를 기억하고 있음.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;iterator 는 iterator object 를 반환하기 위해 __iter__() method 또한 필요로 하고, 이로인해 iterable 이 사용되는 곳에서도 사용 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1577934475274&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class oneDigitList_iterator:
    # Class to implement an iterator of oneDigitCount

    def __init__(self, max = 10):
        if max &amp;gt;= 10:
            self.max = 10
        else:
            self.max = max
        self.n = 1

    def __iter__(self):
        return self

    def __next__(self):
        while self.n &amp;lt; self.max:
            self.n += 1
            return self.n - 1
        else:
            raise StopIteration

oneList = oneDigitList_iterator()
print(oneList)
print(type(oneList))

for item in oneList:
    print(item)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1577934485715&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user@TechNote:~$ python3 iterator.py 
&amp;lt;__main__.oneDigitList_iterator object at 0x7f79f6817630&amp;gt;
&amp;lt;class '__main__.oneDigitList_iterator'&amp;gt;
1
2
3
4
5
6
7
8
9&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;__next__() method 를 호출할 때 마다 해당 stream 내의 연속적인 아이템을 반환한다. 해당 흐름 내에 더 이상 반환할 아이템이 없을 경우 StopIteration exception 을 발생시킨다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1577935181605&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;iterableList = [1, 2, 3]

iterator = iter(iterableList)
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1577935194940&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user@TechNote:~$ python3 iterator_2.py 
1
2
3
Traceback (most recent call last):
  File &quot;iterator_2.py&quot;, line 7, in &amp;lt;module&amp;gt;
    print(next(iterator))
StopIteration&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;list 와 같은 container 를 iter() function에 넘기거나 for loop 에서 사용하게 되면 매번 새로운 iterator 를 생성한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래와 같이 iterator 를 만든 후 해당 iterator 를 사용하게 되면 이미 위치가 끝을 가리킨 이후에는 아무런 데이터를 반환하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1577935545019&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;iterableList = [1, 2, 3]

print(&quot;Based on List(iterable)&quot;)

for item in iterableList:
    print(item)

for item in iterableList:
    print(item)


iterator = iter(iterableList)

print(&quot;Based on iterator&quot;)

for item in iterator:
    print(item)

for item in iterator:
    print(item)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1577935559152&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user@TechNote:~$ python3 iterator_3.py 
Based on List(iterable)
1
2
3
1
2
3
Based on iterator
1
2
3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LkeEC/btqz7n9iypw/kwOMtJk6P7BwakEo9j9Rek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LkeEC/btqz7n9iypw/kwOMtJk6P7BwakEo9j9Rek/img.png&quot; data-alt=&quot;참조 :&amp;amp;amp;nbsp;https://docs.python.org/3/glossary.html#term-iterator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LkeEC/btqz7n9iypw/kwOMtJk6P7BwakEo9j9Rek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLkeEC%2Fbtqz7n9iypw%2FkwOMtJk6P7BwakEo9j9Rek%2Fimg.png&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;279&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;참조 :&amp;nbsp;https://docs.python.org/3/glossary.html#term-iterator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>FOR</category>
      <category>iterable</category>
      <category>iterator</category>
      <category>loop</category>
      <category>Python</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/325</guid>
      <comments>https://mytechmemo.tistory.com/325#entry325comment</comments>
      <pubDate>Thu, 2 Jan 2020 12:29:18 +0900</pubDate>
    </item>
    <item>
      <title>DDR-SDRAM 계열 RAM 에 대한 이해</title>
      <link>https://mytechmemo.tistory.com/328</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#first&quot;&gt;DDR-SDRAM 계열 RAM 기본 정보&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#second&quot;&gt;DDR/DDR2/DDR3/DDR4&amp;nbsp;표준이름/모듈&amp;nbsp;이름&amp;nbsp;목록&amp;nbsp;정리&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#third&quot;&gt;PC 내 메모리 정보 확인 방법&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b id=&quot;first&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;DDR-SDRAM 계열 RAM 기본 정보&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;▶ 서로 다른 속도의 RAM이 혼용될 경우 낮은 속도의 RAM에 맞추어 동작한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;▶&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;일부 Main Board 의 경우 특정 RAM 이 지원되지 않을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(Main Board 사의 홈페이지에서 해당 보드에 지원하는 RAM 목록을 확인하고 장착한다.)&lt;/p&gt;
&lt;p&gt;예 ) &lt;a href=&quot;https://www.gigabyte.com/kr/Motherboard/GA-B150M-DS3H-rev-10/support#support-doc&quot;&gt;https://www.gigabyte.com/kr/Motherboard/GA-B150M-DS3H-rev-10/support#support-doc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;▶ 성능이 낮은 RAM 이 항상 싼 것은 아니다.&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;DDRRAM.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Aa9wS/btqAPeDoR7U/xr9QuONYW5hOrTZSH4chKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Aa9wS/btqAPeDoR7U/xr9QuONYW5hOrTZSH4chKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Aa9wS/btqAPeDoR7U/xr9QuONYW5hOrTZSH4chKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAa9wS%2FbtqAPeDoR7U%2Fxr9QuONYW5hOrTZSH4chKk%2Fimg.png&quot; data-filename=&quot;DDRRAM.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;304&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;/&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;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b id=&quot;second&quot;&gt;DDR/DDR2/DDR3/DDR4 표준이름/모듈 이름 목록 정리&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DDR SDRAM&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;표준&amp;nbsp;이름&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;데이터&amp;nbsp;속도&amp;nbsp;(MT/s)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;모듈&amp;nbsp;이름&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;최고&amp;nbsp;전송&amp;nbsp;속도&amp;nbsp;(MB/s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR-200&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;200&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC-1600&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;1600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR-266&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;266.6&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC-2100&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;2133.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR-333&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;333.3&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC-2700&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;2666.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR-400&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;400&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC-3200&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;3200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DDR2 SDRAM&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;표준&amp;nbsp;이름&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;데이터&amp;nbsp;속도&amp;nbsp;(MT/s)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;모듈&amp;nbsp;이름&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;최고&amp;nbsp;전송&amp;nbsp;속도&amp;nbsp;(MB/s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR2-400&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;400&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC2-3200&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;3200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR2-533&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;533.3&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC2-4200&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;4266.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR2-667&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;666.6&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC2-5300&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;5333.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR2-800&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;800&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC2-6400&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;6400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR2-1066&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;1066.6&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC2-8500&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;8533.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DDR3 SDRAM&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 240px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;표준&amp;nbsp;이름&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;데이터&amp;nbsp;속도&amp;nbsp;(MT/s)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;모듈&amp;nbsp;이름&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;최고&amp;nbsp;전송&amp;nbsp;속도&amp;nbsp;(MB/s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR3-800&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;800&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC3-6400&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;6400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR3-1066&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;1066&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC3-8500&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;8533&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR3-1333&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;1333&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC3-10600&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;10667&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR3-1600&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;1600&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC3-12800&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;12800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR3-1866&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;1866&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC3-14900&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;14933&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR3-2133&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;2133&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC3-17000&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;17066&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DDR4 SDRAM&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 140px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;표준&amp;nbsp;이름&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;데이터&amp;nbsp;속도&amp;nbsp;(MT/s)&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;모듈&amp;nbsp;이름&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;최고&amp;nbsp;전송&amp;nbsp;속도&amp;nbsp;(MB/s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR4-1600&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;1600&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC4-12800&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;12800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR4-1866&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;1866.67&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC4-14900&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;14933.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR4-2133&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;2133.33&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC4-17000&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;17066.67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR4-2400&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;2400&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC4-19200&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;19200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR4-2666&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;2666.67&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC4-21333&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;21333.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR4-2933&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;2933.33&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC4-23466&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;23466.67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;DDR4-3200&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;3200&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;PC4-25600&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 20px;&quot;&gt;25600&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b id=&quot;third&quot;&gt;PC&amp;nbsp;내&amp;nbsp;메모리&amp;nbsp;정보&amp;nbsp;확인&amp;nbsp;방법&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) CPU-Z 를 다운로드 받아 실행 (Link : &lt;a href=&quot;https://www.cpuid.com/softwares/cpu-z.html&quot;&gt;https://www.cpuid.com/softwares/cpu-z.html&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) SPD (Serial Presence Detect) 탭 선택하여 Memory 정보 확인&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;cpuz_SPD.png&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CddEa/btqAQkDvACi/5j5f1e0TofkCsBPk4Jn9i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CddEa/btqAQkDvACi/5j5f1e0TofkCsBPk4Jn9i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CddEa/btqAQkDvACi/5j5f1e0TofkCsBPk4Jn9i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCddEa%2FbtqAQkDvACi%2F5j5f1e0TofkCsBPk4Jn9i0%2Fimg.png&quot; data-filename=&quot;cpuz_SPD.png&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;402&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer architecture</category>
      <category>CPUZ</category>
      <category>DDR</category>
      <category>SDRAM</category>
      <author>TechNote.kr</author>
      <guid isPermaLink="true">https://mytechmemo.tistory.com/328</guid>
      <comments>https://mytechmemo.tistory.com/328#entry328comment</comments>
      <pubDate>Wed, 1 Jan 2020 22:42:56 +0900</pubDate>
    </item>
  </channel>
</rss>