<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>시스템 &amp;amp; 개발</title>
    <link>https://codei.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 9 May 2026 12:58:08 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>코드넴</managingEditor>
    <item>
      <title>맥 추천 프로그램 - homerow</title>
      <link>https://codei.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;leader key에 이은 마우스를 사용하지 않고 맥을 편리하게 사용하는 맥 추천 프로그램이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.homerow.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.homerow.app&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750692282192&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Homerow | Keyboard shortcuts for every button in macOS&quot; data-og-description=&quot;Homerow lets you navigate macOS with more keyboard and less mouse.&quot; data-og-host=&quot;www.homerow.app&quot; data-og-source-url=&quot;https://www.homerow.app/&quot; data-og-url=&quot;https://homerow.app&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/br3oZl/hyZbzn958x/kkc2t9acLPUJiK6eeyRgw0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bGFUZY/hyZckK7YvW/89LfW0nXoa6R3drCzEfeD0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.homerow.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.homerow.app/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/br3oZl/hyZbzn958x/kkc2t9acLPUJiK6eeyRgw0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bGFUZY/hyZckK7YvW/89LfW0nXoa6R3drCzEfeD0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Homerow | Keyboard shortcuts for every button in macOS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Homerow lets you navigate macOS with more keyboard and less mouse.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.homerow.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;homerow는 무료로도 사용가능 하지만 난 유료로 구입을 했다.&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;이프로그램의 장점은 ideavim에서 사용하는 ideavim-easymotion 과 비슷한 기능을 하는 프로그램이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말보단 아래 이미지를 확인해보면 이해가 쉬울것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTkXQT/btsOOcqmQqz/Efz2HweiHzd2I5eLb8gu91/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTkXQT/btsOOcqmQqz/Efz2HweiHzd2I5eLb8gu91/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTkXQT/btsOOcqmQqz/Efz2HweiHzd2I5eLb8gu91/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dTkXQT/btsOOcqmQqz/Efz2HweiHzd2I5eLb8gu91/img.gif&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;800&quot; height=&quot;31&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;31&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;shortcut을 설정해 놓으면 맥 화면에 label이 생성이 되는데 이 label을 키보드로 입력을 하면 마우가 해당 위치에 이동하여 클릭 하는 동작을 수행 하게된다.&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;위 화면은 yo를 입력 한 결과 Window 메뉴가 실행 되는 화면이다.&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;이렇게 사용한다면 개발 할때 사용하던 ideavim-easymontion 과 비슷한 효과를 가질 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롬 같은 브라우저에서도 지원 하기에 마우스를 사용하지 않고 웹페이지 이동도 용이하게 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 사용하는 옵션은&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;1094&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZIyE9/btsOOLTiboz/Udnlcs3zZ5pSav5M45KEiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZIyE9/btsOOLTiboz/Udnlcs3zZ5pSav5M45KEiK/img.png&quot; data-alt=&quot;label character를 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZIyE9/btsOOLTiboz/Udnlcs3zZ5pSav5M45KEiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZIyE9%2FbtsOOLTiboz%2FUdnlcs3zZ5pSav5M45KEiK%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;1532&quot; height=&quot;1094&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;label character를 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;label characters를 설정하면 해당하는 문자를 조합해서 문자열을 만들어 주기에 편리하게 사용할 수 있는 기능이다.&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;qwertyuiop내에서만 label이 생성되기에 mo,nc 등 이 와중에 키보드의 동선도 내 마음대로 설정 할 수 있는 것이다.&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;가격은 $49.99 이지만 학생이면 학생 할인을 받을 수 있기에 한번 구입하면 평생 사용으로 사용하는 것도 좋은거 같다.&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;무료 사용은 50번을 사용하면 광고를 봐야 한다.&lt;/p&gt;</description>
      <category>기타/맥</category>
      <category>homerow</category>
      <category>IdeaVim</category>
      <category>keyboard</category>
      <category>leader key</category>
      <category>Shortcut</category>
      <category>vim</category>
      <category>맥북</category>
      <category>추천</category>
      <category>키보드</category>
      <category>프로그램</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/56</guid>
      <comments>https://codei.tistory.com/56#entry56comment</comments>
      <pubDate>Tue, 24 Jun 2025 00:26:06 +0900</pubDate>
    </item>
    <item>
      <title>맥북 추천 프로그램 - Leader Key</title>
      <link>https://codei.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;맥북 추천 프로그램을 소개하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 하면서 VIM 을 사용중에 있는데 익숙해지다 보니 마우스 사용이 불편해 지기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 마우스로 조금더 어플리케이션을 왔다 갔다 할 수 없는지 찾아보다 좋은 프로그램을 찾아 포스팅해 보려한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우에서 열려 있는 창들의 화면 전환을 하거나, 프로그램들을 전환 하려면 Ctrl + Tab을 사용을 하여 전환을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥에서는 Cmd + Tab을 누르면 윈도우 처럼 사용이 가능한데 이게 생각보다 귀찮다.&lt;br /&gt;개발을 하다보면 많은 툴들을 띄어놓거나 최근에는 ChatGPT등을 사용하다보면 Cmd + Tab을 여러번 누르거나 방향키로 움직여 해당 프로그램까지 움직여서 사용해야하는데 이마저도 귀찮은 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 사용한 프로그램은 내가 잘알기에 빠르게 전환을 하거나 실행을 하고 싶어서 찾아본 프로그램이 바로 Leader Key이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단축키로 창 전환이나 프로그램을 실행 시킬 수 있는 것이다.&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/mikker/LeaderKey.app&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Leader Key&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750256571624&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - mikker/LeaderKey.app: The *faster than your launcher* launcher&quot; data-og-description=&quot;The *faster than your launcher* launcher. Contribute to mikker/LeaderKey.app development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/mikker/LeaderKey.app&quot; data-og-url=&quot;https://github.com/mikker/LeaderKey.app&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cplYNo/hyZcdkeWNG/xWN9FhceCknDbOETkk9MLK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bbSmCr/hyY78LLhrR/5PxmmfkoKtUIEkcvhM394K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/mikker/LeaderKey.app&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/mikker/LeaderKey.app&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cplYNo/hyZcdkeWNG/xWN9FhceCknDbOETkk9MLK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bbSmCr/hyY78LLhrR/5PxmmfkoKtUIEkcvhM394K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - mikker/LeaderKey.app: The *faster than your launcher* launcher&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The *faster than your launcher* launcher. Contribute to mikker/LeaderKey.app development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈 소스이고 무료 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 방법은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Brew를 사용할 경우&lt;/p&gt;
&lt;pre id=&quot;code_1750256641553&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ brew install leader-key&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;Brew를 사용하지 않을 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/mikker/LeaderKey.app/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/mikker/LeaderKey.app/releases&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750256673567&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Releases &amp;middot; mikker/LeaderKey.app&quot; data-og-description=&quot;The *faster than your launcher* launcher. Contribute to mikker/LeaderKey.app development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/mikker/LeaderKey.app/releases&quot; data-og-url=&quot;https://github.com/mikker/LeaderKey.app/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gRb5y/hyZbxwnTy0/fpXIespbOFwvz8KU1IrqsK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/CB39K/hyZclbvJfe/GqGrwpmyZys45XwDs3ava1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/OpwLN/hyY8WqUXd5/kBvfvPT50wekjq7v4e5SM0/img.png?width=1252&amp;amp;height=932&amp;amp;face=0_0_1252_932&quot;&gt;&lt;a href=&quot;https://github.com/mikker/LeaderKey.app/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/mikker/LeaderKey.app/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gRb5y/hyZbxwnTy0/fpXIespbOFwvz8KU1IrqsK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/CB39K/hyZclbvJfe/GqGrwpmyZys45XwDs3ava1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/OpwLN/hyY8WqUXd5/kBvfvPT50wekjq7v4e5SM0/img.png?width=1252&amp;amp;height=932&amp;amp;face=0_0_1252_932');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Releases &amp;middot; mikker/LeaderKey.app&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The *faster than your launcher* launcher. Contribute to mikker/LeaderKey.app development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에 접속하여 Leader.Key.app.zip을 다운 받는다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z18ax/btsOHlHzO7S/CMOrnQJR2m9xiiyvpUOzs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z18ax/btsOHlHzO7S/CMOrnQJR2m9xiiyvpUOzs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z18ax/btsOHlHzO7S/CMOrnQJR2m9xiiyvpUOzs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz18ax%2FbtsOHlHzO7S%2FCMOrnQJR2m9xiiyvpUOzs1%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;1474&quot; height=&quot;324&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;324&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;br /&gt;General 탭에&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uCalP/btsOFIKZI9v/KUNAzeNtrluNw2QWHHx6o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uCalP/btsOFIKZI9v/KUNAzeNtrluNw2QWHHx6o0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uCalP/btsOFIKZI9v/KUNAzeNtrluNw2QWHHx6o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuCalP%2FbtsOFIKZI9v%2FKUNAzeNtrluNw2QWHHx6o0%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;1460&quot; height=&quot;530&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 이미 사용하고 있는 설정창이지만 이렇게 나올 것이다 하단에 Shortcut은 F12나 다른 것들을 사용 할 수 있는데 나는 BTT를 사용하기때문에 키 매핑을 하여 오른쪽 Cmd를 매핑하여 사용중이다.&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;Config를 설정 하는 방법은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Add group 과 Add action 을 조합하여 사용하는데 Group은 말그대로 단축키의 모음인 것이고, action은 최종적으로 실행할 단축키인것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 맨 왼쪽칸을 클릭하면 단축키를 사용 할 수 있는데 단축키는 1개만 사용 할 수 있고 group과 action의 설정은 다르다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wz3QD/btsOF9Isc2g/RB6fEvf6p986hQIsFVvXG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wz3QD/btsOF9Isc2g/RB6fEvf6p986hQIsFVvXG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wz3QD/btsOF9Isc2g/RB6fEvf6p986hQIsFVvXG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWz3QD%2FbtsOF9Isc2g%2FRB6fEvf6p986hQIsFVvXG0%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;1342&quot; height=&quot;260&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;260&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;Add group으로 c 단축키를 눌렀을때 실행할 그룹을 생성 하였고 gemini와 chantgpt를 실행하고 전환 할 수 있도록 설정 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action에는 Application, Command, URL, Folder를 설정 할 수있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 기능은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Application : 프로그램을 실행 및 전환하여 프로그램을 설치된 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- URL : 웹 브라우저나 이동하고싶은 웹 페이지 주소, Application 을 실행 할 수 있는 Scheme 주소이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Command : Leader Key가 실행 할 Command 인데 Leader Key에서 직접 Command 명령어로 실행 하기에 자주 쓰는 명령어는 Application 을 open /Application/ChaptGPT.app 이런식으로 사용 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Folder: Folder는 말그대로 폴더를 여는 것인데 잘 안쓴다..&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;그렇다면 Chapt GPT 를 실행 시키면 어떤 방식으로 실행시키냐면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F12(오른쪽 Cmd) 을 키보드 누르고 -&amp;gt; c -&amp;gt; c 를 누르면 실행이 된다.&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;F12(오른쪽 Cmd)를 누르면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKiz2n/btsOH0wh3n1/GU8K38qtmelf3qpAJ2uLnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKiz2n/btsOH0wh3n1/GU8K38qtmelf3qpAJ2uLnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKiz2n/btsOH0wh3n1/GU8K38qtmelf3qpAJ2uLnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKiz2n%2FbtsOH0wh3n1%2FGU8K38qtmelf3qpAJ2uLnk%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;378&quot; height=&quot;372&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같은 화면이 나오고 이때 c를 누르고 또 c를 누르면 실행이 되는 원리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 팁은 저 화면이 나올때 ?(물음표) 을 타이핑 하면 내가 어떤 설정을 했는지 바로 볼 수가있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euoF1O/btsOG2O50L7/OgFxIKaDUqzFv5MhKbK8Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euoF1O/btsOG2O50L7/OgFxIKaDUqzFv5MhKbK8Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euoF1O/btsOG2O50L7/OgFxIKaDUqzFv5MhKbK8Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuoF1O%2FbtsOG2O50L7%2FOgFxIKaDUqzFv5MhKbK8Y1%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;540&quot; height=&quot;308&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;308&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;/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>기타/맥</category>
      <category>BTT</category>
      <category>leader key</category>
      <category>단축키</category>
      <category>맥</category>
      <category>명령어</category>
      <category>무료</category>
      <category>오픈소스</category>
      <category>추천</category>
      <category>프로그램</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/55</guid>
      <comments>https://codei.tistory.com/55#entry55comment</comments>
      <pubDate>Thu, 19 Jun 2025 00:03:18 +0900</pubDate>
    </item>
    <item>
      <title>Vscode vim multi cursor</title>
      <link>https://codei.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/VSCodeVim/Vim/issues/3588#issuecomment-1139373669&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/VSCodeVim/Vim/issues/3588#issuecomment-1139373669&lt;/a&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <category>cursor</category>
      <category>multi</category>
      <category>multi cursor</category>
      <category>vim</category>
      <category>vscode</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/54</guid>
      <comments>https://codei.tistory.com/54#entry54comment</comments>
      <pubDate>Thu, 25 Apr 2024 21:21:50 +0900</pubDate>
    </item>
    <item>
      <title>Go 1.22 release</title>
      <link>https://codei.tistory.com/53</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;go 가 1.22 버전이 추가 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 반길 부분은 loop에서 변수 캡쳐부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;go를 처음 배울때 가장 의아 하면서도 이해가 잘안됐던 부분이지만 생각보다 인지를 하고 사용해야한다는 강박에 goroutine을 사용할때 방법을 생각 해야했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하자면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707996269466&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i := 0; i &amp;lt; 10; i++ {
	go func() {
		fmt.Println(i)
	}()
}&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;위와 같은 프로그램을 실행 시킨다면 다른 언어에서는 순서는 보장하지 않지만 0,1,2,3,4,5,6,7,8,9 가 출력될 것이고 go에서도 그렇게 될거 같지만 그렇지 않다. 가장 나중의 i의 값이 캡쳐가 돼서 10이 10번 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결 하기 위한 방법은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i := i 이런식으로 재할당을 해주거나.&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;go func(i int) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}(i)&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;이런식으로 goroutine이 실행할때 i값을 복사해서 새로운 값으로 사용하게 하는 방법으로 해결 할 수 있었다.&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;궁금 하다면 go play ground에서 확인해 보면된다.&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://go.dev/play/p/_6iLDV4bP3G?v=goprev&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://go.dev/play/p/_6iLDV4bP3G?v=goprev&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707996415689&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Go Playground - The Go Programming Language&quot; data-og-description=&quot;Press Esc to move out of the editor. Loading share... About the Playground The Go Playground is a web service that runs on go.dev's servers. The service receives a Go program, vets, compiles, links, and runs the program inside a sandbox, then returns the o&quot; data-og-host=&quot;go.dev&quot; data-og-source-url=&quot;https://go.dev/play/p/_6iLDV4bP3G?v=goprev&quot; data-og-url=&quot;https://go.dev/play/p/_6iLDV4bP3G?v=goprev&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QXC3A/hyVjiEzqzo/q0pW2zGqVBWl0MVHW78IJ1/img.jpg?width=300&amp;amp;height=313&amp;amp;face=0_0_300_313&quot;&gt;&lt;a href=&quot;https://go.dev/play/p/_6iLDV4bP3G?v=goprev&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://go.dev/play/p/_6iLDV4bP3G?v=goprev&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QXC3A/hyVjiEzqzo/q0pW2zGqVBWl0MVHW78IJ1/img.jpg?width=300&amp;amp;height=313&amp;amp;face=0_0_300_313');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Go Playground - The Go Programming Language&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Press Esc to move out of the editor. Loading share... About the Playground The Go Playground is a web service that runs on go.dev's servers. The service receives a Go program, vets, compiles, links, and runs the program inside a sandbox, then returns the o&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;go.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이제 1.22 버전에서는 다른 프로그램에서 기대한 값들이 출력이 되는 것이 수정이 됐고 이제 변수를 재할당 하지 않고 사용 할 수 있다.&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://go.dev/play/p/_6iLDV4bP3G&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://go.dev/play/p/_6iLDV4bP3G&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707996460733&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Go Playground - The Go Programming Language&quot; data-og-description=&quot;Press Esc to move out of the editor. Loading share... About the Playground The Go Playground is a web service that runs on go.dev's servers. The service receives a Go program, vets, compiles, links, and runs the program inside a sandbox, then returns the o&quot; data-og-host=&quot;go.dev&quot; data-og-source-url=&quot;https://go.dev/play/p/_6iLDV4bP3G&quot; data-og-url=&quot;https://go.dev/play/p/_6iLDV4bP3G&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bDxUHZ/hyVjiLmP2J/kHLdEi8e544Un1bdk6Oug1/img.jpg?width=300&amp;amp;height=313&amp;amp;face=0_0_300_313&quot;&gt;&lt;a href=&quot;https://go.dev/play/p/_6iLDV4bP3G&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://go.dev/play/p/_6iLDV4bP3G&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bDxUHZ/hyVjiLmP2J/kHLdEi8e544Un1bdk6Oug1/img.jpg?width=300&amp;amp;height=313&amp;amp;face=0_0_300_313');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Go Playground - The Go Programming Language&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Press Esc to move out of the editor. Loading share... About the Playground The Go Playground is a web service that runs on go.dev's servers. The service receives a Go program, vets, compiles, links, and runs the program inside a sandbox, then returns the o&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;go.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 바뀐점이 있는데 PGO 의 성능이 2~ 14% 정도 향상이 됐고, rand 함수가 새로 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 실험 버전이라 릴리즈가 된다면 그때 다시 포스팅 하도록 해야겠다.&lt;/p&gt;</description>
      <category>개발/Go</category>
      <category>1.22</category>
      <category>capture</category>
      <category>FOR</category>
      <category>go</category>
      <category>go release</category>
      <category>golang</category>
      <category>Iterator</category>
      <category>loop</category>
      <category>PGO</category>
      <category>playground</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/53</guid>
      <comments>https://codei.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 15 Feb 2024 20:30:37 +0900</pubDate>
    </item>
    <item>
      <title>유튜브 결제 거래내역</title>
      <link>https://codei.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pay.google.com/gp/w/u/0/home/activity&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://pay.google.com/gp/w/u/0/home/activity&lt;/a&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <category>Premium</category>
      <category>youtube</category>
      <category>youtube premium</category>
      <category>거래내역</category>
      <category>결제내역</category>
      <category>유튜브</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/52</guid>
      <comments>https://codei.tistory.com/52#entry52comment</comments>
      <pubDate>Mon, 22 Jan 2024 22:35:14 +0900</pubDate>
    </item>
    <item>
      <title>WSUS (8024401c) clientwebservice/client.asmx timeout</title>
      <link>https://codei.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;WSUS를 초기 운영하다 보면 &lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;8024401c 와 같은 에러가 발생하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;클라이언트 윈도우 업데이트 8024401c 는 timeout이 발생했다는 오류&lt;/span&gt;메세지와 함께&lt;br /&gt;&lt;br /&gt;WS error http://server:8530/clientwebservice/client.asmx timeout 에러가 발생하는 경우가 생긴다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WSUS의 로그에는 시스템의 드라이버드를 로드를 하는데 로드를 하는 풀의 용량이 넘어 갔을때 무한으로 해당 드라이버들을 로드를 한다.&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;나는 WSUS 의 pool을 8GB로 세팅을 하였기에 위와 같은 문제점이 발생했다.&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;위의 IIS의 wsus pool의 용량을 16GB 로 올렸고 해당 드라이버들이 로드가 된 후에 정상적으로 작동 하였다.&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;Windows Server 2022 버전 기준으로 드라이버를 로딩 하는데 약 8GB의 pool 용량이 사용 됐으며 약 10GB의 풀을 사용함으로 Wsus의 풀 사이즈, queue 길이를 조절해 주는고 시스템의 메모리 가 부족할 경우 증설 하여 문제를 해결하는데 도움이 될 것이다.&lt;/p&gt;</description>
      <category>OS/Windows</category>
      <category>clientwebservice/client.asmx</category>
      <category>pool</category>
      <category>Queue</category>
      <category>timeout</category>
      <category>Windows Server 2022</category>
      <category>ws error</category>
      <category>WSUS</category>
      <category>업데이트</category>
      <category>윈도우 업데이트</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/51</guid>
      <comments>https://codei.tistory.com/51#entry51comment</comments>
      <pubDate>Mon, 22 Jan 2024 21:45:52 +0900</pubDate>
    </item>
    <item>
      <title>WSUS 내부 메모리 용량 제한</title>
      <link>https://codei.tistory.com/50</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;WSUS를 설정하여 사용하다 보면 내부 데이터베이스의 메로리 사용량이 올라간다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSMS가 있어야 하고 SSMS로 데이터베이스에 접속한다.&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 style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://rsync.co.kr/49&quot;&gt;2024.01.13 - [OS/Windows] - WSUS (Windows ServerUpdate Service) 재설치&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705150055983&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;WSUS (Windows ServerUpdate Service) 재설치&quot; data-og-description=&quot;WSUS를 세팅중 재 설치를 할 경우의 프로세스를 공유하고자 한다. 환경 : Windows Server 2022 (Windows Server 2012부터 적용 가능) Role 를 제거한다. PowerShell 로 실행한다 (관리자 권한) Remove-WindowsFeature -Name U&quot; data-og-host=&quot;rsync.co.kr&quot; data-og-source-url=&quot;https://rsync.co.kr/49&quot; data-og-url=&quot;https://rsync.co.kr/49&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzagwS/hyU5UvQ63I/t6kRGlhbuX5XDE6Rzxv8k0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cRTBzP/hyU5R61BHO/Zo4FANoFV9hP3kVtkSgxl1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/7ayWj/hyU5MxQNvl/Sysl7JjiKAQvY2jy5GBbXK/img.png?width=220&amp;amp;height=220&amp;amp;face=0_0_220_220&quot;&gt;&lt;a href=&quot;https://rsync.co.kr/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rsync.co.kr/49&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzagwS/hyU5UvQ63I/t6kRGlhbuX5XDE6Rzxv8k0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cRTBzP/hyU5R61BHO/Zo4FANoFV9hP3kVtkSgxl1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/7ayWj/hyU5MxQNvl/Sysl7JjiKAQvY2jy5GBbXK/img.png?width=220&amp;amp;height=220&amp;amp;face=0_0_220_220');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;WSUS (Windows ServerUpdate Service) 재설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WSUS를 세팅중 재 설치를 할 경우의 프로세스를 공유하고자 한다. 환경 : Windows Server 2022 (Windows Server 2012부터 적용 가능) Role 를 제거한다. PowerShell 로 실행한다 (관리자 권한) Remove-WindowsFeature -Name U&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rsync.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리를 생성하여 아래와 같이 입력한다&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;메모리 값인 512를 수정한다 단위는 MB이다.&lt;/p&gt;
&lt;pre id=&quot;code_1705150095348&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sp_configure &amp;rsquo;show advanced options&amp;rsquo;, 1;
reconfigure;
go
sp_configure &amp;lsquo;max server memory&amp;rsquo;, 512;
reconfigure;
go
exit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리를 실행후 재부팅 하면 적용이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 powershell 로 재시작 하면된다.&lt;/p&gt;
&lt;pre id=&quot;code_1705150262010&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stop-service WSUSService, W3SVC
실행 후 
Start-service WSUSService, W3SVC&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;추가로 WSUS pool을 IIS에 접속하여 고급설정에 들어가 memory 사용량도 조절 할 수 있다.&lt;/p&gt;</description>
      <category>OS/Windows</category>
      <category>2022</category>
      <category>Limit</category>
      <category>memory</category>
      <category>Server</category>
      <category>SSMS</category>
      <category>Windows</category>
      <category>WSUS</category>
      <category>데이터베이스</category>
      <category>메모리</category>
      <category>제한</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/50</guid>
      <comments>https://codei.tistory.com/50#entry50comment</comments>
      <pubDate>Sat, 13 Jan 2024 21:49:13 +0900</pubDate>
    </item>
    <item>
      <title>WSUS (Windows ServerUpdate Service) 재설치</title>
      <link>https://codei.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;WSUS를 세팅중 재 설치를 할 경우의 프로세스를 공유하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경 : Windows Server 2022 (Windows Server 2012부터 적용 가능)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Role 를 제거한다.&lt;/li&gt;
&lt;li&gt;PowerShell 로 실행한다 (관리자 권한)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Remove-WindowsFeature -Name UpdateServices,UpdateServices-DB,UpdateServices-RSAT,UpdateServices-API,UpdateServices-UI -IncludeManagementTools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SUSDB.mdf and SUSDB_log.ldf의 경로를 확인한다 (C:\Windows\WID\Data)&lt;/li&gt;
&lt;li&gt;3의 경로를 확인 후 절대 위 파일을 삭제 하지 않는다.&lt;/li&gt;
&lt;li&gt;SSMS 로 np:\\.\pipe\MICROSOFT##WID\tsql\query 접속한다.&lt;/li&gt;
&lt;li&gt;쿼리를 만든다.&lt;/li&gt;
&lt;li&gt;아래의 쿼리를 실행한다.&lt;br /&gt;&lt;code&gt;ALTER DATABASE SUSDB SET OFFLINE WITH ROLLBACK IMMEDIATE; DROP DATABASE SUSDB;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;9&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ContentDir 을 삭제한다 아래와 같이 cmd에서 명령어를 실행하면 D:\WSUS 의 경로를 삭제&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;c:\&amp;gt; reg query &quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Update Services\Server\Setup&quot; /v SqlServerName
    SqlServerName    REG_EXPAND_SZ    MICROSOFT##WID
c:\&amp;gt; reg query &quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Update Services\Server\Setup&quot; /v SqlDatabaseName
    SqlDatabaseName    REG_SZ    SUSDB
c:\&amp;gt; reg query &quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Update Services\Server\Setup&quot; /v ContentDir
    ContentDir    REG_EXPAND_SZ    D:\WSUS&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; start=&quot;10&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다시 롤을 추가한다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>OS/Windows</category>
      <category>Server</category>
      <category>susdb.mdf</category>
      <category>susdb_log.ldf</category>
      <category>update server</category>
      <category>Windows</category>
      <category>WSUS</category>
      <category>서버</category>
      <category>업데이트</category>
      <category>윈도우</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/49</guid>
      <comments>https://codei.tistory.com/49#entry49comment</comments>
      <pubDate>Sat, 13 Jan 2024 21:44:20 +0900</pubDate>
    </item>
    <item>
      <title>rockyos 이더넷 속도 제한</title>
      <link>https://codei.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일단 dnf install -y ethtool 으로 ethtool 을 설정하고.&lt;/p&gt;
&lt;pre id=&quot;code_1700210898025&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi /etc/NetworkManager/dispatcher.d/21-eth0-speed&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트를 생성후 아래와 같이 작성해 주고&lt;/p&gt;

&lt;pre id=&quot;code_1700210861912&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

IFACE=$1
STATE=$2

if [[ &quot;$IFACE&quot; == &quot;eth0&quot; &amp;amp;&amp;amp; &quot;$STATE&quot; == &quot;up&quot; ]]; then
    # Disable auto-negotiation
    ethtool -s $IFACE autoneg off

    # Set speed to 100baseT/Full
    ethtool -s $IFACE speed 100 duplex full
fi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장하고&lt;/p&gt;
&lt;pre id=&quot;code_1700210982705&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod +x /etc/NetworkManager/dispatcher.d/21-eth0-speed&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 권한을 바꿔주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700211011707&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl restart NetworkManager&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;eth0 인터페이스에 100 duplex full 로 설정을 하게 된다.&lt;/p&gt;</description>
      <category>OS/RockyOS</category>
      <category>ethtool</category>
      <category>Linux</category>
      <category>networkmanager</category>
      <category>RockyOS</category>
      <category>네트워크</category>
      <category>링크</category>
      <category>설정</category>
      <category>속도</category>
      <category>스피드</category>
      <category>제한</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/48</guid>
      <comments>https://codei.tistory.com/48#entry48comment</comments>
      <pubDate>Fri, 17 Nov 2023 17:50:45 +0900</pubDate>
    </item>
    <item>
      <title>Routing 테이블 설정</title>
      <link>https://codei.tistory.com/47</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;이전에 설명했던 라우팅 테이블의 설정을 바꿔봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전글을 확인 하려면 아래 링크를 확인해 보면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://rsync.co.kr/46&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.11.09 - [OS/RockyOS] - RockyOS 9 여러 인터페이스에 아이피 할당&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;192.168.0.0/24 대역의 eth0 인터페이스와 , 192.168.1.0/24 대역의 eth1 인터페이스 설정은 기존에선 default 라우팅 테이블이 2개여서 192.168.0.0/24 대역, 192.168.1.0/24 대역이 아닌 나가는 다른 대역에 대해선 eth0 아니면 eth1 을 타고 나갔다.&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;이번엔 라우팅 테이블을 수정하여 192.168.0.0/24 대역만 eth0 으로 나가고 나머지 대역은 eth1 대역만 나가게 하는 스크립트다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;pre id=&quot;code_1700211070658&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash

INTERFACE=$1
STATUS=$2

function setup_routing() {
    # Clear existing rules and routes
    ip route flush table Eth0
    ip route flush table Eth1

    ip rule add from 192.168.0.0/24 table Eth0

    ip route add 192.168.0.0/24 dev eth0 table Eth0
    ip route add default via 192.168.0.1 table Eth0

    ip route add default via 192.168.1.1
}

function clear_routing() {
    ip rule del from 192.168.0.0/24 table Eth0

}

case &quot;$STATUS&quot; in
    up)
        setup_routing
        ;;
    down)
        clear_routing
        ;;
esac&lt;/code&gt;&lt;/pre&gt;</description>
      <category>OS/RockyOS</category>
      <category>IP</category>
      <category>networkmanager</category>
      <category>nmcli</category>
      <category>RockyOS</category>
      <category>route</category>
      <category>고정</category>
      <category>네트워크</category>
      <category>다중</category>
      <category>라우팅</category>
      <category>인터페이스</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/47</guid>
      <comments>https://codei.tistory.com/47#entry47comment</comments>
      <pubDate>Fri, 17 Nov 2023 17:45:40 +0900</pubDate>
    </item>
    <item>
      <title>RockyOS 9 여러 인터페이스에 아이피 할당</title>
      <link>https://codei.tistory.com/46</link>
      <description>
&lt;p data-ke-size=&quot;size16&quot;&gt;RockyOS9 은 조금 변경 사항이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 /etc/sysconfig/network-scripts/ 에서 네트워크 설정을 변경 할 수 있었는데.&lt;br /&gt;이제는 /etc/NetworkManager/system-connections 에 저장이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699510183890&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nmcli connection migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 사용 하거나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699510206605&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nmcli connection migrate &amp;lt;profile_name|UUID|D-Bus_path&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;을 사용하여 migration 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 내용은 다음과 같다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NetworkManager&amp;nbsp;stores&amp;nbsp;new&amp;nbsp;network&amp;nbsp;profiles&amp;nbsp;in&amp;nbsp;keyfile&amp;nbsp;format&amp;nbsp;in&amp;nbsp;the&lt;br /&gt;/etc/NetworkManager/system-connections/&amp;nbsp;directory.&lt;br /&gt;&lt;br /&gt;Previously,&amp;nbsp;NetworkManager&amp;nbsp;stored&amp;nbsp;network&amp;nbsp;profiles&amp;nbsp;in&amp;nbsp;ifcfg&amp;nbsp;format&lt;br /&gt;in&amp;nbsp;this&amp;nbsp;directory&amp;nbsp;(/etc/sysconfig/network-scripts/).&amp;nbsp;However,&amp;nbsp;the&amp;nbsp;ifcfg&lt;br /&gt;format&amp;nbsp;is&amp;nbsp;deprecated.&amp;nbsp;By&amp;nbsp;default,&amp;nbsp;NetworkManager&amp;nbsp;no&amp;nbsp;longer&amp;nbsp;creates&lt;br /&gt;new&amp;nbsp;profiles&amp;nbsp;in&amp;nbsp;this&amp;nbsp;format.&lt;br /&gt;&lt;br /&gt;Connection&amp;nbsp;profiles&amp;nbsp;in&amp;nbsp;keyfile&amp;nbsp;format&amp;nbsp;have&amp;nbsp;many&amp;nbsp;benefits.&amp;nbsp;For&amp;nbsp;example,&lt;br /&gt;this&amp;nbsp;format&amp;nbsp;is&amp;nbsp;INI&amp;nbsp;file-based&amp;nbsp;and&amp;nbsp;can&amp;nbsp;easily&amp;nbsp;be&amp;nbsp;parsed&amp;nbsp;and&amp;nbsp;generated.&lt;br /&gt;&lt;br /&gt;Each&amp;nbsp;section&amp;nbsp;in&amp;nbsp;NetworkManager&amp;nbsp;keyfiles&amp;nbsp;corresponds&amp;nbsp;to&amp;nbsp;a&amp;nbsp;NetworkManager&lt;br /&gt;setting&amp;nbsp;name&amp;nbsp;as&amp;nbsp;described&amp;nbsp;in&amp;nbsp;the&amp;nbsp;nm-settings(5)&amp;nbsp;and&amp;nbsp;nm-settings-keyfile(5)&lt;br /&gt;man&amp;nbsp;pages.&amp;nbsp;Each&amp;nbsp;key-value-pair&amp;nbsp;in&amp;nbsp;a&amp;nbsp;section&amp;nbsp;is&amp;nbsp;one&amp;nbsp;of&amp;nbsp;the&amp;nbsp;properties&lt;br /&gt;listed&amp;nbsp;in&amp;nbsp;the&amp;nbsp;settings&amp;nbsp;specification&amp;nbsp;of&amp;nbsp;the&amp;nbsp;man&amp;nbsp;page.&lt;br /&gt;&lt;br /&gt;If&amp;nbsp;you&amp;nbsp;still&amp;nbsp;use&amp;nbsp;network&amp;nbsp;profiles&amp;nbsp;in&amp;nbsp;ifcfg&amp;nbsp;format,&amp;nbsp;consider&amp;nbsp;migrating&lt;br /&gt;them&amp;nbsp;to&amp;nbsp;keyfile&amp;nbsp;format.&amp;nbsp;To&amp;nbsp;migrate&amp;nbsp;all&amp;nbsp;profiles&amp;nbsp;at&amp;nbsp;once,&amp;nbsp;enter:&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;nmcli&amp;nbsp;connection&amp;nbsp;migrate&lt;br /&gt;&lt;br /&gt;This&amp;nbsp;command&amp;nbsp;migrates&amp;nbsp;all&amp;nbsp;profiles&amp;nbsp;from&amp;nbsp;ifcfg&amp;nbsp;format&amp;nbsp;to&amp;nbsp;keyfile&lt;br /&gt;format&amp;nbsp;and&amp;nbsp;stores&amp;nbsp;them&amp;nbsp;in&amp;nbsp;/etc/NetworkManager/system-connections/.&lt;br /&gt;&lt;br /&gt;Alternatively,&amp;nbsp;to&amp;nbsp;migrate&amp;nbsp;only&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;profile,&amp;nbsp;enter:&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;nmcli&amp;nbsp;connection&amp;nbsp;migrate&amp;nbsp;&amp;lt;profile_name|UUID|D-Bus_path&amp;gt;&lt;br /&gt;&lt;br /&gt;For&amp;nbsp;further&amp;nbsp;details,&amp;nbsp;see:&lt;br /&gt;*&amp;nbsp;nm-settings-keyfile(5)&lt;br /&gt;*&amp;nbsp;nmcli(1)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하여 하나의 interface 에 여러 IP 를 할당하는건 비교적 쉽다. nmtui 를 사용하거나 nmcli 를 사용하여 ipv4.addresses 를 ,로 구분하여 지속적으로 추가하면 되지만 여러 interface에 IP 를 할당하여 통신하는건 비교적 어려운 일이다.&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;내 기억으론 centos7 까지는 단순히 다른 대역의 IP 라 하더라도 통신이 잘 할 됐는데 이번에는 문제가 안되는 사항이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 겪은 사항은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;편의 상 인터페이스 이름과 네트워크 대역은 내 상황에 맞게 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eth0 : 192.168.0.2/25 gw 192.168.0.1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eth1 : 192.168.1.2/25 gw 192.168.1.2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 IP를 할당하였을때 당연하겠지만 default gateway 가 가장 먼저 인터페이스가 UP 된 기준으로 하여 통신이 될것이고 192.168.0/25 대역으로만 외부망 통신이 가능할 것이다.&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;내가 원하는 바는 eth0 대역으로 들어온 네트워크는 eth0 으로, eth1 대역으로 들어온 네트워크는 eth1로 통신하고 싶었는데 쉽지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 고민의 결과 끝에 해결 방법을 다음과 같이 찾았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PBR(Policy-Based Routing) 방식으로 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 각 인터페이스에 사용하고자 하는 네트워크를 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;/p&gt;
&lt;pre id=&quot;code_1699510608888&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo '100 Eth0' &amp;gt;&amp;gt; /etc/iproute2/rt_tables
echo '200 Eth1' &amp;gt;&amp;gt; /etc/iproute2/rt_tables&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;위 명령으로 라우팅 테이블을 작성하기 위한 rule 을 정의 하고&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. /etc/NetworkManager/dispatcher.d 로 이동하여 20-pbr 이라는 파일을 생성한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 생성한 20-pbr 에 다음과 같은 스크립트를 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1699510725109&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/bin/bash
# 인터페이스 이름과 상태를 환경변수에서 가져옵니다.
INTERFACE=$1
STATUS=$2

# NetworkManager에 의해 설정된 인터페이스 이름을 확인합니다.
test -n &quot;$INTERFACE&quot; || exit 0

# run() 함수는 스크립트의 실행 가능 여부를 검사하고 실행합니다.
run() {
    test -x &quot;$1&quot; || exit 0
    &quot;$1&quot; &quot;$INTERFACE&quot; &quot;$STATUS&quot;
}

# 라우팅 규칙을 설정하는 로직입니다.
set_routing_rules() {
    local iface=$1
    local status=$2

    if [ &quot;$iface&quot; == &quot;eth0&quot; ]; then
        # eth0을 위한 라우팅 규칙을 추가합니다.
	ip route add 192.168.0.0/25 dev eth0 table Eth0
	ip route add default via 192.168.0.1 dev eth0 table Eth0
	ip rule add from 192.168.0.0/25 table Eth0
    fi

    if [ &quot;$iface&quot; == &quot;eth1&quot; ]; then
    	# eth1을 위한 라우팅 규칙을 추가합니다.
        ip route add 192.168.1.0/25 dev eth1 table Eth1
        ip route add default via 192.168.1.1 dev eth1 table Eth1
        ip rule add from 192.168.1.0/25 table Eth1
    fi
}

case &quot;$2&quot; in
    &quot;up&quot;)
	    set_routing_rules &quot;$INTERFACE&quot;
	    ;;
    &quot;pre-up&quot;)
        ;;
    &quot;down&quot;)
        ;;
    &quot;pre-down&quot;)
        ;;
esac&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;5. 재부팅&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;간략한 개요는 다음과 같다. static 라우팅 테이블을 잡는 것인데. NetworkManager가 라우팅을 설정 하도록 위임 한 것이라고 생각하면 된다.&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>OS/RockyOS</category>
      <category>9</category>
      <category>CentOS</category>
      <category>gateway</category>
      <category>Interface</category>
      <category>IP</category>
      <category>multiple</category>
      <category>redhat</category>
      <category>rocky</category>
      <category>route</category>
      <category>static</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/46</guid>
      <comments>https://codei.tistory.com/46#entry46comment</comments>
      <pubDate>Thu, 9 Nov 2023 15:22:15 +0900</pubDate>
    </item>
    <item>
      <title>Retry 패키지</title>
      <link>https://codei.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Go 에서 http 요청을 하거나 내부 프로세스에서 요청을 할때 실패할 경우 다시 재시도 하는 패키지를 찾았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지는&lt;/p&gt;
&lt;div style=&quot;background-color: #282c34; color: #abb2bf;&quot;&gt;
&lt;pre class=&quot;go&quot; data-ke-language=&quot;go&quot;&gt;&lt;code&gt;github.com/avast/retry-go/v4&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;을 사용했고 가장 많은 star 를 보유하고 있는것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 방법은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #282c34; color: #abb2bf;&quot;&gt;
&lt;pre class=&quot;go&quot; data-ke-language=&quot;go&quot;&gt;&lt;code&gt;func TestRetryStrategy(t *testing.T) {

	retryOptions := []retry.Option{
		retry.Attempts(uint(3)), // 재시도 3번
		retry.LastErrorOnly(true), // 여러 에러중 가장 마지막 에러를 출력
		retry.RetryIf(func(err error) bool { // 에러의 종류에 따라 중단할지 시작할지 결정
			return true
		}),
	}
	count := 0
	str, err := retry.DoWithData(func() (string, error) { // 데이터를 리턴 받을 경우 사용
    // 리턴 값이 없을 경우 retry.Do(retryableFunc RetryableFunc, opts ...Option) 사용 할 수 있음
		fmt.Printf(&quot;start :%d\n&quot;, count)
		count++
		fmt.Println(&quot;???ajlksd&quot;)
		return &quot;&quot;, nil // 정상적으로 실행 됐을 경우 재시작을 하지 않음
		//return &quot;&quot;, retry.Unrecoverable(errors.New(&quot;end&quot;)) // 더이상 retry를 하지마라는 뜻
	}, retryOptions...)
	if err != nil {
		fmt.Println(&quot;error &quot; + err.Error())
		return
	}
	fmt.Println(str)
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;retry option 은 여러가지가 있는데 내가 설정한 옵션은 주석을 달아 놓은 대로 실행된다.&lt;br /&gt;기본적으로 back off 가 설정돼 있으니 back off 를 사용 하지 않을때에는 retry.Delay(time.Millisecond*0), retry.DelayType(retry.FixedDelay) 옵션을 사용하면 특정 딜레이 시간을 고정 할 수 있다.&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Go</category>
      <category>AVAST</category>
      <category>Client</category>
      <category>GIT</category>
      <category>Github</category>
      <category>go</category>
      <category>golang</category>
      <category>HTTP</category>
      <category>retry</category>
      <category>요청</category>
      <category>재시도</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/45</guid>
      <comments>https://codei.tistory.com/45#entry45comment</comments>
      <pubDate>Tue, 31 Oct 2023 21:39:48 +0900</pubDate>
    </item>
    <item>
      <title>[문법] 임시 구조체</title>
      <link>https://codei.tistory.com/43</link>
      <description>
&lt;p data-ke-size=&quot;size16&quot;&gt;Golang을 사용하다보면 임시 구조체를 사용하면 생각보다 유연하고 편하게 작업 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 내에 스택에 할당됨으로 함수내에서만 사용가능하다. 일반적으로 사용하는 구조체와의 차이점이라고 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652451892449&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Test struct{
 TestId string
}

func Tt(){
 t := &amp;amp;Test{}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로는 위와같은 방법으로 구조체를 생성하고 사용하지만 다음과 같이 사용하면 구조체를 임시로 사용가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652451965043&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func Tt(){
 var Test struct{
    TestId String
 }
 
 t := &amp;amp;Test{}
 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 함수내에 구조체를 정의 하여 사용할 수 있고, 슬라이스로도 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활용방안은 데이터베이스를 사용할때 ORM 은 각 테이블에 관한 정보는 제대로 가져오나 (grom) join 과 같은 상황에선 제대로 결과 값을 가져오지 못하는 경우가 발생이 되는데 이럴때 임시 구조체를 사용한다면 원하는 결과 값을 보다 쉽게 가져 올 수 있다.&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;gorm은 다음 포스팅 부터 연재 하는걸로~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Go</category>
      <category>go</category>
      <category>golang</category>
      <category>GORM</category>
      <category>struct</category>
      <category>구조체</category>
      <category>데이터베이스</category>
      <category>임시</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/43</guid>
      <comments>https://codei.tistory.com/43#entry43comment</comments>
      <pubDate>Fri, 13 May 2022 23:28:36 +0900</pubDate>
    </item>
    <item>
      <title>[gRPC/gRPC GATEWAY] json 필드 이름 proto 타입이름과 다를때</title>
      <link>https://codei.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;사실상 gRPC를 사용한다면 필드이름이랑 json으로 변환할때 큰 신경을 안써도 된다. 적어도 내가 하는 프로젝트에선&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;하지만 gRPC를 HTTP 통신을 하고싶다면 요청은 큰 문제가 없지만 응답을 받을때 우리가 예상한 키 값으로 넘어 오지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652337936583&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;message Test{
 string first_name = 1; ==&amp;gt; JSON firstName
 string last_name = 2;  ==&amp;gt; JSON lastName
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 _ 가 camelCase형식으로 바뀌디 때문에 예상한 응답이 아닐 경우가 있다.&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;이럴때는 gRPC gateway 의 ServeMux에 옵션을 추가해주면 해결된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652338009593&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gwMux := runtime.NewServeMux(
    runtime.WithMarshalerOption(runtime.MIMEWildcard, &amp;amp;runtime.JSONPb{
        MarshalOptions: protojson.MarshalOptions{
            UseProtoNames: true,
        },
    }))&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;WithMarshalerOption함수를 사용하여 옵션을 추가해 주면된다.&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;사용하려는 MIME에 runtime.JsonPB{} 구조체에 MarshalOptions 의 UseProtoNames를 true로 설정해 주면 proto에 정의된 필드 이름대로 JSON 키 값이 출력된다.&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Go</category>
      <category>camelCase</category>
      <category>Field</category>
      <category>gRPC</category>
      <category>grpc gateway</category>
      <category>JSON</category>
      <category>jsonpb</category>
      <category>marshal</category>
      <category>Name</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/42</guid>
      <comments>https://codei.tistory.com/42#entry42comment</comments>
      <pubDate>Thu, 12 May 2022 15:49:33 +0900</pubDate>
    </item>
    <item>
      <title>[gRPC] message oneof 사용</title>
      <link>https://codei.tistory.com/41</link>
      <description>
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;gRPC 는 통신을 할때 protobuf 를 사용하는데 gRPC를 사용하기전 tcp 통신으로 protobuf를 파이썬에서 만 사용해봤었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번 프로젝트에서 gRPC를 사용하게 되면서 gRPC Gateway 통신에도 oneof 를 사용해 보려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아직 protobuf 자체를 Go에서 사용해 본것이 아니고 gRPC에서만 테스트한 예제이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652268161983&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;message Test{
 int64 admin_id = 1;
 int64 user_id = 2;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;만약 위와같은 필드를 사용하는데 둘중 하나의 필드만 사용한다면 oneof 키워드를 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652268232381&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;message Test{
 oneof id_oneof{
   int64 admin_id = 1;
   int64 user_id = 2;
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그렇다면 Go에서 위와 같은 oneof 처리를 어떻게 하면 좋을까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Go에서 gRPC는 Get 함수를 자동으로 지원해 줌으로 GetAdminId() 와 GetUserId()를 사용하여 값을 가져 올 수 있는데 위 함수로 결과 값을 가져와 처리하기에는 oneof를 사용하는 의미가 없어진다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사실 oneof를 사용하는 이유가 여러 필드 중 1개만 사용함으로써 Serialize된 데이터 패킷의 수도 줄일 수 있는 장점이 있다. 그렇기에 사용 할 수 있는 부분은 사용하는 것이 이득이라 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;대게 많이 사용하는 방법이 무엇이 있을까 찾아봤는데 마땅히 없어 생각해본 처리 방법이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;더 나은 방법이 있다면 답글 부탁 드리겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1652268478076&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func (x *XX) XXXX(ctx context.Context, request *pb.Test) (*pb.Test, error){
 switch v := request.GetIdOneOf().(type){
 case *pb.Test_AdminId:
  fmt.Println(v)
 case *pb.Test_UserId:
  fmt.Println(v)
 
 }
 
 ... 중간 생략
 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;내가 생각한것은 oneof를 가져와서 직접 타입 체크를 한다면 oneof를 효과적으로 사용 할 수 있는 것 같다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발/Go</category>
      <category>BUF</category>
      <category>go</category>
      <category>golang</category>
      <category>gRPC</category>
      <category>grpc gateway</category>
      <category>protobuf</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/41</guid>
      <comments>https://codei.tistory.com/41#entry41comment</comments>
      <pubDate>Wed, 11 May 2022 20:33:11 +0900</pubDate>
    </item>
    <item>
      <title>텐서플로 라이트를 활용한 안드로이드 딥러닝</title>
      <link>https://codei.tistory.com/40</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VWX9T/btroRZRByY7/6WXUz0lRW8mIrtkP0qUKo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VWX9T/btroRZRByY7/6WXUz0lRW8mIrtkP0qUKo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VWX9T/btroRZRByY7/6WXUz0lRW8mIrtkP0qUKo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVWX9T%2FbtroRZRByY7%2F6WXUz0lRW8mIrtkP0qUKo0%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;320&quot; height=&quot;404&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텐서플로 라이트를 활용한 안드로이드 딥러닝 책이다. 안드로이드에서 딥러닝을 활용하는 방법을 소개하는 책인데, 처음부터 말하자면 아쉬움이 많이 남는 책이다. 이 책은 딥러닝에서 대표적인 텐서플로를 활용하여 안드로이드 앱을 제작 하는 방법을 소개하는데 책의 내용이 텐서플로보다는 안드로이드 앱 제작에 대한 내용이 상당히 많다. 물론 초심자가 보기에는 당연, 안드로이드 개발자가 아니고 딥러닝 개발자 라면 안드로이드 플랫폼에 대해 어색할 수도있다. 그도 그럴 것이 딥러닝은 대게 파이썬으로 구현하여 사용하기에, Kotlin, Java와 같은 언어의 플랫폼에서 활용 하는 것과는 다르기 때문이다. 그렇다고 해서 모델을 자바로 개발하는 것은 아니기에, 어떻게 해서 텐서플로가 안드로이드 플랫폼에서 돌아가고, 어떻게해서 딥러닝을 적용하여 앱을 개발 할 수 있는지에 설명은 충분하다고 볼 수 있다. 이 책은 정말 초심자가 보기에는 가장 좋은 에피타이저 같은 책이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &quot;한빛미디어 &amp;lt;나는 리뷰어다&amp;gt; 활동을 위해서 책을 제공받아 작성된 서평입니다.&quot;&lt;/b&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/40</guid>
      <comments>https://codei.tistory.com/40#entry40comment</comments>
      <pubDate>Sat, 25 Dec 2021 14:41:12 +0900</pubDate>
    </item>
    <item>
      <title>처음배우는 리액트 네이티브</title>
      <link>https://codei.tistory.com/39</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mc4vL/btrlIlWEKjn/tUuW3fpp6KueQbu7MFRIb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mc4vL/btrlIlWEKjn/tUuW3fpp6KueQbu7MFRIb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mc4vL/btrlIlWEKjn/tUuW3fpp6KueQbu7MFRIb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmc4vL%2FbtrlIlWEKjn%2FtUuW3fpp6KueQbu7MFRIb1%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;320&quot; height=&quot;410&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;크로스플랫폼의 대표 주자라고 할수있는 리액트 네이티브 초심자를 위한 책인데 사실 react를 조금 알고 있으면 보기 편하다. 당연히 해당 플랫폼에서 제공하는 환경에서 개발하는 것이 가장 좋지만, 시간 적인 여유, 앱의 특성에 따라 크로스플랫폼으로 개발을 한다면 상당한 프로젝트의 시간을 줄일 수 있다. 책에서도 말하지만 해당 플랫폼에서 최신의 기술을 적용하기에는 리엑트 네이티브 자체에서 제공하는데 시간이 걸리는 단점이 있다. 하지만 이것이 모든 단점이라고 할수는 없듯이 최신기술을 적용한다고 하여 무조건적인 이점을 얻는 것도 아니고 한번의 개발로 Andorid, IOS 에 앱을 배포 할수 있다는 큰 메리트를 생각한다면 최신의 기술의 지원에 대한 부재는 충분히 커버 할 수 있다고 생각된다. 초심자를 위한 책이기 때문에 심화 내용보단 어떻게 시작을 해야하고 리엑트가 무엇인지 설명을 하고 있으니 이만한 책도 없는것 같다. 책의 난이도는 낮기 때문에 자바스크립트만 사용 할 수 있고, IOS 개발을 하기 위한 맥 환경만 준비되어있다면 초심자도 금방 앱을 배포 할 수 있기때문에 꼭 한번쯤 읽어보면 좋겠다는 책이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &quot;한빛미디어 &amp;lt;나는 리뷰어다&amp;gt; 활동을 위해서 책을 제공받아 작성된 서평입니다.&quot;&lt;/b&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/39</guid>
      <comments>https://codei.tistory.com/39#entry39comment</comments>
      <pubDate>Sun, 21 Nov 2021 00:40:19 +0900</pubDate>
    </item>
    <item>
      <title>안전한 인공지능 시스템을 위한 심층 신경망 강화</title>
      <link>https://codei.tistory.com/38</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MBjon/btrihaSGwvh/03MbHfPKvwKW02K3XcKfM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MBjon/btrihaSGwvh/03MbHfPKvwKW02K3XcKfM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MBjon/btrihaSGwvh/03MbHfPKvwKW02K3XcKfM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMBjon%2FbtrihaSGwvh%2F03MbHfPKvwKW02K3XcKfM0%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;320&quot; height=&quot;409&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;최근들어 나오는 IT 관련 책들의 동향은 당연 인공지능에 관련한 내용들이다. 아쉽게도 책들은 어떻게 인공지능에 관련한 학습을 하는지 어떤 개발을 해야하는지, 어떤 프레임워크를 써야하는지에 대한 내용이 대부분이다. 사실 나 조차도 어떻게 학습을 해야하는지에 대해 궁금증이 컸지 이 학습에 대해 절대적인 믿음이 컸던 것 같다. 이 책을 본 후론 인공지능 학습도 결국은 보안에 취약 할 수 있으며, 인공지능이 절대적인 학습이 아니라는 생각을 일깨워 줬다. 아쉽게도 이책의 내용은 초심자가 보기에는 쉽지 않지만, 초반에 대략적인 인공지능 학습에 대한 설명이 포함돼 있고, 이러한 학습을 통해 보안적인 이슈도 다시금 생각할수 있도록 도와줬다. 아직 이 분야에 대해 많은 얘기가 없어 많은 내용을 포함하고 있지 않지만, 이 책을 통해 앞으로도 인공지능 학습에 보안적인 부분을 신경 쓸 수있는 시발점이 될 것이다.&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &quot;한빛미디어 &amp;lt;나는 리뷰어다&amp;gt; 활동을 위해서 책을 제공받아 작성된 서평입니다.&quot;&lt;/b&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/38</guid>
      <comments>https://codei.tistory.com/38#entry38comment</comments>
      <pubDate>Wed, 20 Oct 2021 11:50:21 +0900</pubDate>
    </item>
    <item>
      <title>만들면서 배우는 파이토치 딥러닝</title>
      <link>https://codei.tistory.com/37</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;401&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EUsVC/btrfHevp9bk/3W0V2kM7nAc9Ga0Ul8IQGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EUsVC/btrfHevp9bk/3W0V2kM7nAc9Ga0Ul8IQGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EUsVC/btrfHevp9bk/3W0V2kM7nAc9Ga0Ul8IQGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEUsVC%2FbtrfHevp9bk%2F3W0V2kM7nAc9Ga0Ul8IQGK%2Fimg.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;401&quot; data-filename=&quot;blob&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;파이토치 딥러닝 책을 읽기에는 난이도가 있는 편이다. 파이토치 첫걸음 같은 초심자용 책이 있기도 하지만 책의 난이도들이 너무 낮거나 너무 높거나 하는 경향이 있어 점진적인 난이도로 공부하기에는 사실상 마땅한 책이 없다. 이 책의 경우는 딥러닝에서 기초적인 학습 모델들을 대상으로 예제를 설명함에 있어 부족함은 없다. 하지만, 처음에 언급했듯이 책의 난이도가 어느 정도는 있기에 상세한 설명은 부족한 것이다. 이 책에서 설명하는 모델은 VGG, SSD,&amp;nbsp; PSPNet, OpenPose, DCGAN, Self-Attention GAN, AnoGAN, Efficient GAN, Transformer, BERT, ECO 등 딥러닝 분야에서 각 세심한 분야로 들어가기위한 초심 모델들을 잘 선택을 한것이 맘에 들었다. 물론 각 분야에 대한 딥러닝 모델이나, 논문들은 활발하게 나오니 그 분야에 따라 심도있는 공부는 더 해야하지만 만약 초급단계의 책을 읽었다면 이 책을 발판 삶아 높은 수준의 공부를 할 수 있도록 도움을 주기에는 충분한 책인것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;한빛미디어&amp;nbsp;&amp;lt;나는&amp;nbsp;리뷰어다&amp;gt;&amp;nbsp;활동을&amp;nbsp;위해서&amp;nbsp;책을&amp;nbsp;제공받아&amp;nbsp;작성된&amp;nbsp;서평입니다.&quot;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/37</guid>
      <comments>https://codei.tistory.com/37#entry37comment</comments>
      <pubDate>Tue, 21 Sep 2021 23:46:28 +0900</pubDate>
    </item>
    <item>
      <title>파이토치 첫걸음</title>
      <link>https://codei.tistory.com/36</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y5FVv/btrcOklrky7/NejUqQQsHgpGQFsJ29kEw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y5FVv/btrcOklrky7/NejUqQQsHgpGQFsJ29kEw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y5FVv/btrcOklrky7/NejUqQQsHgpGQFsJ29kEw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy5FVv%2FbtrcOklrky7%2FNejUqQQsHgpGQFsJ29kEw0%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;320&quot; height=&quot;460&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;최근 가장 많이 관심이 높은 기술 중 하나가 딥러닝 분야이다. 딥러닝 분야에는 대표적인 프레임워크가 있는데 가장 많이 들어보고 가장 핫한 프레임워크는 텐서플로우, Caffe, 파이토치 이다. 텐서 플로우나, 파이토치 같은 경우 파이썬 으로 개발을 할 수 있어 C++로 작성된 caffe보다는 접근성이 그나마 낫다. 머신 러닝에는 사실 러닝 커브가 높고 실무에선 석,박사 급으로 이루어진 팀에서 개발을 주도 하기도 한다. 새로 생긴 분야가 아닌 관심도가 높아진 분야에서 젊은 개발자나 여러 회사에서 머신러닝에 관하여 투자와 사업 개발을 하고 있게 프레임 워크 선택도 중요하다. 책에서 파이토치와 넘파이를 비교를 살짝 했지만 cpu연산만 하는 numpy 보다 Cuda를 사용하는 GPU API 요청 처리를 프레임 워크화해 놓은 것이 파이토치라고 한다. numpy보다 개발 환경에서도 머신러닝에 최적화 되어있다보니 간결한 문법으로 여러 처리를 할 수 있다는 것이 파이토치와의 차이점이라고 한다. 텐서플로우는 많이 찾아보진 않았지만, 이 책은 두껍지 않은 책임으로 내용은 간단히 설명이 되어있고 부담을 느끼지 않고 머신러닝에 대해 어떻게 사용되는지 알고 싶다면 이책을 읽어보길 추천한다.&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&quot;한빛미디어 &amp;lt;나는 리뷰어다&amp;gt; 활동을 위해서 책을 제공받아 작성된 서평입니다.&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/36</guid>
      <comments>https://codei.tistory.com/36#entry36comment</comments>
      <pubDate>Sat, 21 Aug 2021 18:22:25 +0900</pubDate>
    </item>
    <item>
      <title>업무에 바로 쓰는 SQL 튜닝</title>
      <link>https://codei.tistory.com/35</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;426&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNcMCz/btraoQAQgaT/KxIFRqsHORMal2ycqZ3ZLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNcMCz/btraoQAQgaT/KxIFRqsHORMal2ycqZ3ZLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNcMCz/btraoQAQgaT/KxIFRqsHORMal2ycqZ3ZLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNcMCz%2FbtraoQAQgaT%2FKxIFRqsHORMal2ycqZ3ZLk%2Fimg.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;426&quot; data-filename=&quot;blob&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;기본적인 RDBMS를 사용하다보면 튜닝 포인트가 필요하게 되는 상황이 발생이 되는데 적은 데이터에선 사실상 유의미하지 않을 수 있다. 요즘 같이 대용량 데이터를 가공하고 사용하는 환경에서는 필수적인 요소라고 생각이 되는데, 그 해결법을 찾아가는 실마리를 제공해 주는 책인것 같다. 이 책은 기초적인 SQL튜닝에 관하여 설명하고 있다. 기본적인 explain 부터 실행하여 프로파일링 까지 설명을 하고있다. 깊이가 있는 책은 아니지만 초심자가 SQL 튜닝을 하기 위해 기본적인 지식을 쌓기에는 충분한 것같다. 이책에서 많이 실수 하고있는 쿼리에 관해 설명을 해주고있고 이 쿼리가 어떻게 문제가 있는지, 이를 위해 어떻게 해결하는지 설명을 해놓은 책이다. 또한 예제가 많아 기본적인 SQL Analyze 만 분석하고 해결하는 책들에 비해 상세한 설명이 있는것이 특징이다. 프로젝트에서 SQL 튜닝 포인트가 있어서 많이 난감했는데 이책으로 더 깊이 있는 튜닝 포인트를 찾아가는 방법을 빠르게 습득할수있는 지름길 같은 책임이 분명하다. 꼭 기본적인 SQL 기본 개념을 가지고 있고 튜닝에 관해 필요성이 있다고 생각이 든다면 이 책을 읽어보는 것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;한빛미디어 &amp;lt;나는 리뷰어다&amp;gt; 활동을 위해서 책을 제공받아 작성된 서평입니다.&quot;&lt;/b&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/35</guid>
      <comments>https://codei.tistory.com/35#entry35comment</comments>
      <pubDate>Mon, 26 Jul 2021 01:15:27 +0900</pubDate>
    </item>
    <item>
      <title>소문난 명강의 : 김상형의 SQL 정복</title>
      <link>https://codei.tistory.com/34</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;410&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv2oXt/btq7CTgDLZM/5rP6m7V7iduIjfp0Snmthk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv2oXt/btq7CTgDLZM/5rP6m7V7iduIjfp0Snmthk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv2oXt/btq7CTgDLZM/5rP6m7V7iduIjfp0Snmthk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv2oXt%2Fbtq7CTgDLZM%2F5rP6m7V7iduIjfp0Snmthk%2Fimg.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;410&quot; data-filename=&quot;blob&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;&lt;b&gt;&lt;span&gt;소문난 명강의 김상형의 SQL 정복 이란 책은 일반 적인 SQL 책 만큼 두껍다. 대신에 Oracel, MSSQL, MariaDB기반으로 실습 환경이 주어지고 이에 맞춘 사용법도 설명을 같이 하는 책이었다. 책의 전반적인 내용은 초심자가 보기에는 가장 좋은 책으로 생각된다. 예제도 굉장히 많으며 각 DBMS 별로 주의 사항도 같이 설명해 주고있다. 책의 전반이 그렇듯 연습문제를 풀어 학습한 내용을 복습하기에도 좋았다. MySQL에서 MariaDB로 오픈소스 프로젝트 운영체제들이 MariaDB로 채택을 하고 있는 추세를 잘 맞춘 실습 환경에서의 설명인 것도 굉장히 좋은 선택지 인것 같다. 이 책의 가장 마음에 들었던 것은 보통 쿼리문을 예제로 책에 넣어두는데 보통은 초심자들은 오타를 일으킬 확률이 굉장히 높은데 완벽하지는 않지만 문자열이나, 숫자 같은 경우에는 색을 달리하여 학습자가 쉽게 이 문법은 조금 다르구나 조심해야겠구나 라는 것을 알수 있었다. 전반적으로 컬러를 더 사용하여 코드의 색을 다양하게 넣어 정의를 한다면 학습자가 더욱이 쉽게 문법을 이해할수있을것 같다는 아쉬움이 조금 남지만 이만큼만 해도 굉장히 좋다. 쿼리를 설명하는 부분에 있어서도 쿼리 문 옆에 큰 글자로 설명을 해주어서 학습자가 이해하기도 굉장히 쉬웠고 초심자가 넓은 개념으로 이해하기에는 이책만한게 없는 것 같다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;한빛미디어 &amp;lt;나는 리뷰어다&amp;gt; 활동을 위해서 책을 제공받아 작성된 서평입니다.&quot;&lt;/b&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/34</guid>
      <comments>https://codei.tistory.com/34#entry34comment</comments>
      <pubDate>Sat, 19 Jun 2021 13:54:59 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 비동기 라이브러리 Asyncio</title>
      <link>https://codei.tistory.com/33</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;389&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLuhbQ/btq5aNoa6Iy/ow0CWDesAFP4KMPN6Mcebk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLuhbQ/btq5aNoa6Iy/ow0CWDesAFP4KMPN6Mcebk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLuhbQ/btq5aNoa6Iy/ow0CWDesAFP4KMPN6Mcebk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLuhbQ%2Fbtq5aNoa6Iy%2Fow0CWDesAFP4KMPN6Mcebk%2Fimg.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;389&quot; data-filename=&quot;blob&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;비동기&amp;nbsp;라이브러리&amp;nbsp;Asyncio&amp;nbsp;책을 읽어보았다. 파이썬에서 가장 핫한 이슈가 비동기 처리 이슈이다. 파이썬은 GIL(&lt;span style=&quot;color: #4d5156;&quot;&gt;Global Interpreter Lock) 때문에 멀티 코어를 사용하는데에 제약이 약간 있다. 그렇다고 해서 파이썬에서 멀티코어를 사용 못하는건 아니지만 NodeJS같은 비동기 처리가 Multi-thread를 관리 하는 것보다 편리한 측면이 있어서 인기가 날로 많아진 것은 사실이다. 나는 현 프로젝트에서 Twisted를 사용하고 있어 파이썬의 Asyncio 를 사용하는 경험이 많이 없었지만 이번 기회를 통해 파이썬 비동기에 대해 잘 알게 된 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 얘기하면 파이썬의 Asyncio는 파이썬에서 정식으로 지원하는 버전이라 이를 기반으로 여러 프레임워크, 모듈을 만들수 있다. 이 책을 보면서 가장 공감한 것은 파이썬 Asyncio 관련 공식 문서를 보면 일반 사용자가 사용하는 수준의 문서는 아니라는 것이다. 문서를 읽고 적용하는 부분에 어려움이 많이 있었다. 이 책은 그 부분을 적극 공감하여 해당 문서의 수준을 설명하며 내용을 잘 풀었다.&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;또한 Asyncio를 사용하면서 실수 하거나, 해석이 애매한 부분들을 잘 설명해서 실수를 범하지 않도록 도와줬다. 파이썬의 자체 Asyncio를 사용한 경험이 없어서 경험이 많은 사람들은 당연히 알 수 있는 내용이겠지만 경험이 많지 않은 나에게는 도움이 많이 됐다.&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;이 책의 내용을 주절히 설명하기보단 자신이 파이썬 Asyncio를 공부를 해야하는데 여러 설명이 잘되어있는 문서를 찾아 공부를 하며 조금 더 이해력을 올리고 싶다면 이책을 꼭 읽어보길 추천한다.&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;span style=&quot;color: #4d5156;&quot;&gt;이 책에서도 Twisted에 관한 아주 조금 설명이 되어있지만 Twisted와 비교를 잠시 해보려고 한다. 서로의 단점은 사실상 많지만 실제 사용자 입장에서 경험을 해봐야하는 주관적인 부분이라 장점만 나열 하도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;Twisted&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;장점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #4d5156;&quot;&gt;- 강력한 프레임워크로 필요한 모듈은 다 구현이 되어있어 가져다 쓰면된다. (Http, ftp, ssh, dns, db connection 등등..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파이썬의 Asyncio를 가지고 같이 결합을 할 수가있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Deferred 객체를 사용하여 콜백 시스템을 사용 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Reactor라는 코어 모듈이 스케줄링을 할 수 있도록 보장 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PyQT에서도 Twisted를 활용 할 수가있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- inlinecallbacks가 추가되어 보다 더 편리하게 비동기 처리를 할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Twisted 내에서 제공하는 Thread를 활용하여 Thread Pool 을 비동기 처럼 관리 할 수 있다.&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;Python Asyncio&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파이썬 3.5부터 async def 키워드를 정식으로 지원하기로 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특별한 모듈이나 라이브러리를 사용하지 않아도 파이썬만 있으면 비동기 프로그램을 작성 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- uvloop 이란 강력한 이벤트 루프를 사용하여 비동기 성능을 끌어 올릴 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파이썬에서 정식으로 지원 하는 거라 코드의 유지보수 가 용이하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &quot;한빛미디어 &amp;lt;나는 리뷰어다&amp;gt; 활동을 위해서 책을 제공받아 작성된 서평입니다.&quot;&lt;/b&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/33</guid>
      <comments>https://codei.tistory.com/33#entry33comment</comments>
      <pubDate>Mon, 17 May 2021 20:18:03 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 머신러닝 + 딥러닝</title>
      <link>https://codei.tistory.com/32</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;427&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcfiOp/btqRrQGREi2/ZNRhth3ZeC0QaUYbr59Q01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcfiOp/btqRrQGREi2/ZNRhth3ZeC0QaUYbr59Q01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcfiOp/btqRrQGREi2/ZNRhth3ZeC0QaUYbr59Q01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcfiOp%2FbtqRrQGREi2%2FZNRhth3ZeC0QaUYbr59Q01%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&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;혼자 공부하는 머신러닝 + 딥러닝 책을 읽어보았다. 요즘 대세의 기술이 머신러닝, 딥러닝 기술인데 상당한 기술의 발전으로 인해 수요가 많아졌고 공급이 늘어나는 추세이다. 인공지능의 연구는 사실상 엄청 오래된 기술이고, 이 기술로 활용해 이전 부터 체스에서 여러번 기술시도를 하였다. 머신러닝을 사회적으로 각인 시키는 계기가 알파고를 통해 가능성을 많이 열어 주었고 이 기술 자체로는 러닝커브가 심한 것은 누구나 알고 있다. 수 많은 학회의 논술과 기업의 참여로 인하여 하루에도 몇개씩 쏟아지는 논문이 많고 이 기술을 활용도는 아직은 초기 단계이나 사람의 얼굴 인식이나, AI 면접관, 음성인식 기술이 점차 발전함에 따라 세상은 점점 변화하는 것 같다. 이러한 기술에 한발짝 다가 서고싶어 이책을 읽어 보았고, 이책은 정말 기초부터 설명을 해 준 책이며, 기존 핸즈온 책들을 보면 그림이 많이 없고 딱딱한 책들이 많았다면 이책은 이해하기 쉽게 그림도 있고 가장 큰 장점인 유투브 강의가 있다는 것이 가장 좋았다. 머신러닝 + 딥러닝을 하기위해 기초를 닭고 용어와 흐름을 이해하고 싶다면 꼭 이책으로 시작해 봤으면 좋겠다. 이번 계기로 좀더 공부를 할 수 있는 원동력을 준 책이다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/32</guid>
      <comments>https://codei.tistory.com/32#entry32comment</comments>
      <pubDate>Mon, 28 Dec 2020 14:41:06 +0900</pubDate>
    </item>
    <item>
      <title>vue.js 첫걸음</title>
      <link>https://codei.tistory.com/31</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;397&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqBoMY/btqNXdYCJyo/YVB8Zxk7K1zDWpK2jLI7hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqBoMY/btqNXdYCJyo/YVB8Zxk7K1zDWpK2jLI7hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqBoMY/btqNXdYCJyo/YVB8Zxk7K1zDWpK2jLI7hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqBoMY%2FbtqNXdYCJyo%2FYVB8Zxk7K1zDWpK2jLI7hK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;397&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;현 시점에서 가장 핫한 javascript 프레임워크 angular, react, vue 중 하나인 vuejs를 책을 읽어 보았다. angular와 react에 비해 세상에 나온지 짧은 시간이지만 엄청난 폭발력을 가지고 대세 프레임워크로 올라온 vuejs 이다. 여타 프레임워크도 굉장한 장점과 단점이 있지만 vue의 경우 react의 장점과 angular의 장점을 결합한 프레임워크라고 생각한다. 여타 프레임워크에 비해 러닝커브가 낮다고 생각이 된다. vue는 초보가 보기에는 적당한 책이 없는 것 같다. 여러 인터넷 강의가 있기야 하지만 책으로 된 내용치고는 이책만한 진입장벽이 낮으며, vue의 전반적인 기능을 소개하는 책이 없다는게 내 생각이다. 대세의 프레임워크인 만큼 기존 react로 구성하였던 프로젝트와 vue를 본격적으로 비교하면서 프로젝트를 완성해 보려고 한다. 기본적인 javascript의 개념이 있다면 이 책을 구입하여 vue를 입문해 보는것을 추천한다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/31</guid>
      <comments>https://codei.tistory.com/31#entry31comment</comments>
      <pubDate>Sat, 21 Nov 2020 16:11:13 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 웹 프로그래밍, 실전편(개정판)</title>
      <link>https://codei.tistory.com/30</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;388&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ejs6Q/btqLopniILa/tbna03Mhyv9PT1ai0D1taK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ejs6Q/btqLopniILa/tbna03Mhyv9PT1ai0D1taK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ejs6Q/btqLopniILa/tbna03Mhyv9PT1ai0D1taK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEjs6Q%2FbtqLopniILa%2Ftbna03Mhyv9PT1ai0D1taK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;388&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;파이썬의 대표적은 웹 프레임워크인 Django의 실전 활용법을 설명한 책이다. Django의 강력한 웹프레임의 활용법을 설명하기 위해 하나의 프로젝트를 정해놓고 개발하는 방식이라 실질적인 웹 개발 환경에서 유사한 문제점을 같이 설명을 하고 해결 하도록 해준다. 이 책의 개념을 설명한 &lt;span&gt;파이썬 웹 프로그래밍 이라는 붉은 색의 책이 있는데 그 책은 웹 프로그래밍을 처음부터 하기위한 Nginx부터 설정 방법 개념을 설명하는 책이고, 이 책은 그 개념을 기반으로 한 실질적인 Django를 활용한 방법을 중점적으로 쓴 책이라, 기본 파이썬의 개념이 없거나, 웹 프로그래밍에 대한 기본 지식이 없다면 이 책보단, 붉은 색의 파이썬 웹프로그래밍 책을 먼저 읽는 것이 좋다. 또한 현 시점의 django의 버전은 3.1.2 버전이기때문에 최신 버전을 설명한다고 볼 수 있으며 약간씩 변경되는것은 공식 홈페이지를 통해 찾아도 충분하다. 이 책을 통해 더 나은 Django개발을 할 수 있는 도움을 받았다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/30</guid>
      <comments>https://codei.tistory.com/30#entry30comment</comments>
      <pubDate>Tue, 20 Oct 2020 21:20:35 +0900</pubDate>
    </item>
    <item>
      <title>RxJS 프로그래밍</title>
      <link>https://codei.tistory.com/29</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;408&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z095n/btqJCuJABl6/0Enw8S9ka5KClCvkyGPomK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z095n/btqJCuJABl6/0Enw8S9ka5KClCvkyGPomK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z095n/btqJCuJABl6/0Enw8S9ka5KClCvkyGPomK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz095n%2FbtqJCuJABl6%2F0Enw8S9ka5KClCvkyGPomK%2Fimg.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;408&quot; data-filename=&quot;blob&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;RxJS를 처음 접해 보았을때는 react를 공부하면서 접해 보았는데 잘만 사용한다면 굉장히 좋은 느낌을 받았다. 하지만 당시에는 RxJS를 심도 있게 공부해야 하는 느낌을 별로 받지 않았지만,&amp;nbsp; RxJS를 알아 볼때는 이미 Netflix에서도 좋다는 평가를 많이 하고 있었고, 다음 웹 프로젝트가 있을때 적용을 해보려 공부를 하려고 마음 먹었다. Angular 에서는 이미 기본적으로 사용을 하고 있고, 앞으로 강력한 역할을 할 것이라고 생각이 든다. 하지만 이 책을 공부하려면 어느 정도의 javascript의 기본 지식을 알고 있어야하고 비동기 프로그래밍에 대한 이해가 있어야 한다. RxJS 기본 설명은 부실하여 러닝커브가 높은데 RxJS 자체 개념이 애초에 부터 기존 비동기 코드와 조금 다른 Observable 객체의 개념으로 시작을 한다. 이 개념을 조금 더 이해 하려면 이 책은 충분히 도움이 된다. 콜백 지옥에서 벗어 나고픈 javascript 개발자여 이 책을 꼭 읽어보세요!&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/29</guid>
      <comments>https://codei.tistory.com/29#entry29comment</comments>
      <pubDate>Fri, 25 Sep 2020 18:30:15 +0900</pubDate>
    </item>
    <item>
      <title>react</title>
      <link>https://codei.tistory.com/28</link>
      <description>&lt;p&gt;react 개발 블로그 테스트&lt;/p&gt;</description>
      <category>개발/React</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/28</guid>
      <comments>https://codei.tistory.com/28#entry28comment</comments>
      <pubDate>Fri, 25 Sep 2020 14:19:43 +0900</pubDate>
    </item>
    <item>
      <title>C</title>
      <link>https://codei.tistory.com/27</link>
      <description>&lt;p&gt;C 개발 블로그 테스트&lt;/p&gt;</description>
      <category>개발/C</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/27</guid>
      <comments>https://codei.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 25 Sep 2020 14:19:25 +0900</pubDate>
    </item>
    <item>
      <title>매니징 쿠버네티스</title>
      <link>https://codei.tistory.com/26</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;391&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biOaD7/btqG67wwEEc/QAYrKbYQ7a4CEdmmVYbh40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biOaD7/btqG67wwEEc/QAYrKbYQ7a4CEdmmVYbh40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biOaD7/btqG67wwEEc/QAYrKbYQ7a4CEdmmVYbh40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiOaD7%2FbtqG67wwEEc%2FQAYrKbYQ7a4CEdmmVYbh40%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;391&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;devops 에서 대세이며 필수로 된 컨테이너 오케스트레이션 툴인 쿠버네티스 책이다. 쿠버네티는 kubernetes 혹은 k8s 라고 줄여서 사용을 하는데 쿠버네티스가 영어로 너무길어서 앞글자인 k와 끝글자 s 사이의 문자는 8개이므로 k8s 라고 부르기도 한다. 쿠버네티스의 한글화는 생각보다 많은 분들이 참여하여 높은 수준의 한글화는 되어있고, 여러 레퍼런스들을 보면 실질적으로 운영을 하는 환경은 클라우드환경에서 구축된 내용들이 많다. 클라우드 기반은 해당 클라우드 제공업체들이 기반을 제공해 주기 때문에 쿠버네티스 운영을 하기 좀더 수월하지만 그렇지 못한 환경에 관한 내용들이 많이 부족한데, 이책은 클라우드 기반이 아닌 환경에서 운영하는 노하우와 개념을 설명을 해주고 있기 때문에 관련 책을 보려면 이부분을 확인하고 구입하는게 좋을 것 같다. 쿠버네티스를 공동 개발한 저자가 쓴 관점에서 책을 보니 새로운 시각에서 보는 즐거움이 있고, 깊이가 있는 것보단 쿠버네티스를 사용하기 위한 중간 다리를 해주는 아주 중요한 책인 것같다. 위에 말한바와 같이 자신의 환경이 클라우드 환경이 아니라면 이책은 필수로 읽어야 하는책이라고 강력하게 말하고싶다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/26</guid>
      <comments>https://codei.tistory.com/26#entry26comment</comments>
      <pubDate>Fri, 21 Aug 2020 17:53:11 +0900</pubDate>
    </item>
    <item>
      <title>이것이 MySQL 이다 (개정판)</title>
      <link>https://codei.tistory.com/25</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;420&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cswyf3/btqFniaAgPf/pSAItBiDfhhmCbd7ptDTdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cswyf3/btqFniaAgPf/pSAItBiDfhhmCbd7ptDTdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cswyf3/btqFniaAgPf/pSAItBiDfhhmCbd7ptDTdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcswyf3%2FbtqFniaAgPf%2FpSAItBiDfhhmCbd7ptDTdK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;420&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;이것이 ~이다 시리즈의 새로운 개정판 이것이 MySQL 이다. 이 책은 기존 2016년에 출시된 책으로써 최근 출시된 MySQL 8.0 을 반영한 개정판 책이다. 이책의 중점은 DBMS를 잘 모르는 초보를 위한 책으로써 아주 기초적인 설명 부터 SQL 까지 설명을 한 책이다. 또한 Linux 에서 MySQL 을 설치하는 방법을 자세히 설명을하여 사용자가 가장 어려워하는 설치 부분까지 공략을 한 책이다. 또한 기존 책에는 MySQL 과 PHP 연동 하는 법만 설명이 되어 있었는데 이번 개정판에는 파이썬까지 연동 하는 방법이 추가 되었다. 초보들이 가장어려워하는 Join 문법등 설명이 자세히 되어있으며 개인적으로 MySQL8.0 에서 가장 반기는 기능중 하나인 WITH CTE 를 설명해 준 점이 가장 인상이 깊었다. 이책은 MySQL의 전반을 다루는 책으로 인덱스, 스토어드 프로시저, 풀 텍스트 검색, 파티션, 조인, 트리거, MySQL Workbench 사용법등 다양하게 설명이 되어 인상 깊은 책인것 같다. 이책은 아주 어려운 문제를 다루진 않지만 초보자들이 보기에는 가장 좋은 책이다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/25</guid>
      <comments>https://codei.tistory.com/25#entry25comment</comments>
      <pubDate>Sat, 4 Jul 2020 22:18:27 +0900</pubDate>
    </item>
    <item>
      <title>이것이 안드로이드다 with 코틀린</title>
      <link>https://codei.tistory.com/24</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bduIZ8/btqEuX4DqBK/v183q70mkkPA5OnmEOIaf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bduIZ8/btqEuX4DqBK/v183q70mkkPA5OnmEOIaf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bduIZ8/btqEuX4DqBK/v183q70mkkPA5OnmEOIaf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbduIZ8%2FbtqEuX4DqBK%2Fv183q70mkkPA5OnmEOIaf0%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&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;안드로이드 입문 책으로 안드로이드 개발 언어가 Java 에서 Jetbrains 에서 개발한 kotlin 으로 전환되어 가는 추세이고, 안드로이드 공식문서도 kotlin 으로 사용하기 시작 하였는데 이 책은 그 흐름을 잘 파악하여 안드로이드 개발 입문자를 kotlin 을 사용하여 개발 할 수 있도록 설명을 해주고 있다. 물론 기존 java 로 개발된 프로젝트에는 java를 배워야 하지만 새로 개발을 시작하거나, 새로운 프로젝트를 시작 한다면 kotlin 으로 개발 하는 것을 추천한다. 이책은 간단한 kotlin 의 사용법을 먼저 설명을 하고 후에 어플리케이션을 개발 하는 방법을 상세하게 설명을 하고 있다. 또한 위젯의 활용 방안과 레이아웃을 구성하는데 도식화 하여 잘 설명을 하고 있어 이해하기가 매우 쉽다. 여기서 잠깐 이라는 항목은 팁을 알려주는데 매우 유용하다. 사실 여러 안드로이드 책을 보았지만 이책 처럼 상세하게 설명해 주는 책은 오랜만에 보아 강력 추천한다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/24</guid>
      <comments>https://codei.tistory.com/24#entry24comment</comments>
      <pubDate>Thu, 28 May 2020 16:50:11 +0900</pubDate>
    </item>
    <item>
      <title>오준석의 플러터 생존코딩</title>
      <link>https://codei.tistory.com/23</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br7wH2/btqDL3ylo52/mwuw7Xi5U2ZDKtT3q7Ntyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br7wH2/btqDL3ylo52/mwuw7Xi5U2ZDKtT3q7Ntyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br7wH2/btqDL3ylo52/mwuw7Xi5U2ZDKtT3q7Ntyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr7wH2%2FbtqDL3ylo52%2Fmwuw7Xi5U2ZDKtT3q7Ntyk%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;427&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;최근 구글에서 새로 내놓은 플러터이다. 한번의 개발로 여러 환경에서 같은 동작을 할 수 있도록 하는 크로스 플랫폼을 지원한다는 것이다. 크로스 플랫폼은 사실 여러가지가 있었다. 대표적으로 Qt, Xamarin 으로 볼 수가있으며, 최근 안드로이드는 Kotlin 을 사용하여 안드로이드 어플리케이션을 개발하는데 집중 하려고 하고 있다. 하지만 이런 크로스 플랫폼의 단점들은 네이티브 앱만큼의 성능과, 기능 구현에는 아직 한계가 있지만, 구글이 지원하면서 새로운 크로스 플랫폼의 성장을 기대해 볼법하다. 이 책의 난이도는 상당히 낮으며, 어플리케이션 개발에 아직 익숙 하지 않거나, 네이티브 앱만큼의 성능까진 필요 없으나, 한번의 개발로 빠르게 IOS 와 안드로이드 플랫폼을 개발 해야한다면 이책으로 시작 하는 것이 좋다고 생각된다. 내용자체가 초심자를 위한 내용이며 차근 차근 따라하다보면 감을 쉽게 익힐 수 있을 것이다. 또한 Dart 의 기본 문법도 설명을 해주니 따로 Dart 에 대한 공부를 하진 않아도 된다고 생각한다. 물론 더 깊은 내용을 파고 들어가야 한다면 따로 심도있는 공부를 하는것을 추천한다. 또한 스텝을 밟아 갈수록 간단하지만 Firebase 를 활용하여 데이터베이스도 사용 할 수 있으니 이보다 더 접근 하기 쉬운 책은 없을 것 같다. 플러터에 대해 잘 모르겠거나 따로 공부하기가 버겁다면 이책을 통해 플러터의 발을 들이는 것을 강력히 추천한다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/23</guid>
      <comments>https://codei.tistory.com/23#entry23comment</comments>
      <pubDate>Tue, 28 Apr 2020 13:51:34 +0900</pubDate>
    </item>
    <item>
      <title>Cloud Native DevOps with kubernetes</title>
      <link>https://codei.tistory.com/22</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drWfVE/btqCX79P26v/0ftqpVO5axsQxLBXwZ5o1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drWfVE/btqCX79P26v/0ftqpVO5axsQxLBXwZ5o1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drWfVE/btqCX79P26v/0ftqpVO5axsQxLBXwZ5o1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrWfVE%2FbtqCX79P26v%2F0ftqpVO5axsQxLBXwZ5o1K%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;427&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;요즘 DevOps 에서 대세라고 할수도 있는 컨테이너 기반 관리 툴인 Kubernetes 책이다. 효율적인 시스템 자원관리와 빠른 배포를 통한 서비스, 장애관리까지 컨테이너를 관리 할 수 있는 툴을 소개하는 책이다. 사실 Kubernetes 의 자료는 방대 하고 너무나도 많고, 레퍼런스도 많은데 심도 있는 깊이까진 가진 않는다. 공식 문서를 보고도 시작을 할 수 있지만. 전반적으로 Kubernetes 를 관리하기 위해선 러닝커브가 심하다 보니 적절한 책을 찾기도 어렵다. 이책은 클라우드 기반에서 Kubernetes의 소개와 관리하는 법을 소개한다. 세세한 내용보다는 어떻게 사용을 하고 어떠한 내용은 무엇인지를 잘 알려주는 책이며, 클라우드 시스템에서 비용 최적화등을 잘 소개하고 있으며 실질적으로 어떻게 돌아가는지 설명을 해주며 팁이 많아 팁을 활용하는 법도 설명이 잘되어 있다. 이책으로 kubernetes를 완벽하게 할 수있다 라고 말을 하기엔 부족하지만 이 책을 통해서 Kubernetes의 맛을 알아가며 흥미를 느끼기에는 최고의 책이라고 생각한다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/22</guid>
      <comments>https://codei.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 26 Mar 2020 18:58:28 +0900</pubDate>
    </item>
    <item>
      <title>다이내민 프로그래밍 완전 정복</title>
      <link>https://codei.tistory.com/21</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cP3zHv/btqAsSUKRFj/JJzc4tJngjQdUx2y64pxjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cP3zHv/btqAsSUKRFj/JJzc4tJngjQdUx2y64pxjK/img.png&quot; data-alt=&quot;다이내믹 프로그래밍 완전 정복&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cP3zHv/btqAsSUKRFj/JJzc4tJngjQdUx2y64pxjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP3zHv%2FbtqAsSUKRFj%2FJJzc4tJngjQdUx2y64pxjK%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;443&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;사실 알고리즘에 대해서 굉장히 지식이 약했던 나로써 알고리즘 공부를 시작함과 동시에 요즘 추세인 동적프로그래밍이 이 최신 트랜드라는 것을 알고 인터넷으로 공부를 시작 하였는데, 생각보다 인터넷에 나오는 내용 수준 자체가 이미 높은 상태라 받아들이기 힘들었는데 이 책을 보면서 동적프로그래밍이 무엇인지, 다이내막 프로그래밍이 무엇인지 아주 기초부터 원리 동작 방식, 해결방법들을 자세하게 풀어놓은 책이라 동적프로그래밍이 무엇인지 한발짝 나간것 같은 느낌이든다. 사실 이책이 처음부터 쉽게 써져있다고 말 할 수는 없다. 기초적인 프로그래밍 개념이 있어야 하며(C 언어 그러나 아주 기초적인 개념), 최소한의 알고리즘 몇개정도는 알고 있어야 이책을 볼때 거부감 없이 볼 수 있다고 내 개인적인 생각이 많이 든다. 사실 트랜드라 하여 알아보았던 동적프로그래밍이 이책을 보면서 왜 동적 프로그램을 쓰면서, 최적화를 해야 하는지를 알려주고, 문제 해결능력을 향상 시켜준 책이라 책이 약간 얇지만 초심자가 앞으로 동적 프로그래밍을 하기 위해서 또한 면접 준비를 하기 위해서는 이책을 보면서 기초 개념을 세우고 앞으로 공부 방향을 잡아 나간다면 더할 나위 없이 추천할 책이라고 말 하고싶다.&lt;/p&gt;</description>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/21</guid>
      <comments>https://codei.tistory.com/21#entry21comment</comments>
      <pubDate>Sat, 14 Dec 2019 14:13:38 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 자료구조와 알고리즘</title>
      <link>https://codei.tistory.com/20</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdHgVB/btqzPmueQqL/kXR1XQMyUkkdKhot9Km100/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdHgVB/btqzPmueQqL/kXR1XQMyUkkdKhot9Km100/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdHgVB/btqzPmueQqL/kXR1XQMyUkkdKhot9Km100/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdHgVB%2FbtqzPmueQqL%2FkXR1XQMyUkkdKhot9Km100%2Fimg.png&quot; data-filename=&quot;blob&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;대게 자료구조는 C와 Java 로 많이 된 서적들이 많은데 파이썬으로 설명된 자료구조라는 점에서 굉장한 호기심을 가지게 되었다. 대게 회사 면접을 볼때 쓰는 시험들이 파이썬으로 문제를 푸는 비율이 점점 높아졌다는 얘기를 들었고, 파이썬을 주로 쓰는 입장에서 볼때 굉장히 반길수 밖에 없는 책이다. 책의 처음 부분에는 파이썬 내장 타입과 자료구조를 설명을 하고 있어 파이썬이 가지고 있는 자체의 자료구조를 활용하는 방법을 설명을 한다. 이는 생각보다 간편하다는 점에서 굉장한 이점을 가지고 자료구조와 알고리즘을 설명할 수 있는 활용 방안인것 같다. 생각보다 타입이 유용하고 활용을 할 수있다는 점을 활용해서 알고리즘을 구현 할 수 있도록 하는 방향이 참으로 맘에 든다. 알고리즘은 어떠한 문제점을 효과적으로 해결 할 수 있도록 하는 것이고 이에대한 기본적인 자료구조와 정렬,검색, 그래프, 이진트리, 트리 순회를 쉽게 풀이 했다는 점에서 괜찮은 책이고 다른 사람에게도 이책을 한번씩 꼭 읽어보라고 추천을 한다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/20</guid>
      <comments>https://codei.tistory.com/20#entry20comment</comments>
      <pubDate>Sat, 16 Nov 2019 14:17:04 +0900</pubDate>
    </item>
    <item>
      <title>전문가를 위한 C++</title>
      <link>https://codei.tistory.com/19</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A8ttH/btqyWXczZ7f/ASqAQ1EHUYH3xFhctaB2I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A8ttH/btqyWXczZ7f/ASqAQ1EHUYH3xFhctaB2I0/img.png&quot; data-alt=&quot;전문가를 위한 C++&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A8ttH/btqyWXczZ7f/ASqAQ1EHUYH3xFhctaB2I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA8ttH%2FbtqyWXczZ7f%2FASqAQ1EHUYH3xFhctaB2I0%2Fimg.png&quot; data-filename=&quot;blob&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;전문가를 위한 C++&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;전문가를 위한 C++ 책을 처음 읽었을때 드는 느낌 부터 설명하자면 굉장히 알찬 내용이며 국내에서 가장 번역이 잘된 책이라고 생각하는 책이다. 이책이 개정판이 벌써 4판까지 나왔으며 역시나 이책은 기본 서적 과 C++ 17 으로 설명이 되어있어서 표준을 준수하는 책이다. 또한 다양한 디자인 패턴, 간단한 병렬 알고리즘을 제공하기에 좋다. 메모리 관리에 대한 내용도 상세히 기술 되어있고, 디버깅에 대해서도 자세히 설명이 되어있어 이책은 업무를 진행을 하면서 다시 한번 지식을 일깨워주는 책이다. 개인적으로 설명은 핵심 위주로 작성되어 있는데, 개인적으로 이러한 부분이 좋다. 장황한 설명이 길어져 핵심을 결국 흐트려진 책이 많은데, 이책은 원하는 핵심을 간결하게 핵심만 짚어주고 이해가 되지 않을땐 직접 찾으면서 익히는 공부 스타일이 좋기 때문이다. 이책은 많은 사람들이 추천할 정도로 좋은 책임에는 분명함에 틀림이 없다. 하지만 이책의 난이도를 얘기해 달라면 당연히 기본 C++ 의 지식은 가지고 있어야 할 것이며, 이책을 통하여 그 기본을 한번 더 다지는 책이 될 것이라 강력하게 추천한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/19</guid>
      <comments>https://codei.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 11 Oct 2019 12:27:05 +0900</pubDate>
    </item>
    <item>
      <title>Optimized C++ (C++ 최적화)</title>
      <link>https://codei.tistory.com/18</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTFOiw/btqyfX5wpIb/PjQEpQrsQnKbcDUtqKsiVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTFOiw/btqyfX5wpIb/PjQEpQrsQnKbcDUtqKsiVk/img.png&quot; data-alt=&quot;Optimized C++ (C++ 최적화)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTFOiw/btqyfX5wpIb/PjQEpQrsQnKbcDUtqKsiVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTFOiw%2FbtqyfX5wpIb%2FPjQEpQrsQnKbcDUtqKsiVk%2Fimg.png&quot; data-filename=&quot;blob&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;Optimized C++ (C++ 최적화)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;정말 강력하게 추천하는 책이다. 책의 내용 구성부터 너무나도 알차다. 초반에는 기본적으로 최적화 할 수 있는 방향을 제시함으로써 C++ 을 최적화를 해야하는 이유를 자세히 설명을 해준다. 사실 모든 언어에서도 최적화는 필요로 하지만 방대한 자료와 자율성을 가진 C++ 로써는 최적화의 기법도 상당히 많고, 기괴하다. 개인적으로 C++ 기초 공부하고 Effective C++ 책을 보며 실력을 향상시키는 정석(?) 적인 방향으로 잡았었다면 개인적으론 STL 기본 공부까지 마치고 난뒤 이책을 꼭 보라고 추천하고 싶다. 기본적인 STL을 무작정 사용하지 않고 어떻게 사용하면 효과적으로 성능을 낼 수 있을지 자세히 설명이 되어있다. 또한 STL을 사용하며 주의점도 알려줌으로써 기본적인 STL 사용법을 강화 시켜 줄 수 있을것 같다. 또한 입출력 최적화, 스레드 최적화 메모리 최적화도 설명 함으로써 아주 심화 깊은 얘기를 다룰수는 없는 분량이지만 자신이 조금더 깊은 공부를 하고 싶다면 이책을 꼭 한번 읽고 공부를 하면 좋을 것같다는 생각이 든다. 책의 난이도는 약간 있으니 초심자가 보기는 부담 스러울 수는 있으나, 방대한 양을 설명을 하기보단 기본적이고 핵심적인 최적화를 설명하기에 꼭 읽어보길 추천하며 기본 문법과 간단한 STL 공부는 하고 책을 읽으면 훨씬 많이 도움이 될 책이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/18</guid>
      <comments>https://codei.tistory.com/18#entry18comment</comments>
      <pubDate>Sat, 14 Sep 2019 15:04:15 +0900</pubDate>
    </item>
    <item>
      <title>삼성전자'갤럭시 홈 미니' 베타 테스트 실시!!</title>
      <link>https://codei.tistory.com/17</link>
      <description>&lt;p&gt;드디어 기다리고 기다리던 갤럭시 홈 미니! 요즘은 수많은 가전 제품과 연동되는 스마트 홈 스피커가 많이 출시 되었다. 카카오,KT,구글,아마존 등등.. 수많은 스마트 홈 스피커가 출시 되었지만 실질적인 제조사와 연동되는 스마트 홈 스피커는 없었다.&lt;/p&gt;
&lt;p&gt;이번에 삼성에서 출시하는 갤럭시 홈 미니를 사용하면 기존에 잘 사용하던 smart things 을 사용하여 집에 삼성 가전제품들을 컨트롤 하거나 모니터링을 할 수 있게 되었는데, 아무래도 기기 제조사 끼리 사용하는게 궁합이 잘 맞을것 같기에 엄청나게 기대를 해보고 있다. 안그래도 좀더 편리한 라이프를 즐기는 스타일 이기에 신청 하게 되었다. 아래 사진 또한 갤럭시 노트8로 촬영한 스크린샷이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;빨리 만나 봤으면 좋겠다!! 하단에 신청 URL도 있으니 신청 하시면 됩니다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190829_220342118.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5FaNL/btqxQp1UMOw/k7xjeVjNTiIVIf93gma790/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5FaNL/btqxQp1UMOw/k7xjeVjNTiIVIf93gma790/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5FaNL/btqxQp1UMOw/k7xjeVjNTiIVIf93gma790/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5FaNL%2FbtqxQp1UMOw%2Fk7xjeVjNTiIVIf93gma790%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190829_220342118.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&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;&lt;a href=&quot;https://www.samsung.com/sec/templateEvent/Home_Mini_Beta&quot;&gt;https://www.samsung.com/sec/templateEvent/Home_Mini_Beta&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1567083840125&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a href=&quot;https://www.samsung.com/sec/templateEvent/Home_Mini_Beta/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-original-url=&quot;https://www.samsung.com/sec/templateEvent/Home_Mini_Beta&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/s9ayL/hyCDmEfsYm/Ul5dDBpnkBQZHDLMLmIVbk/img.png?width=500&amp;amp;height=500&amp;amp;face=0_0_500_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Home_Mini_Beta&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Home_Mini_Beta&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.samsung.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/17</guid>
      <comments>https://codei.tistory.com/17#entry17comment</comments>
      <pubDate>Thu, 29 Aug 2019 22:09:32 +0900</pubDate>
    </item>
    <item>
      <title>이것이 MariaDB다</title>
      <link>https://codei.tistory.com/16</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; width=&quot;323&quot; height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/babFRg/btqxf4rfYGU/yYEDLs3PrcSkZq2dyJa8V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/babFRg/btqxf4rfYGU/yYEDLs3PrcSkZq2dyJa8V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/babFRg/btqxf4rfYGU/yYEDLs3PrcSkZq2dyJa8V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbabFRg%2Fbtqxf4rfYGU%2FyYEDLs3PrcSkZq2dyJa8V0%2Fimg.png&quot; data-filename=&quot;blob&quot; width=&quot;323&quot; 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;MariaDB는 최근에 가장 핫한 데이터베이스 이다. 최근 CentOS 의 경우 기본 데이터베이스를 MySQL 에서 MariaDB로 교체되면서 입문자들이 CentOS 를 설치 하면 많이 보았을 데이터베이스이다. MySQL 과 똑같다 봐도 무방하지만 이제는 다른 회사로 분리가 되어 출시가 되었음으로 독립적인 프로젝트라고 봐도 무방하다. 이전부터 MySQL 과 PHP의 연동은 필수적인 요소로 생각할 만큼 궁합도가 높았는데 최신 MariaDB에 관한 책의 내용은 따로 없었지만 이번에 한빛미디어에서 출판한 &quot;이것이 ~ 다&quot; 시리즈중 MariaDB관련 내용이다. 역시나 데이터베이스의 기본 개념부터 탄탄히 설명이 되어 있어서 초보가 봐도 전혀 부담이 없는 책이다. PHP와의 연동 부분은 생각보다는 작은 부분이지만 꼭 필요한 부분은 정확하게 설명이 되어있으니 이책을 보면서 MariaDB를 통해 데이터베이스와 PHP 연동법, 데이터베이스의 기본개념을 익힐수 있는 좋은 책이라 생각된다.&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/16</guid>
      <comments>https://codei.tistory.com/16#entry16comment</comments>
      <pubDate>Wed, 7 Aug 2019 13:55:08 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 C언어 (혼공C)</title>
      <link>https://codei.tistory.com/15</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; width=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVyK7V/btqwD2lgL75/glXopLXUrdKPmaAimMBdYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVyK7V/btqwD2lgL75/glXopLXUrdKPmaAimMBdYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVyK7V/btqwD2lgL75/glXopLXUrdKPmaAimMBdYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVyK7V%2FbtqwD2lgL75%2FglXopLXUrdKPmaAimMBdYK%2Fimg.png&quot; data-filename=&quot;blob&quot; width=&quot;500&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;혼자 공부하는 C언어 (혼공C) C언어 프로그래밍 관련 책이다. 개인적으로 입문서는 원서를 추천하며, 원서가 읽기 힘든 사람에겐 다른 책을 추천을 해줬다. 워낙 인기가 있으니 해당 책의 언급은 하지 않도록 하겠다. 딱 잘라 말하면 그에 준하는 읽기 쉽게 구성이 되어있다. 쉽게 읽으면서 C언어를 공부하며 가장 힘들어하는 핵심적인 포인터 부분을 책의 반이상에 넣어 독자가 포인터에 겁을 먹지 않도록 해주고 있는것이 가장 큰 장점인것 같다. 이책의 개인적으로 좋아하는 부분은 C언어를 초장기에 배웠을 당시 대학 시험에서 그렇고 손으로 코딩하여 문제를 푸는 점이 나에게 가장 좋았던 공부법이라 생각한다. 나는 C언어를 처음 배우는 사람에게 무조건 손으로 직접 써보라고 할정도로 이책은 가장 처음부터 &quot;직접 해보는 손코딩&quot; 항목이 따로 있어 좋은 습관을 들일 수 있도록 해준다. 또, 다른 책들은 결과값을 따로 빼놓아서 소스코드를 보며 왔다갔다 하며 결과값을 확인해야 하지만 이책은 바로 그 코드에 결과값을 넣어 쉽게 확인 할 수 있도록 하였다. 책이 정말 사소한 부분을 독자가 어떤 부분에서 필요하고 불편한지를 잘 아는것 같아서 읽기 굉장히 편했다. C언어중 가장 핵심적이며 설명하기 어려운 포인터부분을 그림으로 설명하고 있어 C언어를 배우는 사람들에게 꼭 책을 추천을 해줘도 혼나지 않을것 같다는 생각이든다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/15</guid>
      <comments>https://codei.tistory.com/15#entry15comment</comments>
      <pubDate>Mon, 8 Jul 2019 18:23:15 +0900</pubDate>
    </item>
    <item>
      <title>알고리즘이 욕망하는 것들</title>
      <link>https://codei.tistory.com/14</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; width=&quot;538&quot; height=&quot;1107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tf61p/btqvTGLt8hJ/CBgopQ3xOLmkYKFTkHzKjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tf61p/btqvTGLt8hJ/CBgopQ3xOLmkYKFTkHzKjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tf61p/btqvTGLt8hJ/CBgopQ3xOLmkYKFTkHzKjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftf61p%2FbtqvTGLt8hJ%2FCBgopQ3xOLmkYKFTkHzKjk%2Fimg.png&quot; data-filename=&quot;blob&quot; width=&quot;538&quot; height=&quot;1107&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 style=&quot;color: #000000;&quot;&gt;요즘 컴퓨터 관련 분야의 초점은 인공지능에 초점이 많이 맞추어져 있다. 또 인고지능을 얘기하면서 꼭 빼놓지 않고 얘기하는 것이 있는데 바로 알고리즘에 대해서다. 알고리즘이란 IT관련된 일을 하는 사람이라면 필수 적인 부분이다. 이렇게 기술적으로 들어가려고 한다면 이책은 추천하고 싶지가 않다. 이책의 구성은 IT와 관련이 없는 사람이더라도 어렵게만 느껴지는 IT분야에서 주로 사용하는 알고리즘을 인문학적으로 풀어 설명을 하고 있기에 어느 누구도 이 책을 본다면 알고리즘에 단어 자체에 거부감이 많이 줄어 들것이라 생각이 든다. 여러 IT에서 내노라 하는 대기업 에서 사용하는 알고리즘에 대해 설명을 하며 흥미를 많이 이끌어 올렸다. IT전공자라면 알고리즘 공부에 대해 거부감이 있다거나, 알고리즘을 공부하며 머리가 복잡할때, 비전공자 와 비 IT분야에서 일하지만 최신 IT 용어와 기술에 관심이 있는 초심자라면 이 책을 읽기에 부담이 없어 추천할수있는 책이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/14</guid>
      <comments>https://codei.tistory.com/14#entry14comment</comments>
      <pubDate>Fri, 7 Jun 2019 18:00:51 +0900</pubDate>
    </item>
    <item>
      <title>이것이 자바다</title>
      <link>https://codei.tistory.com/13</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhHlD2/btquhkcH7ug/cT7r7RUk21iucsWP6VN0AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhHlD2/btquhkcH7ug/cT7r7RUk21iucsWP6VN0AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhHlD2/btquhkcH7ug/cT7r7RUk21iucsWP6VN0AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhHlD2%2FbtquhkcH7ug%2FcT7r7RUk21iucsWP6VN0AK%2Fimg.png&quot; data-filename=&quot;blob&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 style=&quot;color: #000000;&quot;&gt;JAVA 를 제대로 공부하기 위해 여러 책들을 보았다. 보았던 책들 중 난 정말 JAVA를 공부한 적 없어요, JAVA 의 정석등 여러 책들을 보았고 기초를 다졌다. 하지만 이번에 &quot;이것이 자바다&quot;의 책을 보면서 다시 JAVA를 공부한다는 마음으로 책을 보았다. 책의 구성은 1권과 2권으로 나누어져 있으며 1권은 자바 언어 문법과 객체 지향 프로그래밍 요소를 설명한다. 2장은 자바 API를 사요하여 고급 기능등을 사용할수 있도록 설명한다. 재미있는 점이 IO 기반 입출력과 NIO 기반 입출력 네트워킹에 대한 설명이 있다. 심도 깊은 내용은 아니지만 이 책을 보면서 공부하며 자신감으로 네트워크 프로그래밍에도 자연스럽게 공부 할 수 있도록 구성되어있다. 책의 내용은 정말 위 처음에 설명한 책들만큼 내용이 알차다. 또한 마음에 드는것이 자바 문법을 도식화처럼 그림을 그려 놓아 단순 문법만 써놓고 책의 내용을 이해하는 것보다 쉽게 이해할수 있어 좋았다. 굳이 아쉬운 점을 하나 고르라면 예제의 코드에 대해 설명이 생각보다는 빈약하다는 것이다. 내가 생각하는 빈약의 관점은 소스코드에는 설명이 되어있지만 한줄 한줄 설명한 책들이 있기에 그것을 비교하여 적다는 뜻이고, 생각해보면 그렇게 중요한 부분도 아니기에 초심자가 읽기에도 무리가 없을 것 같다. 책의 구성은 어느 책보다는 너무 나도 알차기에 초심자가, 또한 개발을 하며 기초가 필요할 때 읽으면 정말 좋은 책인것 같다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/13</guid>
      <comments>https://codei.tistory.com/13#entry13comment</comments>
      <pubDate>Thu, 11 Apr 2019 12:18:31 +0900</pubDate>
    </item>
    <item>
      <title>Twisted/Using Process 번역</title>
      <link>https://codei.tistory.com/12</link>
      <description>&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: separate; color: rgb(0, 0, 0); font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border-spacing: 0px; -webkit-text-decorations-in-effect: none; text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;margin: 0px auto; padding: 20px; border-width: 0px; border-style: initial; border-color: initial; line-height: 1.6; background-color: rgb(255, 255, 255); max-width: 960px;&quot;&gt;&lt;h1 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 28px; margin: 0px 0px 10px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial; -webkit-font-smoothing: antialiased;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;제나름 대로 사용하기 위해서 만들어 본것입니다. 오역이 많습니다. 참고하거나 틀린점이 있으면 댓글 부탁 드립니다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/h1&gt;&lt;div style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;원본은 다음과 같습니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&lt;font color=&quot;#333333&quot; face=&quot;Helvetica, arial, freesans, clean, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;a href=&quot;https://twistedmatrix.com/documents/current/core/howto/process.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://twistedmatrix.com/documents/current/core/howto/process.html&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&lt;font color=&quot;#333333&quot; face=&quot;Helvetica, arial, freesans, clean, sans-serif&quot;&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h1 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 28px; font-weight: bold; margin: 0px 0px 10px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial; -webkit-font-smoothing: antialiased;&quot;&gt;Using process&lt;/h1&gt;&lt;h2 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 24px; font-weight: bold; margin: 0px 0px 10px; padding: 0px; border-width: 0px 0px 1px; border-top-style: initial; border-right-style: initial; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-left-color: initial; -webkit-font-smoothing: antialiased; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204);&quot;&gt;Overview&lt;/h2&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 10px 0px 15px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;인터넷을 통해 서버로 접속하는 것처럼 Twisted 는 로컬 프로세스에 같은 API로 접속 할수 있다. API 는 다음과 같다&lt;/p&gt;&lt;ul style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px 0px 0px 30px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;a href=&quot;https://twistedmatrix.com/documents/18.9.0/api/twisted.internet.interfaces.IReactorProcess.html&quot; target=&quot;_blank&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(65, 131, 196); text-decoration: none; &quot;&gt;IReactorProcess&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;a href=&quot;https://twistedmatrix.com/documents/18.9.0/api/twisted.internet.interfaces.IProcessTransport.html&quot; target=&quot;_blank&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(65, 131, 196); text-decoration: none; &quot;&gt;IProcessTransport&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;a href=&quot;https://twistedmatrix.com/documents/18.9.0/api/twisted.internet.interfaces.IProcessProtocol.html&quot; target=&quot;_blank&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(65, 131, 196); text-decoration: none; &quot;&gt;IPorcessProtocol&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 24px; font-weight: bold; margin: 20px 0px 10px; padding: 0px; border-width: 0px 0px 1px; border-top-style: initial; border-right-style: initial; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-left-color: initial; -webkit-font-smoothing: antialiased; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204);&quot;&gt;Running Another Process&lt;/h2&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 10px 0px 15px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;reacotr를 통해 프로세스를 실행하려면&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;strong style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;reactor.spawnProcess&lt;/strong&gt;를 사용해야한다. Pipe는 child process에 만들어 지고, reactor 에 추가된 어플레키에션은 블록되지 않은 상태로 데이터를 새로운 프로세스에 주고 받을 수 있다.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;strong style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;reactor.spawnProcesss&lt;/strong&gt;는 두개의 인자값인&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;strong style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;processProtocol&lt;/strong&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;과&lt;strong style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;executable&lt;/strong&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;이 필요하다. 추가적으로&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;strong style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;arg, enviroment, path, userID, groupID, usePTY, and childFDS&lt;/strong&gt;를 사용 할수 있다. 이 모든것이 Windows에서 사용 할수 있는건 아니다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;from twisted.internet import reactor

processProtocol = MyProcessProtocol()
reactor.spawnProcess(processProtocol, executable, args=[program, arg1, arg2],
 env={'HOME': os.environ['HOME']}, path,
 uid, gid, usePTY, childFDs)
&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px 0px 0px 30px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;processProtocol :&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://twistedmatrix.com/documents/18.9.0/api/twisted.internet.protocol.ProcessProtocol.html&quot; target=&quot;_blank&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(65, 131, 196); text-decoration: none; &quot;&gt;tiwsted.internet.protocol.ProcessProtocol&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;의 하위 클래스 여야 하며 인터페이스는 하단에 설명 한다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;executable : 프로그램이 실행 할 절대경로 이것은 processProtocol 이 접속 될것이다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;args : 프로세스를 실행하기 위하여 넘겨지는 argument 이고&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;arg[0]&lt;/code&gt;은 항상 프로레스 이름이 되어야 한다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;env : 프로세스에게 넘겨줄 환경변수 type은 dictinaory 이다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;path : 프로세스가 실행될 위치. 프로세스는 현재 디렉토리로 주어지기 전까지 사용하고 path를 사용한다면 디렉토리는 변경 될 것이다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;uid, gid : 유저 ID와 그룹 ID 이며 기입시 해당 유저와 그룹 ID 로 실행된다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;userPTY : 프로세스가 pty 를 사용할 것인지 아니면 pipe의 쌍을 사용할건지 명시한다.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://docs.python.org/ko/3/library/pty.html&quot; target=&quot;_blank&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; color: rgb(65, 131, 196); text-decoration: none; &quot;&gt;Python PTY&lt;/a&gt;&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;childFDs : 하위 프로세스의 descriptor 를 사용할지 정한다. 각 키는 file descriptor 의 숫자(Integer)이며 하위 프로세스에서 보여질 것이다. 0, 1, 2 FD는&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stdin&lt;/code&gt;,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stdout&lt;/code&gt;,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stderror&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;이지면 몇 프로그램은 추가적인 fds를 커맨드 라인이나 환경 변수로 설정한다. 각 integer 값은 부모의 file descriptor 이고&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;r&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;은 부모로가 읽을 수 있고&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;w&lt;/code&gt;는 부모가 쓸수 있는 파이프를 만드는 문자열이다. 만약&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childFDS&lt;/code&gt;가 제공되어 지지 않는 다면 기본적으로&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stdin-write&lt;/code&gt;,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stdout-reader&lt;/code&gt;,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stderr-reader&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;파이프로 기본적으로 생성 된다.&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;args 와 env 는 기본적으로 비어 있는 값이다.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;args[0]&lt;/code&gt;은 executable과 같아야 한다. 만약 env에 os.environ 이 주어진다면 하위 프로세스는 현재 프로세스로부터 상속 받는다.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;reactor.spawnProcess&lt;/code&gt;는&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;IProcessTransport&lt;/code&gt;를 상속받아 구현된다.&lt;/p&gt;&lt;h2 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 24px; font-weight: bold; margin: 20px 0px 10px; padding: 0px; border-width: 0px 0px 1px; border-top-style: initial; border-right-style: initial; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-left-color: initial; -webkit-font-smoothing: antialiased; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204);&quot;&gt;Writing a ProcessProtocol&lt;/h2&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 10px 0px 15px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;ProcessProtocol 은&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;spawnProcess&lt;/code&gt;와 상호작용을 한다. 일반 프로토콜과 비슷 하지만 몇가지 특정 이벤트를 처리를 추가하는 방법이 있다. 우리의 예제는&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;wc&lt;/code&gt;를 사용하여 예제를 구현한다. 첫번째로는&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;ProcessProtocol&lt;/code&gt;을 초기화 한다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;from twisted.internet import protocol
class WCProcessProtocol(protocol.ProcessProtocol):

    def __init__(self, text):
        self.text = text
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;ProcessProtocol이 연결이 되었을대 connectionMade 메소드를 호출한다. 우리의 프로토콜에선 텍스트를 표준 입력으로 쓰고 표준 입력을 닫아서 프로세스가 우리가 표준 입력을 마쳤다는것을 알릴것이다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;...
def connectionMade(self):
    self.transport.write(self.text)
    self.transport.closeStdin()
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;이 시점에서 프로세는 데이터를 받고 결과를 읽을 시간이다.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;dataReceived&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;로 데이터가 수신되는 대신에 표준 출력데이터는&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;outReceived&lt;/code&gt;로 수신되어진다. 이것은 표준 오류에 대한 데이터와 구별하기 위한 것이다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;...
def outReceived(self, data):
    fieldLength = len(data) / 3
    lines = int(data[:fieldLength])
    words = int(data[fieldLength:fieldLength*2])
    chars = int(data[fieldLength*2:])
    self.transport.loseConnection()
    self.receiveCounts(lines, words, chars)
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;이제 프로세스가 출력을 파싱하여 프로세스 연결을 종료 하였다. 그런 다음 결과를 마지막 메서드로 결과를 보낸다. 이것은 클래스의 사용자가 데이터를 사용하여 다른 작업을 수행하도록 재지정 할 수 있다. 이 예제에서는 단지 결과를 출력 하는것 뿐이다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;...
def receiveCounts(self, lines, words, chars):
    print('Received counts from wc.')
    print('Lines:', lines)
    print('Words:', words)
    print('Characters:', chars)
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;작업을 다하였다 WCProcessProtocol을 사용하기 위해서 우리는 spawnProcess를 사용하여 인스턴서를 넘겨 준다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;from twisted.internet import reactor
wcProcess = WCProcessProtocol(&quot;accessing protocols through Twisted is fun!\n&quot;)
reactor.spawnProcess(wcProcess, 'wc', ['wc'])
reactor.run()
&lt;/code&gt;&lt;/pre&gt;&lt;h2 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 24px; font-weight: bold; margin: 20px 0px 10px; padding: 0px; border-width: 0px 0px 1px; border-top-style: initial; border-right-style: initial; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-left-color: initial; -webkit-font-smoothing: antialiased; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204);&quot;&gt;Things that can happen to your ProcessProtocol&lt;/h2&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 10px 0px 15px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;ProcessProtocol 을 상속 받아서 오버라이드 해야하는 함수에 대해 설명&lt;/p&gt;&lt;ul style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px 0px 0px 30px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;connectionMade()&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 프로그램이 시작될때 호출 되어지고 stdin pipe 를 통해 데이터를 쓰기 가장 좋은 위치다. (using&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.write&lt;/code&gt;)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;outReceived(data)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 하위 프로세스 에서 데이터를 받을때 호출 되어진다. 파이프는 socket보다 큰(보통 1kb) 사이즈를 제공하려는 경향이 있어서 네트워크 소켓의 전형적인 랜덤 드립과 드랍 행동을 경험하지 않을 수 있다 하지만 한번에 데이터를 어지 못한다면 대처할 준비가 되어 있어야 한다. 제대로 수행하려면 수신자가 데이터를 축적하고 프로세스가 완료 될때까지 모든 작업을 연기해야 한다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;errReceived(data)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;:&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;outReceived&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;처럼 동작하며 프로세스의 stderr pipe 로부터 호출 되어진다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;inConnectionLost&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 프로세스의 stdin pipe가 닫힘을 reactor 로부터 통지 받는다. 프로그램은 일반적으로 자신의 stdin을 닫지 않으며&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.loseConnection&lt;/code&gt;을 ProcessProtocol 에서 닫을때 호출 될 것이다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;outConnectionLost&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 프로그램이 stdout pipe를 닫을때 호출 되어진다. 대게 프로그램이 종료 될때 호출되어진다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;processExited(status)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 이 호출은 하위 프로세스가 회수 되거나 프로세스의 종료 정보를 받으면 호출 되어진다. 이 상태는 프로세스가 정상적으로 종료된 경우 (signal을 수신하지 않고 자연적인 원인으로 사망하고 종료 코드가 0인 경우), ProcessTerminated (.exitCode 속성을 가진경우) 를 보유하는 .value 로 생선된&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;Failure&lt;/code&gt;인스턴스의 형태로 전달된다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;processEnded(status)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: file desciptor와 연관된 하위 프로세스가 닫히거나 프로세스가 회수 되어질때 호출 되어진다. 이것은 ProcessProtocol의 마지막으로 콜백할것을 의미한다. status 파라메터는 processExited 와 같은 의미이다.&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;이러한 함수의 대부분에 대한 기본 클래스 정의는 no-ops입니다. 이것은 모든 튼튼하고 찌르레기가 버려지게 할 것이다. 파이프를 읽지 않으면 전체 파이프에 쓰기 위해 어린이 프로세스가 결국 차단됩니다. 즉, 파이프를 읽지 않아도됩니다.&lt;/p&gt;&lt;h2 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 24px; font-weight: bold; margin: 20px 0px 10px; padding: 0px; border-width: 0px 0px 1px; border-top-style: initial; border-right-style: initial; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-left-color: initial; -webkit-font-smoothing: antialiased; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204);&quot;&gt;Things you can do from your ProcessProtocol&lt;/h2&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 10px 0px 15px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;하위 프로세스를 다루는 기본적인 방법 입니다.&lt;/p&gt;&lt;ul style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px 0px 0px 30px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.write(data)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: data는 stdin pipe 입니다. write 메소드는 즉시 작성할 수 없는 데이터는 queue가 될것이다. 파이프가 다시쓰게 된다면 쓰기가 다시 시작될 것이다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.closeStdin&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: stdin 파이프를 닫는다. 프로그램은 필터 역할을 한다 ( stdin 으로부터 읽기, data 수정, stdout 으로 데이터 쓰기) 보통 해당 작업이나 프로세스 종료 하는것으로 받아 들인다. 프로그램들이 다끝나면 stdin 을 닫는것이 중요하다. 그렇지 않으면 하위 프로세스는 절대로 끝나지 않을 것이다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.closeStdout&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 대게 호출 되어지지 않는다. stdout 에 쓰려고 하면 SIGPIPE 오류가 발생될 것이다.이 과정은 훌륭한 과정은 아니다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.closeStderr&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 대게 호출 되어지지 않는다.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.closeStdout&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;과 같은 이유로&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.loseConnection&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 3개의 모든 파이프를 닫는다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.signalProcess('KILL')&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 하위 프로세스를 죽인다. 보통&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;processEnded&lt;/code&gt;가 호출 될 것이다.&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 24px; font-weight: bold; margin: 20px 0px 10px; padding: 0px; border-width: 0px 0px 1px; border-top-style: initial; border-right-style: initial; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-left-color: initial; -webkit-font-smoothing: antialiased; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204);&quot;&gt;Verbose Example&lt;/h2&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 10px 0px 15px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;wc 프로그렘 작성&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;process.py
---
#!/usr/bin/env python

# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

from __future__ import print_function

from twisted.internet import protocol
from twisted.internet import reactor
import re

class MyPP(protocol.ProcessProtocol):
    def __init__(self, verses):
        self.verses = verses
        self.data = &quot;&quot;

    def connectionMade(self):
        print(&quot;connectionMade!&quot;)
        for i in range(self.verses):
        self.transport.write(&quot;Aleph-null bottles of beer on the wall,\n&quot; +
         &quot;Aleph-null bottles of beer,\n&quot; +
         &quot;Take one down and pass it around,\n&quot; +
         &quot;Aleph-null bottles of beer on the wall.\n&quot;)
        self.transport.closeStdin() # tell them we're done

    def outReceived(self, data):
        print(&quot;outReceived! with %d bytes!&quot; % len(data))
        self.data = self.data + data

    def errReceived(self, data):
        print(&quot;errReceived! with %d bytes!&quot; % len(data))

    def inConnectionLost(self):
        print(&quot;inConnectionLost! stdin is closed! (we probably did it)&quot;)

    def outConnectionLost(self):
        print(&quot;outConnectionLost! The child closed their stdout!&quot;)
# now is the time to examine what they wrote
#print(&quot;I saw them write:&quot;, self.data)
        (dummy, lines, words, chars, file) = re.split(r'\s+', self.data)
        print(&quot;I saw %s lines&quot; % lines)

    def errConnectionLost(self):
        print(&quot;errConnectionLost! The child closed their stderr.&quot;)

    def processExited(self, reason):
        print(&quot;processExited, status %d&quot; % (reason.value.exitCode,))

    def processEnded(self, reason):
        print(&quot;processEnded, status %d&quot; % (reason.value.exitCode,))
        print(&quot;quitting&quot;)
        reactor.stop()

pp = MyPP(10)
reactor.spawnProcess(pp, &quot;wc&quot;, [&quot;wc&quot;], {})
reactor.run()
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;이 프로그램의 정확한 출력은 비동기 이벤트 타이밍에 따라 다릅니다. 특히 프로그램은 하위 프로세스가 stderr 파이프가 닫히기 전이나 stdout 파이프로부터 읽은 후를 관찬 할 수 있다. 가능한 아래와 같을 것이다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;% ./process.py
connectionMade!
inConnectionLost! stdin is closed! (we probably did it)
errConnectionLost! The child closed their stderr.
outReceived! with 24 bytes!
outConnectionLost! The child closed their stdout!
I saw 40 lines
processEnded, status 0
quitting
Main loop terminated. 
&lt;/code&gt;&lt;/pre&gt;&lt;h2 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 24px; font-weight: bold; margin: 20px 0px 10px; padding: 0px; border-width: 0px 0px 1px; border-top-style: initial; border-right-style: initial; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-left-color: initial; -webkit-font-smoothing: antialiased; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204);&quot;&gt;Mapping File Descripotrs&lt;/h2&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 10px 0px 15px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stdin&lt;/code&gt;,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stdout&lt;/code&gt;,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stderr&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;은 단지 컨벤션이다. 프로그램은 일반적으로 input 은 fd0, 외부로 출력인 fd1, 에러를 발생하는 fd2 이다. 이것은 표준 C 라이브러리 매크로와 같다.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;stdin&lt;/code&gt;은 fd0 을 의미한다 그리고 쉘에선 파이프는&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;|&lt;/code&gt;을 의미하고&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;fd1으로 부터 명령을 다음 커맨드의 fd0 으로 리다이렉션&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;과 같다. 그러나 이것은 단지 컨벤션이며 프로그램은 자유롭게 file descriptors 를 추가 할수 있으며 표준 3개의 fd 를 무시 할 수도있다.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childFDs&lt;/code&gt;argument는 자식 프로세스를 제공해야 하는 file descripotrs 를 정확히 지정 할 수 잇다.&lt;/p&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;각 childFD 는 3개중에 한개만 넣을 수 있다.&lt;/p&gt;&lt;ul style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px 0px 0px 30px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;부모 FD를 매핑 : 부모와 같은 읽기 쓰기와 같은 것을 할 수 있다&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;부모로 부터 읽을 수 있는 파이프를 넣는다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;파이프로 부터 부모에게 쓸수 있도록 넣는다.&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childFDs&lt;/code&gt;를 매핑하는 것은 대게 하위 프로세스의 stderr 를 부모와 같은 곳에 출력 하기 위해 사용된다. shell 로부터 프로그램을 실행 시킬때 대게 fds 0, 1, 2는 쉘의 0,1,2와 매핑 되어 진 상태로 하위 프로그램의 출력을 같은 터미널에서 볼수 있도록 한다. 마찬가지로, inetd는 일반적으로 stdin 과 stdout 을 네트워크 소켓에 매핑하고 stderr를 동일한 소켓 또는 일종의 로깅 메커니즘에 매핑 할 수 있다. 이는 하위 프로그램이 네트워크에 대한 지식 없이 실행될수 있도록 한다.&lt;/p&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;부모의 읽기 파이프는 child의 output을 가지기 위해 사용되어지고 하위 프로세스와 interactive 를 하기위한 공통 공통된 방법이다.&lt;/p&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;부모의 쓰기 파이프를 하위 프로세스에 주면 하위 프로세스를 통제 할 수 있다. FTP와 BC 같은 프로그램은 명령을 stdin 스트림에 작성하여 이러한 방식으로 제어 할 수 있다.&lt;/p&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childFDs&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;dictionary는 file descriptor 숫자를 위의 조건 3가지의 상태중 1개를 할 수있다. 부모의 fd들중 한개를 맵핑하고 싶다면 간단하게 fd의 숫자를 값처럼 넣어주면 된다. read 파이프를 매핑 하려면&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;r&lt;/code&gt;을 값처럼 사용하면 된다. write 파이프를 매핑 하고 싶다면&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;w&lt;/code&gt;를 사용하면 된다.&lt;/p&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;아래 예제는 기본적으로 stdin/stdout/stderr 파이프를 매핑하는 것이다. 이것은 dictionary 타입으로 되어있다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;childFDs = {0: &quot;w&quot;, 1: &quot;r&quot;, 2: &quot;r&quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;부모의 파이썬 프로그램이 하는 것과 동일한 장소에 읽고 쓰는&amp;nbsp;프로세스를 시작하려면 다음을 사용한다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;childFDs = {0: 0, 1: 1, 2: 2}
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;fd를 추가하려면 다음과 같이 한다.&lt;/p&gt;&lt;pre style=&quot;color: rgb(51, 51, 51); font-family: Consolas, &amp;quot;Liberation Mono&amp;quot;, Courier, monospace; font-size: 13px; font-weight: normal; margin: 15px 0px; padding: 6px 10px; border-width: 1px; background-color: rgb(248, 248, 248); border-style: solid; border-color: rgb(204, 204, 204); line-height: 19px; overflow: auto; border-radius: 3px;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: pre; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: transparent; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-width: initial; border-color: initial; background-position: initial initial; background-repeat: initial initial; &quot;&gt;childFDs = {0: &quot;w&quot;, 1: &quot;r&quot;, 2: &quot;r&quot;, 4: &quot;w&quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 style=&quot;color: rgb(0, 0, 0); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 24px; font-weight: bold; margin: 20px 0px 10px; padding: 0px; border-width: 0px 0px 1px; border-top-style: initial; border-right-style: initial; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-left-color: initial; -webkit-font-smoothing: antialiased; border-bottom-style: solid; border-bottom-color: rgb(204, 204, 204);&quot;&gt;ProcessProtocol with extra file descriptors&lt;/h2&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 10px 0px 15px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childFDs&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;dictionary 를 보통 3개의 fd보다 더 제공 되어질때 이런 파이프를 접근 하기위해 추가적인 메소드가 필요하다. 이러한 방법은 위에서 설명한&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;outReceived&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;방법보다 더 일반적이다. 사실 이런 메소드(&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;outReceived&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;and&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;errReceived&lt;/code&gt;) 는 오래된 코드를 호환하기위해 래핑되어있다. 새로운 ProcessProtocol 은 다음을 따르고 있다.&lt;/p&gt;&lt;ul style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px 0px 0px 30px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;connectionMaded&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 프로그램이 시작되어질때 호출 되어진다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childDataReceived(childFD, data)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;:프로세스의 output pipe 들중 데이터를 받을때 호출되어진다 (예를 들어&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childFDs&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;값이 r 이면 실질적인 숫자는(하위 프로세스의 관점에서)&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childFD&lt;/code&gt;에 있다. 호환을 위해&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childFD&lt;/code&gt;가 1또는 2일때&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childDataReceived&lt;/code&gt;는&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;outReceived&lt;/code&gt;과&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;errReceived&lt;/code&gt;로 디스패치하게 되어있다.)&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childConnectionLost(childFD)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 이것은 reactor 로부터 프로세스의 파이프가 닫힐때 통지 도이ㅓ진다. 이것은 단지 부모의 파이프가 닫힌것인지(&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.closeChildFD&lt;/code&gt;과 같은), 하위 프로세스에서 명시적으로 파이프로 닫을때(때때로 EOF를 가르킴), 하위 프로세스가 종료 되거나 커널이 모든 파이프를 닫을때를 의미한다.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;childFD&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;argument는 파이프가 닫혔다고 말한다. 파이프에 매핑된 파일 설명자에 대해서만 알수있다 기존 FD에 매핑 될때 부모는 그들이 언제 닫혔는지 알 수 있는 방법이 없습니다. 호환을 위해 기본적으로&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;inConnectonLost&lt;/code&gt;,&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;outConnectionLost&lt;/code&gt;,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;errConnectionLost&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;디스패치 되어있다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;processEnded(status)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 하위 프로세스가 종료되어질때 나 파이프가 종료 되어질때 호출 되어진다. 이것은 종료 되기전에 모든 데이터들이&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;processEnded&lt;/code&gt;가 실행되기 전에 쓰여진다.&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin: 15px 0px; padding: 0px; border-width: 0px; border-style: initial; border-color: initial;&quot;&gt;이러한 것 이외에도 하위 프로세스에게 사용 할 수있는 메소드는 다음과 같다.&lt;/p&gt;&lt;ul style=&quot;color: rgb(51, 51, 51); font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; font-weight: normal; margin-top: 15px; margin-right: 0px; margin-left: 0px; padding: 0px 0px 0px 30px; border-width: 0px; border-style: initial; border-color: initial; margin-bottom: 0px !important;&quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.writeToChild(childFD, data)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: input 파이프로 데이터를 넣을때 간단하게 write는 childFD = 0 에쓰는 것과 같다.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; &quot;&gt;&lt;code style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; font-size: 12px; font-family: Consolas, 'Liberation Mono', Courier, monospace; white-space: nowrap; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(234, 234, 234); border-right-color: rgb(234, 234, 234); border-bottom-color: rgb(234, 234, 234); border-left-color: rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; &quot;&gt;self.transport.closeChildFD(childFD)&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;: 하위 프로세스들중 하나를 닫아라. input 파이프를 다는것은 공통적으로 EOF 를 하위 프로세스에게 가르킨다. 출력 파이프를 다는것은 매우 유용하지도 않다.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description>
      <category>개발/Python</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/12</guid>
      <comments>https://codei.tistory.com/12#entry12comment</comments>
      <pubDate>Thu, 7 Mar 2019 20:04:13 +0900</pubDate>
    </item>
    <item>
      <title>Twisted/ Static File server file listing disable</title>
      <link>https://codei.tistory.com/10</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;Twisted 를 사용하면서 웹의 static한 파일들을 사용하려면 Resource를 만들어서 serve해야 한다&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;script src=&quot;https://gist.github.com/codeinet/7ed034334a73ca851401dbb7810693ce.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;위와 같이 serve할 path를 지정해주고 사용을 하면 되는 것인데, 이렇게 사용한다면 단점이 있다..&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;단점이라 함은 static.File Class가 자체적으로 해당 위치에 접속을 하게 되면 해당 파일 내용들이 나오게 되어 난감한 상황을 발생시키게 된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;이것은 기본적으로 Twisted에서 directory listing을 off 하게 해주면 좋을듯 한데. 그것까진 지원이 되는것 같지 않아 아쉽다.&lt;/span&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: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/992B7F345C601BC40D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F992B7F345C601BC40D&quot; width=&quot;400&quot; height=&quot;151&quot; filename=&quot;스크린샷 2019-02-10 오후 9.38.36.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;[기본적은 file serve하고 해당 폴더를 입력시 위와 같이 Directory Listing이 나온다]&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 style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;해당 문제라기 보다는 Twisted의 기본적인 API문서를 보면 알게 되는데 해당 API는 아래와 같이 기술되어있다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&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: 907px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99ED57415C601CEE0F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99ED57415C601CEE0F&quot; width=&quot;907&quot; height=&quot;245&quot; filename=&quot;스크린샷 2019-02-10 오후 9.43.12.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;a href=&quot;https://twistedmatrix.com/documents/current/api/twisted.web.static.File.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;Twisted&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;https://twistedmatrix.com/documents/current/api/twisted.web.static.File.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;Static File API&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;[링크]&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;위와같이 위치를 설정하면 해당 내용들이 자동적으로 HTML형식으로 리스팅 되어서 내온다는 말이다. 자 대충의 내용은 알았으니 실질적인 File Listing을 Disable을 해보자.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;처리 방식은 다음과 같다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;해당 API문서를 보면 directoryListing이란 method 가 있는데 이 메소드의 반환값을보면 다음과 같다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;script src=&quot;https://gist.github.com/codeinet/e124d64964bfc40ac9741a3e72916419.js&quot;&gt;&lt;/script&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;여기에서 DirecotryListeter라는 클래스가 반환이 되어 지는데 이는 위에 기본적으로 file serve direcotryListing&amp;nbsp;모습의 클래스를 반환한다 안에는&amp;nbsp;CSS/HTML 태그등&amp;nbsp;다양한 템플릿 형태로 저장 되어있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그렇다면 DirecotryLister는 무엇일까 이것도 또한 Resource의 일부임으로 DirecotryLister 대신에 다른 리소스를 리턴해 준다면 해당 파일 리스트는 생성되지 않을 것이다. 가장 해결하기 편한 방법은 간단히 해당 file Class를 상속받아서 direcotryListing을 오버라이딩해서 Resource만 return 해주면 된다.&lt;/p&gt;&lt;p&gt;그래서 나는 다음과 같이 해당 클래스를 생성해서 사용하기로 했다.&lt;/p&gt;&lt;p&gt;이렇게 정의 하고 이것을 Resource로 사용한다면 해당 디렉터리 목록은 나오지 않게 될 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;caret-color: rgb(36, 41, 46); color: rgb(36, 41, 46); font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 12px; white-space: pre;&quot;&gt;&lt;br /&gt;&lt;/span&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: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C95D3E5C6022C724&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C95D3E5C6022C724&quot; width=&quot;400&quot; height=&quot;151&quot; filename=&quot;스크린샷 2019-02-10 오후 10.09.38.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;[설정 적용된 모습]&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;이렇게 한다면 해당 디렉터리 목록은 나오지 않지만 해당 static 파일들은 내오게 된다. 이런식으로 사용한다면 조금이나마 보안 설정을 할 수 있게 되지 않을까? 선택은 개인의 몫이며 해당 관련된 내용중 틀린 내용이 있거나 좋은 내용이 있다면 답글 달아주면 감사 하겠습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&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 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;&lt;br /&gt;&lt;/p&gt;</description>
      <category>개발/Python</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/10</guid>
      <comments>https://codei.tistory.com/10#entry10comment</comments>
      <pubDate>Sun, 10 Feb 2019 22:13:01 +0900</pubDate>
    </item>
    <item>
      <title>이것이 C# 이다.</title>
      <link>https://codei.tistory.com/9</link>
      <description>&lt;p style=&quot;border: 0px; font-family: Montserrat, sans-serif; font-size: 16px; margin-right: 0px; margin-bottom: 20px; margin-left: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101); text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B78C4C5C5D105817&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B78C4C5C5D105817&quot; width=&quot;400&quot; height=&quot;514&quot; filename=&quot;B8279658831_l (1).jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-bottom: 20px; margin-left: 0px; border: 0px; font-family: Montserrat, sans-serif; font-size: 16px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101);&quot;&gt;이것이 C# 이다. 최근에서 윈도우 GUI를&amp;nbsp; 제작하는 프로젝트가 있어 C#을 배울 필요 성을을 느꼈는데, 알맞은 책인것 같다.&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-bottom: 20px; margin-left: 0px; border: 0px; font-family: Montserrat, sans-serif; font-size: 16px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101);&quot;&gt;이책은 기존 뇌를 자극하는 시리즈에서 출발을 하였는데, 책의 내용이나 내용은 알찼으나 최신 C#의 문법을 배우기에는 오래 되었다는 아쉬움이 남아 있었다. 하지만 이것이 C#이라는 책은 최신 7.0 대의 버전으로 넘어온 시점에서 알맞은 책이란 생각을 한다. 가장 기본적인 형식부터 스레드, winform, 가비지 컬렉터까지 아우르는 방대한 양의 내용을 초보자가 읽기 쉽게 서술 하였고 중간중간에 나오는 그림들이 내용을 이해하기 쉽게 포인트를 집어서 설명한 것 같다. 이중에서 여기서 잠깐 이라는 부분이 있는데 이부분은 쉽게 넘어 갈수 있었던 내용들을 다시한번 간략하 설명을 함으로써 쉽게 잊어버리는 내용들이나 중요한 내용들을 다시한번 생각을 할 수 있도록 도와준다. winform 을 이용하여 윈도우 프로그래밍을 하기에는 방대한 양은 아니지만 C#을 배움으로써 연계되는 winform 의 내용들이 자연 스럽게 서술되어 어떤 방향으로 공부하면 될 것인지 알게 되었다. 인터넷을 통한 C#을 배우며 부족함이 느껴진 분이라면 반드시 이책을 구입하여 정독 하면 좋을 것 같다.&lt;/p&gt;&lt;p style=&quot;border: 0px; font-family: Montserrat, sans-serif; font-size: 16px; margin-right: 0px; margin-bottom: 20px; margin-left: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101);&quot;&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/9</guid>
      <comments>https://codei.tistory.com/9#entry9comment</comments>
      <pubDate>Fri, 8 Feb 2019 14:15:19 +0900</pubDate>
    </item>
    <item>
      <title>처음 시작하는 R 데이터 분석</title>
      <link>https://codei.tistory.com/8</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: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99605D495C5D103A16&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99605D495C5D103A16&quot; width=&quot;400&quot; height=&quot;514&quot; filename=&quot;B6952054209_l.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(101, 101, 101); font-family: Montserrat, sans-serif; font-size: 16px;&quot;&gt;R데이터 분석에 관해 관심을 가지고 있는 사람, 혹은 데이터를 어떻게 분석해야할지 모르는 상태에서 읽기 좋은 책인것 같다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;border: 0px; font-family: Montserrat, sans-serif; font-size: 16px; margin-right: 0px; margin-bottom: 20px; margin-left: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101);&quot;&gt;대용량 분석에 활용하기에는 많이 부족하지만, 데이터의 형태, 분석의 방법론을 이해하기에는 기본기가 좋은 책임에 틀림 없다.&lt;/p&gt;&lt;p style=&quot;border: 0px; font-family: Montserrat, sans-serif; font-size: 16px; margin-right: 0px; margin-bottom: 20px; margin-left: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101);&quot;&gt;데이터 분석을하기위하여 TXT, CSV, Excel 데이터등을 활용하여 실무에서 사용 할 수 있는 가능한 범위 내에서 설명을 잘해 놓아서 책의 내용대로 따라하다보면 어느세 데이터 분석에 재미를 느끼고 있을 것이다. 또한 공공데이터를 가지고 분석을 하는 부분이 가장 재미있게 느껴졌는데 이 예제가 데이터 분석을 어떻게 응용할수 있는지에 생각을 키워준 것 같다.&lt;/p&gt;&lt;p style=&quot;border: 0px; font-family: Montserrat, sans-serif; font-size: 16px; margin-right: 0px; margin-bottom: 20px; margin-left: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: rgb(101, 101, 101);&quot;&gt;이책은 여러 처음 시작하는 시리즈와 비슷한 맥락으로 무겁지 않고 가볍우면서도 쉽게 데이터 분석을 접근 하도록 하는 책이기에 데이터 분석 입문을 하는 사람에게는 꼭 추천을 해주고싶다.&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/8</guid>
      <comments>https://codei.tistory.com/8#entry8comment</comments>
      <pubDate>Fri, 8 Feb 2019 14:14:44 +0900</pubDate>
    </item>
    <item>
      <title>스프링5 레시피 스프링 애플리케이션 개발에 유용한 161가지 문제 해결 기법 4판</title>
      <link>https://codei.tistory.com/7</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: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998E5D4F5C5D101E1A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998E5D4F5C5D101E1A&quot; width=&quot;400&quot; height=&quot;514&quot; filename=&quot;B3859466837_l.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(101, 101, 101); font-family: Montserrat, sans-serif; font-size: 16px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(101, 101, 101); font-family: Montserrat, sans-serif; font-size: 16px;&quot;&gt;오랜만에 스프링 관련된 책을 다시 보았는데 기존에 보던 책에 비해 최신 개발 툴별로 세팅법부터 설명이 되어있다. 책의 난이도는 낮은 편은 아니나 기본 서적을 본후에 이책을 본다면 많은 도움을 받을 수 있는 책이라 생각한다. 특히 실무자들에게는 이책을 더욱 추천을 할 수 있는데 이유는 필요한 레시피 별로 구분을 해놓고 과제/해결책/풀이로 으로 구성이 되어있어 문제만 던져 놓고 풀이하는 방식보다는 해결방법을 먼저 정리하고 풀이를 보며 설명을 하는 구성으로 되어있어 책을 보는데 일기가 더욱 편하다는 장점이 있으며 많은 예제가 있으니 기본서적을 보고 스프링을 이해한 후 이책을 본다면 강력 추천한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/7</guid>
      <comments>https://codei.tistory.com/7#entry7comment</comments>
      <pubDate>Fri, 8 Feb 2019 14:14:17 +0900</pubDate>
    </item>
    <item>
      <title>HELLO CODING 한입에 쏙 파이썬</title>
      <link>https://codei.tistory.com/6</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: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/998CE64A5C5D0FFE14&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F998CE64A5C5D0FFE14&quot; width=&quot;400&quot; height=&quot;514&quot; filename=&quot;B5915471368_l.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style=&quot;color: rgb(101, 101, 101); font-family: Montserrat, sans-serif; font-size: 16px;&quot;&gt;프로그래밍을 아무것도 모르고 시작 하고싶은 사람에겐 가장 접근하기 쉬운책!&lt;/span&gt;&lt;br style=&quot;color: rgb(101, 101, 101); font-family: Montserrat, sans-serif; font-size: 16px;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(101, 101, 101); font-family: Montserrat, sans-serif; font-size: 16px;&quot;&gt;대게는 점프투파이썬을 인터넷에서 보고 시작 하는 경우가 많은걸 주변에서 볼 수있는데, 어느정도 프로그래밍에대한 지식이 있는 사람에겐 도움이 많이 될지 모르겠으나, 처음 시작하는 사람은 그마저도 접근하기 힘들어 하는 모습을 많이 보았다. Hello Coding 한입에 쏙 파이썬은 프로그래밍의 기본도 모르는 초보자가 읽기 편하게 그림과, 적절한 예제를 들어주며 파이썬의 기본이 잘 서술되어있는 책이다. 또한 김왼손의 왼손코딩 유투브 채널, Hello Coding 카페, 소스 코드 또한 온라인으로 제공을 해준다는 점에서 많은 점수를 주고싶다. 많은 기본 서적을 보았지만, 이처럼 쉽게 풀이된 책은 당분간은 쉽게 보지 못할것 같다. 주변에 프로그래밍에 관심이 있는 사람이 있다면 점프투 파이썬은 이책을 읽고 나서 복습하는 개념으로 파이썬을 조금더 재미있게 익히길 추천 하고싶다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/6</guid>
      <comments>https://codei.tistory.com/6#entry6comment</comments>
      <pubDate>Fri, 8 Feb 2019 14:13:43 +0900</pubDate>
    </item>
    <item>
      <title>아무것도 모르고 시작하는 인공지능 첫걸음</title>
      <link>https://codei.tistory.com/5</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: 233px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99F5BA505C5D0FDE0C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99F5BA505C5D0FDE0C&quot; width=&quot;233&quot; height=&quot;300&quot; filename=&quot;B3863756314_l-233x300.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(101, 101, 101); font-family: Montserrat, sans-serif; font-size: 16px;&quot;&gt;이책을 읽는 독자는 비전공자나, 인공지능에 관심을 가지고 접근 하려는 사람에게 가장 유용한 책이 될 것이다. 막연한 프레임워크를 이용한 설명하는 책보다는 큰 틀을 가지고 인공지능이란 무엇이고, 어떻게 접근 하는지에 대해 기술한 책이기 때문이다. 이책의 특성은 독자가 물 흐르듯이 읽는 방식보다 주제를 설명하기전 독자 자신이 생각을 할 수있도록 자그만한 스텝이 준비 되어 있어 한번더 생각하며 책을 읽을 수 있도록 도와 주며, 많은 예시를 통해 인공지능과 관련된 어려운 용어 설명과, 순차적으로 인공지능의 개념을 정리 할 수 있도록 정리가 매우 잘되어있는 책이다. 입문자, 비전공자, 인공지능에 관심있는 독자에게는 가장 좋은 입문서가 될 수 있는 책이다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>리뷰</category>
      <author>코드넴</author>
      <guid isPermaLink="true">https://codei.tistory.com/5</guid>
      <comments>https://codei.tistory.com/5#entry5comment</comments>
      <pubDate>Fri, 8 Feb 2019 14:13:11 +0900</pubDate>
    </item>
  </channel>
</rss>