<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>요체크다 (기록하고 기록하면서 기억하자~!)</title>
    <link>https://nick2ya.tistory.com/</link>
    <description>기록하고 기록하면서 기억하자~!</description>
    <language>ko</language>
    <pubDate>Fri, 3 Jul 2026 15:20:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>요체크다</managingEditor>
    <item>
      <title>[Linux] CentOS 부팅 실패 사례</title>
      <link>https://nick2ya.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;내부에서 CentOS 리눅스 운영 중 갑자기 정전으로 인해 서버가 의도치 않게 비정상적으로 종료가 되었고, 이후 부팅 시 정상적으로 OS 가 올라오지 않는 문제가 발생하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 부팅 시 아래와 같은 에러 메시지 발생.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- ERST: Cant not request iomem region&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Can`t read CTR while initializing i8042&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4027&quot; data-origin-height=&quot;1197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TkgYW/btsKVC1tVQC/xLNwRIpE1hkopbXklKzyN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TkgYW/btsKVC1tVQC/xLNwRIpE1hkopbXklKzyN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TkgYW/btsKVC1tVQC/xLNwRIpE1hkopbXklKzyN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTkgYW%2FbtsKVC1tVQC%2FxLNwRIpE1hkopbXklKzyN1%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;4027&quot; height=&quot;1197&quot; data-origin-width=&quot;4027&quot; data-origin-height=&quot;1197&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;b&gt;2. 조치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1) 인터넷을 찾아보니 maintenance mode에서 File system 체크 및 복구를 시도하라고 해서 복구 진행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&amp;nbsp; &lt;b&gt;ㆍ&lt;/b&gt; 증상 동일.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;2) &lt;/span&gt;해당 서버가 스토리지와 연결될 File system 을 사용 중이어서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/fstab 에서 주석처리 후 재부팅 시도.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwy7Hb/btsKWYh5aUq/Qvnj53WwzvEhhjyHNM3LKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwy7Hb/btsKWYh5aUq/Qvnj53WwzvEhhjyHNM3LKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwy7Hb/btsKWYh5aUq/Qvnj53WwzvEhhjyHNM3LKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwy7Hb%2FbtsKWYh5aUq%2FQvnj53WwzvEhhjyHNM3LKK%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;766&quot; height=&quot;184&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &lt;b&gt;ㆍ&lt;/b&gt; 서버 정상 부팅.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;</description>
      <category>OS/Linux</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/35</guid>
      <comments>https://nick2ya.tistory.com/35#entry35comment</comments>
      <pubDate>Tue, 26 Nov 2024 09:24:05 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] Database I/O 통계 정보 모니터링</title>
      <link>https://nick2ya.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;PostgreSQL에서는 &lt;b&gt;pg_stat_database&lt;/b&gt; 이라고 하는 View 테이블을 통해 각 Database의 통계 정보를 제공합니다.&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;이를 통해 Database 수준의 I/O 활동과 성능 메트릭을 모니터링할 수 있습니다. Database 전체의 전반적인 상태를 파악하는 데 유용하며, 성능 튜닝 및 모니터링에 자주 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 주요 컬럼 정보&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 99.5346%; height: 1028px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;컬럼명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;참 조&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;datid&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; Database 의 OID(고유 식별자).&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;datname&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; Database 이름.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;numbackends&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;현재 Database 에 연결된 백엔드(Client 연결) 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이 값이 높으면 해당 Database 에 지나치게 많은 연결이 이루어지고 있다는 것을 의미합니다. 높은 연결 수는 성능 저하를 일으킬 수 있습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;xact_commit&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; Database에서 커밋된 트랜잭션의 총 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;트랜잭션의 성공적인 커밋 수를 모니터링하며, 갑작스럽게 커밋 수가 감소하면 트랜잭션 실패가 발생했을 가능성이 있습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;xact_rollback&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; Database에서 롤백된 트랜잭션의 총 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;롤백이 많은 경우 Application 에서 오류가 발생하거나 데이터베이스 상태가 비정상일 수 있으므로 모니터링이 필요합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;blks_read&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;디스크에서 읽은 블록 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 60px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;디스크에서 데이터를 읽는 데 시간이 많이 걸리면 성능 문제가 있을 수 있습니다. 캐시 효율성을 확인하려면 blks_hit와 비교해야 합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 80px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 80px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;blks_hit&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 80px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;공유 버퍼에서 캐시된 블록의 총 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 80px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Shared&amp;nbsp;Buffer&amp;nbsp;Memory&amp;nbsp;에서&amp;nbsp;히트된&amp;nbsp;블록의&amp;nbsp;수(이&amp;nbsp;값이&amp;nbsp;높을&amp;nbsp;수록&amp;nbsp;성능이&amp;nbsp;좋음을&amp;nbsp;의미),&amp;nbsp;캐시에서&amp;nbsp;데이터를&amp;nbsp;읽으면&amp;nbsp;디스크&amp;nbsp;I/O가&amp;nbsp;줄어듭니다.&amp;nbsp;blks_read와&amp;nbsp;함께&amp;nbsp;확인하여&amp;nbsp;캐시&amp;nbsp;성능을&amp;nbsp;평가합니다.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;tup_returned&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Select 로 반환된 총 튜플 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 40px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;tup_fetched&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 40px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Select 로 읽힌 튜플 수.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(index 를 통해 가져온 튜플 포함).&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 40px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;tup_inserted&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;INSERT된 총 튜플 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;tup_updated&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;UPDATE된 총 튜플 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;tup_deleted&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;DELETE된 총 튜플 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;conflicts&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Hot Standby에서 발생한 충돌 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;temp_files&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;데이터베이스에서 생성된 임시 파일의 총 개수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;temp_bytes&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;임시 파일에 기록된 총 데이터 크기(Byte 단위).&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;deadlocks&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;데이터베이스에서 발생한 데드락 수.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 40px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;blk_read_time&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 40px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;디스크에서 블록을 읽는 데 소요된 총 시간.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(밀리초 단위).&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 80px;&quot; rowspan=&quot;2&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;Default 는 비활성화.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;- track_io_timing 설정 필요.&lt;/b&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 40px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;blk_write_time&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 40px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;디스크에 블록을 쓰는 데 소요된 총 시간.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(밀리초 단위).&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 11px;&quot;&gt;
&lt;td style=&quot;width: 14.5162%; height: 11px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;stats_reset&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.4191%; height: 11px;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;통계 정보가 마지막으로 리셋된 시각.&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.317%; height: 11px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 활용 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 캐시 히트율 계산. (Shared_Buffer Ratio%)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;ㆍ&lt;/b&gt;일반적으로 99% 이상이 좋은 상태이며, 낮은 경우에는 Shared-Buffers 크기를 늘리거나 쿼리를 최적화해야 할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot; data-ke-size=&quot;size14&quot;&gt;SELECT &lt;br /&gt;datname,&lt;br /&gt;blks_hit,&lt;br /&gt;blks_read,&lt;br /&gt;&lt;span style=&quot;color: #dbdbaa;&quot;&gt;ROUND&lt;/span&gt;((blks_hit * &lt;span style=&quot;color: #b4cda8;&quot;&gt;100.0 &lt;/span&gt;/ &lt;span style=&quot;color: #dbdbaa;&quot;&gt;GREATEST&lt;/span&gt;(blks_hit + blks_read, &lt;span style=&quot;color: #b4cda8;&quot;&gt;1&lt;/span&gt;)), &lt;span style=&quot;color: #b4cda8;&quot;&gt;2&lt;/span&gt;) AS cache_hit_ratio&lt;br /&gt;FROM pg_stat_database;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;2) 트랜젝션 활동 체크 (Commit Ratio%)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;ㆍ&lt;/b&gt;트랜잭션 커밋 및 롤백 비율을 계산하여 데이터베이스의 안정성을 체크합니다. 일반적으로 99% 이상이 좋은 상태입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;ㆍ&lt;/b&gt;낮은 커밋 비율은 롤백이 빈번하게 발생하는 것을 의미하기 때문에 추가적인 분석(ex, 리소스 부족, 데이터 무결성 문제 등)이 필요합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot; data-ke-size=&quot;size14&quot;&gt;SELECT &lt;br /&gt;datname,&lt;br /&gt;xact_commit,&lt;br /&gt;xact_rollback,&lt;br /&gt;&lt;span style=&quot;color: #dbdbaa;&quot;&gt;ROUND&lt;/span&gt;((xact_commit * &lt;span style=&quot;color: #b4cda8;&quot;&gt;100.0 &lt;/span&gt;/ &lt;span style=&quot;color: #dbdbaa;&quot;&gt;GREATEST&lt;/span&gt;(xact_commit + xact_rollback, &lt;span style=&quot;color: #b4cda8;&quot;&gt;1&lt;/span&gt;)), &lt;span style=&quot;color: #b4cda8;&quot;&gt;2&lt;/span&gt;) AS commit_ratio&lt;br /&gt;FROM pg_stat_database;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Database/PostgreSQL</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/34</guid>
      <comments>https://nick2ya.tistory.com/34#entry34comment</comments>
      <pubDate>Fri, 22 Nov 2024 00:57:20 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 FC Adapter LVM 생성 및 관리 (기존 VG 확장)</title>
      <link>https://nick2ya.tistory.com/33</link>
      <description>&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;리눅스 서버 운영 시 서비스가 기동되는 영역의 경우 성능 및 효율적인 운영을 위해 FC Adapter 를 통해 Storage와 연결하여 Filesystem을 생성하여 운영합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;아래는 FC Adapter를 통한 LVM 생성(기존 VG 확장) 및 관리 순서를 정리한 내역입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;lt; 리눅스 LVM 구성 순서 &amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot; data-ke-size=&quot;size14&quot;&gt;- disk &lt;span&gt;인식&lt;br /&gt;&lt;/span&gt;- Physical &lt;span style=&quot;color: #dbdbaa;&quot;&gt;Volume&lt;/span&gt;(PV) &lt;span style=&quot;color: #dbdbaa;&quot;&gt;생성 &lt;/span&gt;(multipath device&lt;span&gt;는 &lt;/span&gt;multipath device&lt;span&gt;에 &lt;/span&gt;PV &lt;span&gt;생성&lt;/span&gt;)&lt;br /&gt;- &lt;span&gt;기존 &lt;/span&gt;Volume Group &lt;span&gt;에 &lt;/span&gt;&lt;span style=&quot;color: #dbdbaa;&quot;&gt;추가&lt;/span&gt;(&lt;span&gt;확장&lt;/span&gt;)&lt;br /&gt;- Logical &lt;span style=&quot;color: #dbdbaa;&quot;&gt;Volume&lt;/span&gt;(LV) &lt;span&gt;생성&lt;br /&gt;&lt;/span&gt;- Filesystem &lt;span&gt;생성&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;1. Linux에서 FC Adapter(HBA)의 Link 상태 및 wwpn 확인&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# ls /sys/class/fc_host/&lt;br /&gt;&lt;/span&gt;host12 host14&lt;br /&gt;- Link &lt;span&gt;상태&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# cat /sys/class/fc_host/host12/port_state&lt;br /&gt;&lt;/span&gt;Online&lt;br /&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# cat /sys/class/fc_host/host14/port_state&lt;br /&gt;&lt;/span&gt;Online&lt;br /&gt;&lt;br /&gt;- wwpn &lt;span&gt;확인&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# cat /sys/class/fc_host/host12/port_name&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b4cda8;&quot;&gt;0x21000024ff1e483f&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# cat /sys/class/fc_host/host14/port_name&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b4cda8;&quot;&gt;0x21000024ff41c3c3&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b4cda8;&quot;&gt;&lt;br /&gt;&lt;/span&gt;- Linux&lt;span&gt;에서 추가된 &lt;/span&gt;FC disk &lt;span style=&quot;color: #dbdbaa;&quot;&gt;인식&lt;/span&gt;(online)&lt;br /&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# echo 1 &amp;gt; /sys/class/fc_host/host12/issue_lip&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# echo 1 &amp;gt; /sys/class/fc_host/host14/issue_lip&lt;br /&gt;&lt;/span&gt;cat /proc/partitions &lt;span&gt;및 &lt;/span&gt;multipath -ll &lt;span&gt;로 추가된 &lt;/span&gt;disk &lt;span&gt;확인&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;2. 추가된 Disk에 Physical Volume 생성&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# pvcreate /dev/mapper/mpathc&lt;br /&gt;&lt;/span&gt;Physical volume &lt;span style=&quot;color: #cd9069;&quot;&gt;&quot;/dev/mapper/mpathc&quot; &lt;/span&gt;successfully created.&lt;br /&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# pvcreate /dev/mapper/mpathd&lt;br /&gt;&lt;/span&gt;Physical volume &lt;span style=&quot;color: #cd9069;&quot;&gt;&quot;/dev/mapper/mpathd&quot; &lt;/span&gt;successfully created.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;3. 기존 Volume Group 에 PV(Physical Volume) 추가&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# pvs&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #699856;&quot;&gt; &lt;/span&gt;PV VG Fmt Attr PSize PFree&lt;br /&gt;/dev/mapper/mpathc tvg lvm2 a-- &amp;lt;&lt;span style=&quot;color: #b4cda8;&quot;&gt;100.00&lt;/span&gt;g &lt;span style=&quot;color: #b4cda8;&quot;&gt;0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b4cda8;&quot;&gt; &lt;/span&gt;/dev/mapper/mpathd lvm2 --- &lt;span style=&quot;color: #b4cda8;&quot;&gt;100.00&lt;/span&gt;g &lt;span style=&quot;color: #b4cda8;&quot;&gt;100.00&lt;/span&gt;g&lt;br /&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# vgextend tvg /dev/mapper/mpathd&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# pvs&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #699856;&quot;&gt; &lt;/span&gt;PV VG Fmt Attr PSize PFree&lt;br /&gt;/dev/mapper/mpathc tvg lvm2 a-- &amp;lt;&lt;span style=&quot;color: #b4cda8;&quot;&gt;100.00&lt;/span&gt;g &lt;span style=&quot;color: #b4cda8;&quot;&gt;0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b4cda8;&quot;&gt; &lt;/span&gt;/dev/mapper/mpathd tvg lvm2 a-- &amp;lt;&lt;span style=&quot;color: #b4cda8;&quot;&gt;100.00&lt;/span&gt;g &amp;lt;&lt;span style=&quot;color: #b4cda8;&quot;&gt;100.00&lt;/span&gt;g&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;4. Volume Group 의 전체 Free size를 lv에 추가 할당&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# lvextend -l +100%FREE /dev/mapper/tvg-testlv&lt;br /&gt;&lt;/span&gt;Size of logical volume tvg/testlv changed &lt;span style=&quot;color: #499cd5;&quot;&gt;from &lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #b4cda8;&quot;&gt;100.00 &lt;/span&gt;&lt;span style=&quot;color: #dbdbaa;&quot;&gt;GiB &lt;/span&gt;(&lt;span style=&quot;color: #b4cda8;&quot;&gt;25599 &lt;/span&gt;extents) to &lt;span style=&quot;color: #b4cda8;&quot;&gt;199.99 &lt;/span&gt;&lt;span style=&quot;color: #dbdbaa;&quot;&gt;GiB &lt;/span&gt;(&lt;span style=&quot;color: #b4cda8;&quot;&gt;51198 &lt;/span&gt;extents).&lt;br /&gt;Logical volume tvg/testlv successfully resized.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;5. Filesystem&amp;nbsp;size(XFS)&amp;nbsp;increase&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# df -h /test&lt;br /&gt;&lt;/span&gt;Filesystem Size Used Avail Use% Mounted on&lt;br /&gt;/dev/mapper/tvg-testlv &lt;span style=&quot;color: #b4cda8;&quot;&gt;100&lt;/span&gt;G &lt;span style=&quot;color: #b4cda8;&quot;&gt;746&lt;/span&gt;M &lt;span style=&quot;color: #b4cda8;&quot;&gt;100&lt;/span&gt;G &lt;span style=&quot;color: #b4cda8;&quot;&gt;1&lt;/span&gt;% /test&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# xfs_growfs /test&lt;br /&gt;&lt;/span&gt;ext4&lt;span&gt;인 경우 &lt;/span&gt;resize2fs &lt;span&gt;명령어 사용&lt;/span&gt;.&lt;br /&gt;&lt;span style=&quot;color: #699856;&quot;&gt;# df -h /test&lt;br /&gt;&lt;/span&gt;Filesystem Size Used Avail Use% Mounted on&lt;br /&gt;/dev/mapper/tvg-testlv &lt;span style=&quot;color: #b4cda8;&quot;&gt;200&lt;/span&gt;G &lt;span style=&quot;color: #b4cda8;&quot;&gt;1.5&lt;/span&gt;G &lt;span style=&quot;color: #b4cda8;&quot;&gt;199&lt;/span&gt;G &lt;span style=&quot;color: #b4cda8;&quot;&gt;1&lt;/span&gt;% /test&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1e1e; color: #d4d4d4;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Linux</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/33</guid>
      <comments>https://nick2ya.tistory.com/33#entry33comment</comments>
      <pubDate>Thu, 21 Nov 2024 22:45:08 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 FC Adapter LVM 생성 및 관리 (VG 신규 생성)</title>
      <link>https://nick2ya.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;리눅스 서버 운영 시 서비스가 기동되는 영역의 경우 성능 및 효율적인 운영을 위해 FC Adapter 를 통해 Storage와 연결하여 Filesystem을 생성하여 운영합니다.&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: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;아래는 FC Adapter를 통한 LVM 생성(VG 신규) 및 관리 순서를 정리한 내역입니다.&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;i&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;lt; 리눅스 LVM 구성 순서 &amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;- Disk 인식&lt;br /&gt;&amp;nbsp;- Physical Volume(PV) 생성 (multipath device는 multipath device에 PV 생성)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&amp;nbsp;- Volume Group(VG) 생성&lt;br /&gt;&amp;nbsp;- Logical Volume(LV) 생성&lt;br /&gt;&amp;nbsp;- Filesystem 생성&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;1. Linux에서 FC Adapter(HBA)의 Link 상태 및 wwpn 확인&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# ls /sys/class/fc_host/&lt;br /&gt;&lt;/span&gt;host12&amp;nbsp; host14&lt;br /&gt;- Link &lt;span&gt;상태&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# cat /sys/class/fc_host/host12/port_state&lt;br /&gt;&lt;/span&gt;Online&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# cat /sys/class/fc_host/host14/port_state&lt;br /&gt;&lt;/span&gt;Online&lt;br /&gt;&lt;br /&gt;- wwpn &lt;span&gt;확인&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# cat /sys/class/fc_host/host12/port_name&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;0x21000024ff1e483f&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# cat /sys/class/fc_host/host14/port_name&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;0x21000024ff41c3c3&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;&lt;br /&gt;&lt;/span&gt;- Linux&lt;span&gt;에서 추가된 &lt;/span&gt;FC disk &lt;span&gt;인식&lt;/span&gt;(online)&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# echo 1 &amp;gt; /sys/class/fc_host/host12/issue_lip&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# echo 1 &amp;gt; /sys/class/fc_host/host14/issue_lip&lt;br /&gt;&lt;/span&gt;cat /proc/partitions &lt;span&gt;및 &lt;/span&gt;multipath -ll &lt;span&gt;로 추가된 &lt;/span&gt;disk &lt;span&gt;확인&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;2. 추가된 Disk에 Physical Volume 생성&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# pvcreate /dev/mapper/mpathc&lt;br /&gt;&lt;/span&gt;Physical volume &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/dev/mapper/mpathc&quot; &lt;/span&gt;successfully created.&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# pvcreate /dev/mapper/mpathd&lt;br /&gt;&lt;/span&gt;Physical volume &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/dev/mapper/mpathd&quot; &lt;/span&gt;successfully created.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;3. Volume Group 생성&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# vgcreate tvg /dev/mapper/mapthc&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;4. Logical Volume 생성&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# lvcreate -L 100G -n testlv tvg&lt;br /&gt;&lt;/span&gt;&lt;span&gt;또는 &lt;/span&gt;VG&lt;span&gt;의 전체 &lt;/span&gt;free space&lt;span&gt;를 이용해 &lt;/span&gt;LV&lt;span&gt;를 생성하려면 아래와 같이 진행.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# lvcreate -l 100%FREE -n testlv tvg&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;5. Filesystem 생성 및 Mount&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# mkfs.xfs /dev/mapper/tvg-testlv (vgname-lvname)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# mkdir /test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# mount /dev/mapper/tvg-testlv /test&lt;br /&gt;&lt;/span&gt;(&lt;span&gt;시스템 재부팅후 자동으로 &lt;/span&gt;mount&lt;span&gt;되게 하기위해 &lt;/span&gt;/etc/fstab&lt;span&gt;에 등록&lt;/span&gt;)&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;6. Filesystem Mount 확인&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# df -h /test&lt;br /&gt;&lt;/span&gt;Filesystem Size Used Avail Use% Mounted on&lt;br /&gt;/dev/mapper/tvg-testlv &lt;span style=&quot;color: #2aacb8;&quot;&gt;200&lt;/span&gt;G &lt;span style=&quot;color: #2aacb8;&quot;&gt;1.5&lt;/span&gt;G &lt;span style=&quot;color: #2aacb8;&quot;&gt;199&lt;/span&gt;G &lt;span style=&quot;color: #2aacb8;&quot;&gt;1&lt;/span&gt;% /test&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;7. 삭제 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Filesystem Umount&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# umount /test&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Volume Group deactive 및 Export&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# vgchange -a n tvg&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# vgexport tvg&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;3) Multipath Device 삭제&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# multipath -f mpathX&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&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;&lt;b&gt;4) sdx Device 삭제&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# echo 1 &amp;gt; /sys/block/sdh/device/delete&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;삭제한 &lt;/span&gt;multipath device&lt;span&gt;에 대한 정보는 아래 2개&amp;nbsp;&lt;/span&gt;파일&lt;span&gt;에 남이 있으며,&lt;/span&gt;&amp;nbsp;&lt;span&gt;완벽하게 삭제를 하려면 아래 2개 파일을 수정하고 &lt;/span&gt;multipathd&lt;span&gt;를 재시작 해주시면 됩니다.&lt;/span&gt;&lt;br /&gt;/etc/multipath/bindings&lt;br /&gt;/etc/multipath/wwids&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;# systemctl restart multipathd&lt;br /&gt;&lt;/span&gt;multipath service &lt;span&gt;재시작&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Linux</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/32</guid>
      <comments>https://nick2ya.tistory.com/32#entry32comment</comments>
      <pubDate>Thu, 21 Nov 2024 22:28:29 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 리눅스 환경에서 파이썬 배포파일 만들기</title>
      <link>https://nick2ya.tistory.com/31</link>
      <description>&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;이 전에 공유해 드린 Windows 환경에서와 같이 리눅스 환경에서도 pyinstaller 를 통해 배포파일을 생성하는 방법을 알아 보도록 하겠습니다.&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 style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;[root@instance1 dist]&lt;span style=&quot;color: #7a7e85;&quot;&gt;# uname -a&lt;br /&gt;&lt;/span&gt;Linux instance1 &lt;span style=&quot;color: #2aacb8;&quot;&gt;4.18.0&lt;/span&gt;-&lt;span style=&quot;color: #2aacb8;&quot;&gt;408.&lt;/span&gt;el8.x86_64 &lt;span style=&quot;color: #7a7e85;&quot;&gt;#1 SMP Mon Jul 18 17:42:52 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;&lt;br /&gt;&lt;/span&gt;[root@instance1 tmp]&lt;span style=&quot;color: #7a7e85;&quot;&gt;# cat /etc/*release&lt;br /&gt;&lt;/span&gt;CentOS Stream release &lt;span style=&quot;color: #2aacb8;&quot;&gt;8&lt;br /&gt;&lt;/span&gt;NAME=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;CentOS Stream&quot;&lt;br /&gt;&lt;/span&gt;VERSION=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;8&quot;&lt;br /&gt;&lt;/span&gt;ID=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;centos&quot;&lt;br /&gt;&lt;/span&gt;ID_LIKE=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;rhel fedora&quot;&lt;br /&gt;&lt;/span&gt;VERSION_ID=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;8&quot;&lt;br /&gt;&lt;/span&gt;PLATFORM_ID=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;platform:el8&quot;&lt;br /&gt;&lt;/span&gt;PRETTY_NAME=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;CentOS Stream 8&quot;&lt;br /&gt;&lt;/span&gt;ANSI_COLOR=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;0;31&quot;&lt;br /&gt;&lt;/span&gt;CPE_NAME=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;cpe:/o:centos:centos:8&quot;&lt;br /&gt;&lt;/span&gt;HOME_URL=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;&lt;a href=&quot;https://centos.org/&quot;&gt;https://centos.org/&lt;/a&gt;&quot;&lt;br /&gt;&lt;/span&gt;BUG_REPORT_URL=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;&lt;a href=&quot;https://bugzilla.redhat.com/&quot;&gt;https://bugzilla.redhat.com/&lt;/a&gt;&quot;&lt;br /&gt;&lt;/span&gt;REDHAT_SUPPORT_PRODUCT=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Red Hat Enterprise Linux 8&quot;&lt;br /&gt;&lt;/span&gt;REDHAT_SUPPORT_PRODUCT_VERSION=&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;CentOS Stream&quot;&lt;br /&gt;&lt;/span&gt;CentOS Stream release &lt;span style=&quot;color: #2aacb8;&quot;&gt;8&lt;br /&gt;&lt;/span&gt;CentOS Stream release &lt;span style=&quot;color: #2aacb8;&quot;&gt;8&lt;br /&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;가장 먼저 pip3 를 통해 pyinstaller 를 설치해 줍니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;[root@instance1 tmp]&lt;span style=&quot;color: #7a7e85;&quot;&gt;# pip3 install pyinstaller==3.6&lt;br /&gt;&lt;/span&gt;WARNING: Running pip install &lt;span style=&quot;color: #cf8e6d;&quot;&gt;with &lt;/span&gt;root privileges &lt;span style=&quot;color: #cf8e6d;&quot;&gt;is &lt;/span&gt;generally &lt;span style=&quot;color: #cf8e6d;&quot;&gt;not &lt;/span&gt;a good idea. Try `pip3 install --user` instead.&lt;br /&gt;Collecting pyinstaller==&lt;span style=&quot;color: #2aacb8;&quot;&gt;3.6&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt; &lt;/span&gt;Downloading &lt;a href=&quot;https://files.pythonhosted.org/packages/&quot;&gt;https://files.pythonhosted.org/packages/&lt;/a&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;3&lt;/span&gt;c/c9/c3f9bc64eb11eee6a824686deba6129884c8cbdf70e750661773b9865ee0/PyInstaller-&lt;span style=&quot;color: #2aacb8;&quot;&gt;3.6&lt;/span&gt;.tar.gz (&lt;span style=&quot;color: #2aacb8;&quot;&gt;3.5&lt;/span&gt;MB)&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;100&lt;/span&gt;% |████████████████████████████████| &lt;span style=&quot;color: #2aacb8;&quot;&gt;3.5&lt;/span&gt;MB &lt;span style=&quot;color: #2aacb8;&quot;&gt;91&lt;/span&gt;kB/s&lt;br /&gt;Requirement already satisfied: setuptools &lt;span style=&quot;color: #cf8e6d;&quot;&gt;in &lt;/span&gt;/usr/lib/python3&lt;span style=&quot;color: #2aacb8;&quot;&gt;.6&lt;/span&gt;/site-packages (&lt;span style=&quot;color: #cf8e6d;&quot;&gt;from &lt;/span&gt;pyinstaller==&lt;span style=&quot;color: #2aacb8;&quot;&gt;3.6&lt;/span&gt;)&lt;br /&gt;Requirement already satisfied: altgraph &lt;span style=&quot;color: #cf8e6d;&quot;&gt;in &lt;/span&gt;/usr/local/lib/python3&lt;span style=&quot;color: #2aacb8;&quot;&gt;.6&lt;/span&gt;/site-packages (&lt;span style=&quot;color: #cf8e6d;&quot;&gt;from &lt;/span&gt;pyinstaller==&lt;span style=&quot;color: #2aacb8;&quot;&gt;3.6&lt;/span&gt;)&lt;br /&gt;Building wheels &lt;span style=&quot;color: #cf8e6d;&quot;&gt;for &lt;/span&gt;collected packages: pyinstaller&lt;br /&gt;Running setup.py bdist_wheel &lt;span style=&quot;color: #cf8e6d;&quot;&gt;for &lt;/span&gt;pyinstaller ... done&lt;br /&gt;Stored &lt;span style=&quot;color: #cf8e6d;&quot;&gt;in &lt;/span&gt;directory: /root/.cache/pip/wheels/&lt;span style=&quot;color: #2aacb8;&quot;&gt;62&lt;/span&gt;/fe/&lt;span style=&quot;color: #2aacb8;&quot;&gt;62&lt;/span&gt;/&lt;span style=&quot;color: #2aacb8;&quot;&gt;4&lt;/span&gt;c0f196d1e0dd689e097449bc81d7d585a7de7dd86b081b80b&lt;br /&gt;Successfully built pyinstaller&lt;br /&gt;Installing collected packages: pyinstaller&lt;br /&gt;Successfully installed pyinstaller-&lt;span style=&quot;color: #2aacb8;&quot;&gt;3.6&lt;br /&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;그리고 pyinstaller 를 통해 배포 파일을 만들어 주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;# pyinstaller -F .py파일 (-F : 하나의 파일로 생성해 주는 옵션, --onefile 옵션 동일.)&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;[root@instance1 tmp]&lt;span style=&quot;color: #7a7e85;&quot;&gt;# pyinstaller -F test.py&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;171 &lt;/span&gt;INFO: PyInstaller: &lt;span style=&quot;color: #2aacb8;&quot;&gt;3.6&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;172 &lt;/span&gt;INFO: Python: &lt;span style=&quot;color: #2aacb8;&quot;&gt;3.6.8&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;172 &lt;/span&gt;INFO: Platform: Linux-&lt;span style=&quot;color: #2aacb8;&quot;&gt;4.18.0&lt;/span&gt;-&lt;span style=&quot;color: #2aacb8;&quot;&gt;408.&lt;/span&gt;el8.x86_64-x86_64-&lt;span style=&quot;color: #cf8e6d;&quot;&gt;with&lt;/span&gt;-centos-&lt;span style=&quot;color: #2aacb8;&quot;&gt;8&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;173 &lt;/span&gt;INFO: wrote /tmp/test.spec&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;175 &lt;/span&gt;INFO: UPX &lt;span style=&quot;color: #cf8e6d;&quot;&gt;is not &lt;/span&gt;available.&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;176 &lt;/span&gt;INFO: Extending PYTHONPATH &lt;span style=&quot;color: #cf8e6d;&quot;&gt;with &lt;/span&gt;paths&lt;br /&gt;[&lt;span style=&quot;color: #6aab73;&quot;&gt;'/tmp'&lt;/span&gt;, &lt;span style=&quot;color: #6aab73;&quot;&gt;'/tmp'&lt;/span&gt;]&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;176 &lt;/span&gt;INFO: checking Analysis&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;177 &lt;/span&gt;INFO: Building Analysis because Analysis-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;toc &lt;span style=&quot;color: #cf8e6d;&quot;&gt;is &lt;/span&gt;non existent&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;177 &lt;/span&gt;INFO: Initializing module dependency graph...&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;179 &lt;/span&gt;INFO: Caching module graph hooks...&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;184 &lt;/span&gt;INFO: Analyzing base_library.zip ...&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;9885 &lt;/span&gt;INFO: Caching module dependency graph...&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;10288 &lt;/span&gt;INFO: running Analysis Analysis-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;toc&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;10478 &lt;/span&gt;INFO: Analyzing /tmp/test.py&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;10483 &lt;/span&gt;INFO: Processing module hooks...&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;10483 &lt;/span&gt;INFO: Loading module hook &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;hook-encodings.py&quot;&lt;/span&gt;...&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;10780 &lt;/span&gt;INFO: Loading module hook &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;hook-pydoc.py&quot;&lt;/span&gt;...&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;10782 &lt;/span&gt;INFO: Loading module hook &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;hook-xml.py&quot;&lt;/span&gt;...&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;12070 &lt;/span&gt;INFO: Looking &lt;span style=&quot;color: #cf8e6d;&quot;&gt;for &lt;/span&gt;ctypes DLLs&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;12070 &lt;/span&gt;INFO: Analyzing run-time hooks ...&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;12078 &lt;/span&gt;INFO: Looking &lt;span style=&quot;color: #cf8e6d;&quot;&gt;for &lt;/span&gt;dynamic libraries&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;13693 &lt;/span&gt;INFO: Looking &lt;span style=&quot;color: #cf8e6d;&quot;&gt;for &lt;/span&gt;eggs&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;13693 &lt;/span&gt;INFO: Using Python library /lib64/libpython3&lt;span style=&quot;color: #2aacb8;&quot;&gt;.6&lt;/span&gt;m.so&lt;span style=&quot;color: #2aacb8;&quot;&gt;.1.0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;13697 &lt;/span&gt;INFO: Warnings written to /tmp/build/test/warn-test.txt&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;13782 &lt;/span&gt;INFO: Graph cross-reference written to /tmp/build/test/xref-test.html&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;13888 &lt;/span&gt;INFO: checking PYZ&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;13888 &lt;/span&gt;INFO: Building PYZ because PYZ-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;toc &lt;span style=&quot;color: #cf8e6d;&quot;&gt;is &lt;/span&gt;non existent&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;13888 &lt;/span&gt;INFO: Building PYZ (ZlibArchive) /tmp/build/test/PYZ-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;pyz&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;15681 &lt;/span&gt;INFO: Building PYZ (ZlibArchive) /tmp/build/test/PYZ-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;pyz completed successfully.&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;15684 &lt;/span&gt;INFO: checking PKG&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;15684 &lt;/span&gt;INFO: Building PKG because PKG-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;toc &lt;span style=&quot;color: #cf8e6d;&quot;&gt;is &lt;/span&gt;non existent&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;15684 &lt;/span&gt;INFO: Building PKG (CArchive) PKG-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;pkg&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;26294 &lt;/span&gt;INFO: Building PKG (CArchive) PKG-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;pkg completed successfully.&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;26297 &lt;/span&gt;INFO: Bootloader /usr/local/lib64/python3&lt;span style=&quot;color: #2aacb8;&quot;&gt;.6&lt;/span&gt;/site-packages/PyInstaller/bootloader/Linux-&lt;span style=&quot;color: #2aacb8;&quot;&gt;64&lt;/span&gt;bit/run&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;26297 &lt;/span&gt;INFO: checking EXE&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;26297 &lt;/span&gt;INFO: Building EXE because EXE-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;toc &lt;span style=&quot;color: #cf8e6d;&quot;&gt;is &lt;/span&gt;non existent&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;26297 &lt;/span&gt;INFO: Building EXE &lt;span style=&quot;color: #cf8e6d;&quot;&gt;from &lt;/span&gt;EXE-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;toc&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;26297 &lt;/span&gt;INFO: Appending archive to ELF section &lt;span style=&quot;color: #cf8e6d;&quot;&gt;in &lt;/span&gt;EXE /tmp/dist/test&lt;br /&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;26445 &lt;/span&gt;INFO: Building EXE &lt;span style=&quot;color: #cf8e6d;&quot;&gt;from &lt;/span&gt;EXE-&lt;span style=&quot;color: #2aacb8;&quot;&gt;00.&lt;/span&gt;toc completed successfully.&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와 동일하게 dist 디렉토리에 생성되며, 배포파일을 실행시켜보면 정상적으로 실행 되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #1e1f22; color: #bcbec4;&quot; data-ke-size=&quot;size14&quot;&gt;[root@instance1 tmp]&lt;span style=&quot;color: #7a7e85;&quot;&gt;# cd ./dist/&lt;br /&gt;&lt;/span&gt;[root@instance1 dist]&lt;span style=&quot;color: #7a7e85;&quot;&gt;# ls -l&lt;br /&gt;&lt;/span&gt;total &lt;span style=&quot;color: #2aacb8;&quot;&gt;6152&lt;br /&gt;&lt;/span&gt;-rwxr-xr-x. &lt;span style=&quot;color: #2aacb8;&quot;&gt;1 &lt;/span&gt;root root &lt;span style=&quot;color: #2aacb8;&quot;&gt;6298912 &lt;/span&gt;Nov &lt;span style=&quot;color: #2aacb8;&quot;&gt;4 00&lt;/span&gt;:&lt;span style=&quot;color: #2aacb8;&quot;&gt;19 &lt;/span&gt;test&lt;br /&gt;[root@instance1 dist]&lt;span style=&quot;color: #7a7e85;&quot;&gt;# ./test&lt;br /&gt;&lt;/span&gt;CentOS Stream release &lt;span style=&quot;color: #2aacb8;&quot;&gt;8&lt;/span&gt;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/31</guid>
      <comments>https://nick2ya.tistory.com/31#entry31comment</comments>
      <pubDate>Sat, 4 Nov 2023 00:37:25 +0900</pubDate>
    </item>
    <item>
      <title>[Windows] 메모리 관리 맛보기</title>
      <link>https://nick2ya.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Windows에서&amp;nbsp;관리되는&amp;nbsp;메모리&amp;nbsp;기법에&amp;nbsp;대해&amp;nbsp;간략히&amp;nbsp;알아&amp;nbsp;보도록&amp;nbsp;하겠습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.&amp;nbsp;메모리&amp;nbsp;관리&amp;nbsp;기법&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;Windows의&amp;nbsp;경우&amp;nbsp;가상메모리&amp;nbsp;관리&amp;nbsp;기법&amp;nbsp;사용합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;Virtual&amp;nbsp;Memory&lt;/b&gt; &lt;br /&gt;&amp;nbsp;-&amp;nbsp;물리&amp;nbsp;메모리&amp;nbsp;크기의&amp;nbsp;한계를&amp;nbsp;극복하기&amp;nbsp;위해&amp;nbsp;나온&amp;nbsp;메모리&amp;nbsp;관리&amp;nbsp;기법으로,&amp;nbsp;물리메모리+Disk&amp;nbsp;Swap&amp;nbsp;영역을&amp;nbsp;합쳐&amp;nbsp;가상&amp;nbsp;메모리&amp;nbsp;영역으로&amp;nbsp;관리. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;OS에서는&amp;nbsp;개별&amp;nbsp;프로세스에&amp;nbsp;메모리&amp;nbsp;할당&amp;nbsp;시&amp;nbsp;물리메모리&amp;nbsp;주소공간을&amp;nbsp;할당하지&amp;nbsp;않고&amp;nbsp;가상메모리&amp;nbsp;주소&amp;nbsp;공간을&amp;nbsp;할당. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;가상메모리는&amp;nbsp;4KB&amp;nbsp;단위&amp;nbsp;블록으로&amp;nbsp;나눈&amp;nbsp;Page&amp;nbsp;단위로&amp;nbsp;관리하고,&amp;nbsp;물리메모리&amp;nbsp;역시&amp;nbsp;가상메모리와&amp;nbsp;맞추기&amp;nbsp;위해&amp;nbsp;4KB&amp;nbsp;단위&amp;nbsp;블록으로&amp;nbsp;나눈&amp;nbsp;Page&amp;nbsp;Fram&amp;nbsp;단위로&amp;nbsp;관리. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Page는&amp;nbsp;가상메모리를&amp;nbsp;같은&amp;nbsp;크기의&amp;nbsp;블록(보통&amp;nbsp;4KB)으로&amp;nbsp;나눈&amp;nbsp;것을&amp;nbsp;의미하며,&amp;nbsp;Frame(Page&amp;nbsp;Frame)은&amp;nbsp;물리&amp;nbsp;메모리를&amp;nbsp;Page와&amp;nbsp;같은&amp;nbsp;크기로&amp;nbsp;나눈&amp;nbsp;것을&amp;nbsp;의미. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;가상&amp;nbsp;메모리&amp;nbsp;주소&amp;nbsp;공간과&amp;nbsp;물리&amp;nbsp;메모리&amp;nbsp;주소&amp;nbsp;공간의&amp;nbsp;맵핑(mapping)&amp;nbsp;정보는&amp;nbsp;Page&amp;nbsp;Table&amp;nbsp;을&amp;nbsp;통해&amp;nbsp;관리되며,&amp;nbsp;Page&amp;nbsp;Table에&amp;nbsp;없는&amp;nbsp;주소&amp;nbsp;공간&amp;nbsp;참조시&amp;nbsp;page&amp;nbsp;fault&amp;nbsp;가&amp;nbsp;발생. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;가상&amp;nbsp;메모리와&amp;nbsp;물리&amp;nbsp;메모리&amp;nbsp;사이&amp;nbsp;이동은&amp;nbsp;page&amp;nbsp;단위이며,&amp;nbsp;이때&amp;nbsp;page&amp;nbsp;in/out&amp;nbsp;이&amp;nbsp;발생. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;당장&amp;nbsp;실행해야&amp;nbsp;하는&amp;nbsp;프로세스&amp;nbsp;전체를&amp;nbsp;물리메모리에&amp;nbsp;두고,&amp;nbsp;당장&amp;nbsp;실행할&amp;nbsp;필요가&amp;nbsp;없는&amp;nbsp;프로세스는&amp;nbsp;Swap&amp;nbsp;영역에&amp;nbsp;할당하여&amp;nbsp;Virtual&amp;nbsp;Memory&amp;nbsp;공간을&amp;nbsp;관리. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Commit&lt;/b&gt; &lt;br /&gt;&amp;nbsp;-&amp;nbsp;가상메모리로부터&amp;nbsp;각각의&amp;nbsp;프로세스들이&amp;nbsp;&quot;난&amp;nbsp;이&amp;nbsp;정도의&amp;nbsp;메모리를&amp;nbsp;쓸&amp;nbsp;겁니다.&amp;nbsp;쓸지&amp;nbsp;안쓸지&amp;nbsp;모르겠지만&amp;nbsp;이&amp;nbsp;정도의&amp;nbsp;지분을&amp;nbsp;주세요&quot;&amp;nbsp;라고&amp;nbsp;OS&amp;nbsp;에&amp;nbsp;요청한&amp;nbsp;메모리의&amp;nbsp;총량입니다. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;실제로&amp;nbsp;이&amp;nbsp;커밋된&amp;nbsp;메모리가&amp;nbsp;실제&amp;nbsp;메모리&amp;nbsp;용량보다&amp;nbsp;커지면&amp;nbsp;그때부터&amp;nbsp;OS는&amp;nbsp;가상메모리&amp;nbsp;및&amp;nbsp;가용&amp;nbsp;가능한&amp;nbsp;모든&amp;nbsp;메모리를&amp;nbsp;쥐어짜내기&amp;nbsp;시작하며,&amp;nbsp;총량이&amp;nbsp;설치된&amp;nbsp;메모리보다&amp;nbsp;큰&amp;nbsp;이유는&amp;nbsp;OS가&amp;nbsp;가용가능한&amp;nbsp;모든&amp;nbsp;메모리를(ex,&amp;nbsp;가상메모리)&amp;nbsp;포함하기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&amp;nbsp;Cache&lt;/b&gt; &lt;br /&gt;&amp;nbsp;-&amp;nbsp;현재&amp;nbsp;메모리에&amp;nbsp;올라가&amp;nbsp;있지만&amp;nbsp;Active&amp;nbsp;되어&amp;nbsp;있지&amp;nbsp;않은&amp;nbsp;데이터의&amp;nbsp;총량입니다. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;즉,&amp;nbsp;프로세스의&amp;nbsp;호출이&amp;nbsp;있으면&amp;nbsp;언제든지&amp;nbsp;빠른&amp;nbsp;속도로&amp;nbsp;가져올&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;데이터라는&amp;nbsp;의미이며,&amp;nbsp;절전모드시엔&amp;nbsp;state에&amp;nbsp;따라&amp;nbsp;다르지만&amp;nbsp;지워질&amp;nbsp;수도&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&amp;nbsp;Paged&lt;/b&gt; &lt;br /&gt;&amp;nbsp;-&amp;nbsp;가상메모리(물리메모리+페이징파일)영역에서&amp;nbsp;실제&amp;nbsp;메모리에서&amp;nbsp;제거되어&amp;nbsp;페이징&amp;nbsp;파일에&amp;nbsp;기록될(Page-Out)&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;반대로&amp;nbsp;페이징&amp;nbsp;파일에서&amp;nbsp;실제&amp;nbsp;메모리&amp;nbsp;영역으로&amp;nbsp;올라올(Page-In)&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;영역입니다. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;즉,&amp;nbsp;가상메모리&amp;nbsp;공간중&amp;nbsp;Paging&amp;nbsp;In-Out이&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;공간을&amp;nbsp;의미. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;페이징&amp;nbsp;풀&amp;nbsp;메모리는&amp;nbsp;윈도우&amp;nbsp;운영체제와&amp;nbsp;장치&amp;nbsp;드라이버가&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;따로&amp;nbsp;비축한&amp;nbsp;메모리입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. Non-Paged&lt;/b&gt; &lt;br /&gt;&amp;nbsp;-&amp;nbsp;가상메모리(물리메모리+페이징파일)영역에서&amp;nbsp;실제&amp;nbsp;메모리&amp;nbsp;영역에만&amp;nbsp;할당되어&amp;nbsp;사용되는&amp;nbsp;영역으로&amp;nbsp;Paging&amp;nbsp;in-Out&amp;nbsp;발생하지&amp;nbsp;않는&amp;nbsp;영역을&amp;nbsp;의미합니다. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Windows에서&amp;nbsp;내부적으로&amp;nbsp;시스템이&amp;nbsp;사용하려는&amp;nbsp;메모리&amp;nbsp;공간을&amp;nbsp;제한되게&amp;nbsp;확보하는&amp;nbsp;것들이&amp;nbsp;있는데,&amp;nbsp;그&amp;nbsp;중에서&amp;nbsp;하나가&amp;nbsp;Non-Paged&amp;nbsp;Pool이다.&amp;nbsp;Non-Paged&amp;nbsp;Pool&amp;nbsp;메모리는&amp;nbsp;물리&amp;nbsp;메모리에만&amp;nbsp;할당&amp;nbsp;되는&amp;nbsp;것으로,&amp;nbsp;페이지&amp;nbsp;폴트가&amp;nbsp;없이&amp;nbsp;접근하기&amp;nbsp;위한&amp;nbsp;메모리&amp;nbsp;영역입니다. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;하지만&amp;nbsp;이런&amp;nbsp;장점에도&amp;nbsp;불구하고&amp;nbsp;몇몇&amp;nbsp;잘못된&amp;nbsp;드라이버나&amp;nbsp;프로그램들이&amp;nbsp;Non-Paged&amp;nbsp;Pool에&amp;nbsp;할당되는&amp;nbsp;데이터를&amp;nbsp;남용해서&amp;nbsp;문제가&amp;nbsp;생기곤&amp;nbsp;합니다. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;Non-Paged가&amp;nbsp;주로&amp;nbsp;수치가&amp;nbsp;높게&amp;nbsp;형성되는&amp;nbsp;이유에는&amp;nbsp;장치드라이버&amp;nbsp;및&amp;nbsp;악성코드&amp;nbsp;등으로&amp;nbsp;인한&amp;nbsp;경우가&amp;nbsp;많습니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>OS/Windows</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/30</guid>
      <comments>https://nick2ya.tistory.com/30#entry30comment</comments>
      <pubDate>Fri, 3 Nov 2023 17:58:38 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] Unix/Linux 메모리 관리 맛보기</title>
      <link>https://nick2ya.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Unix/Linux OS별로 메모리를 관리하는 방식에 대해 간략히 알아 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;Linux&lt;/b&gt; &lt;br /&gt;1)&amp;nbsp;메모리&amp;nbsp;할당&amp;nbsp;방식 &lt;br /&gt;&amp;nbsp;-&amp;nbsp;리눅스는&amp;nbsp;여유&amp;nbsp;메모리를&amp;nbsp;캐쉬&amp;nbsp;영역으로&amp;nbsp;사용하려고&amp;nbsp;하는&amp;nbsp;습성이&amp;nbsp;있습니다. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;이유는&amp;nbsp;여유&amp;nbsp;메모리를&amp;nbsp;최대한&amp;nbsp;캐쉬영역으로&amp;nbsp;활용하면&amp;nbsp;성능향상에&amp;nbsp;도움이&amp;nbsp;되기&amp;nbsp;때문입니다. &lt;br /&gt;&amp;nbsp;-&amp;nbsp;커널&amp;nbsp;2.6부터는&amp;nbsp;이&amp;nbsp;부분에&amp;nbsp;대해&amp;nbsp;제한을&amp;nbsp;두게&amp;nbsp;되며,(#cat&amp;nbsp;/proc/sys/vm/swappiness)&amp;nbsp;기본적으로&amp;nbsp;60%로&amp;nbsp;설정되어&amp;nbsp;있어서&amp;nbsp;물리&amp;nbsp;메모리&amp;nbsp;사용률이&amp;nbsp;해당&amp;nbsp;값&amp;nbsp;이상으로&amp;nbsp;사용되면&amp;nbsp;Swapping을&amp;nbsp;하기&amp;nbsp;시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 참조사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Linux 의 경우 Filecache영역이 큰경우 Used+Filecache 사용률이 100% 가까이 발생할 수 있는데, 이는 리눅스가 자체적으로 유휴 공간을 Cache 영역으로 잡아두어 최대한 Cache를 활용하여 성능향상을 하기위함 입니다.&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;br /&gt;&lt;b&gt;2. AIX&lt;/b&gt; &lt;br /&gt;1)&amp;nbsp;메모리&amp;nbsp;할당&amp;nbsp;방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- AIX 의 경우 Comp(연산)와 Noncomp(Filecache) 영역으로나누며, 메모리 사용률이 100%가까이&amp;nbsp;&amp;nbsp;나타날 수 있는데 이유는 물리적인 메모리를 100% 사용할 수 있도록 구성되어 있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 즉, Comp영역을 제외하고 나마지 영역은 Noncomp 영역으로 할당 되어 사용되고, Comp영역에서 메모리가 필요하게 되면 Noncomp 영역을에서 가져와 사용하도록 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 해서 AIX에서 메모리 병복의 기준은 Pagingspace Activity로 판단하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- SUN과 다르게 미리 Reserved영역을 할당하지 않고, Deferred형태로 동작합니다.&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)&amp;nbsp;메모리&amp;nbsp;관리 &lt;br /&gt;&amp;nbsp;가)&amp;nbsp;Comp &lt;br /&gt;&amp;nbsp;-&amp;nbsp;CPU에&amp;nbsp;의해&amp;nbsp;동작하는&amp;nbsp;프로세스들이&amp;nbsp;사용하는&amp;nbsp;메모리&amp;nbsp;사용률. &lt;br /&gt;&amp;nbsp;나)&amp;nbsp;NonComp &lt;br /&gt;&amp;nbsp;-&amp;nbsp;파일쪽&amp;nbsp;I/O작업시&amp;nbsp;사용하기&amp;nbsp;위해&amp;nbsp;캐시로&amp;nbsp;돌려놓은&amp;nbsp;메모리&amp;nbsp;사용률. &lt;br /&gt;&amp;nbsp;- 즉, Disk I/O 성능 향상을 위해 File Cache로 사용되는 영역을 의미.&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)&amp;nbsp;참조사항 &lt;br /&gt;&amp;nbsp;- CPU에 의해 계산되는 작업이 많으면 Comp사용률이 높아지고, 파일쪽에서 메모리에 올려놓은 작업이 많으면 NonComp사용률이 높아집니다.&lt;br /&gt;&amp;nbsp;- Comp와 NonComp 합친값이 100을 사용하되, PagingSpace값이 올라가지 않을때 가장 적당한 Memory를 사용하고 있는 것이고, 지속적으로 Paging이 일어나면 메모리 부족으로 간주합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&amp;nbsp;HP-UX&lt;/b&gt; &lt;br /&gt;1)&amp;nbsp;메모리&amp;nbsp;할당&amp;nbsp;방식 &lt;br /&gt;&amp;nbsp;- HP의 메모리 할당 정책은 arena라고 부르는 부분과 관련이 깊습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 시스템은 메모리를 할당하기 위해 메모리풀(arena)을 관리하는데 쓰레드 프로그램의 경우 이 arena를 통해 메모리를 할당 받게 됩니다. 만일, 쓰레드의 개수가 많이 증가할 경우 arena의 개수를 조정함으로써 동시성 측면에서 성능 향상을 도모할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4.&amp;nbsp;Solaris&lt;/b&gt; &lt;br /&gt;1)&amp;nbsp;메모리&amp;nbsp;할당&amp;nbsp;방식 &lt;br /&gt;&amp;nbsp;- 솔라리스는 reserved라는 형태로 메모리를 할당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- reserved 영역은 swap영역에 존재하며, 어떤 프로세스가 10M를 요청하면 swap영역에 10M를 먼저 할당해 놓고, 실제 해당 프로세스가 메모리에 접근할 때 물리적 메모리에 10M를 할당하는 형태로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Linux</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/29</guid>
      <comments>https://nick2ya.tistory.com/29#entry29comment</comments>
      <pubDate>Fri, 3 Nov 2023 17:20:47 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 디렉토리 크기 확인</title>
      <link>https://nick2ya.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;업무용 PC 및 노트북을 사용하다 보면 간혹 Windows OS Drive 사이즈가 부족한 경우가 발생하는데, 이때 어느 디렉토리에서 많이 사용 중인지 확인 후 필요없는 파일들을 찾아서 삭제를 해주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;많은 디렉토리를 하나씩 클릭하여 사이즈를 확인할 수 도 있겠지만, 이건 너~무 비효율적인 방법입니다. 이런 경우 파이썬을 통해 손쉽게 확인이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아래 코드를 참조하여 나만의 디렉토리 체크 프로그램을 만들어 업무에 활용해 보시기 바랍니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import glob, os
import time


# 현재시간 정보
def cur_time_func():
    # Current Time
    now = time.localtime()
    check_time = &quot;%04d-%02d-%02d %02d:%02d:%02d&quot; % (now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec)

    return check_time


# 디렉토리 사이즈 계산
def get_dir_size(path='.'):
    total = 0
    with os.scandir(path) as it:
        for entry in it:
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_dir_size(entry.path)
    return total


def main():
    dir_dict = dict()
    for d in glob.glob(&quot;D:\\ProgramFiles\\*&quot; + os.path.sep):
        try:
            dir_size_calc = format(int(get_dir_size(d))/int(1024)/int(1024), &quot;.1f&quot;)
            dir_dict[d] = float(dir_size_calc)
        except Exception as os_err:
            print(cur_time_func(), '[Error]', d, os_err)
    print(cur_time_func(), '[info] Directory list check completed.')
    print(cur_time_func(), '[info] Directory size check completed.')
    dir_sort_dict = sorted(dir_dict.items(), key=lambda item: item[1], reverse=True)
    print('')
    print('================================================================')
    print('[ Directory Size Result ]')
    print('----------------------------------------------------------------')
    for i in dir_sort_dict:
        dir_name = i[0]
        dir_size = i[1]
        print(dir_name, dir_size,'MB')
    print('----------------------------------------------------------------')
    print('================================================================')


if __name__ == '__main__':
    main()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행&amp;nbsp;결과는&amp;nbsp;아래와&amp;nbsp;같습니다.&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;2022-11-22 12:37:01 [info] Directory list check completed.
2022-11-22 12:37:01 [info] Directory size check completed.

================================================================
[ Directory Size Result ]
----------------------------------------------------------------
D:\ProgramFiles\AndroidStudio\ 1700.9 MB
D:\ProgramFiles\IBM_DS\ 395.8 MB
D:\ProgramFiles\IBM_DS_Storage_tool\ 387.6 MB
D:\ProgramFiles\Go\ 369.6 MB
D:\ProgramFiles\Microsoft VS Code\ 325.5 MB
D:\ProgramFiles\VirtualBox_old\ 264.0 MB
D:\ProgramFiles\Telegram\ 250.8 MB
D:\ProgramFiles\DBeaver\ 159.4 MB
D:\ProgramFiles\Mib_Browser\ 134.8 MB
D:\ProgramFiles\Grafana_Server_6.7.4\ 132.4 MB
D:\ProgramFiles\Grafana-6.7.4\ 132.1 MB
D:\ProgramFiles\WinMerge\ 20.5 MB
D:\ProgramFiles\resource_hacker 518 Kr\ 10.4 MB
----------------------------------------------------------------
================================================================
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/28</guid>
      <comments>https://nick2ya.tistory.com/28#entry28comment</comments>
      <pubDate>Tue, 22 Nov 2022 12:39:58 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 파파고(Papago) API 연동</title>
      <link>https://nick2ya.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;네이버에서 제공해주는 Open API를 통해 나만의 번역 프로그램을 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적인 불편함을 해소하고자 파이썬을 통해 간단한 번역 프로그램을 만들어 보면서 테스트한 내역을 공유하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;역시 사람은 직접 경험해보고 불편함을 느껴야 무언가 아이디어를 생각해내고 새로운 것을 만들려고 시도하는 것 같습니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 네이버에서 제공하는 Open API를 사용하기 위해서는 사용 신청을 하여야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신청하는 사이트는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developers.naver.com/main/&quot;&gt;네이버 개발자 센터 - NAVER Developers&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668500249968&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;NAVER Developers&quot; data-og-description=&quot;네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음&quot; data-og-host=&quot;developers.naver.com&quot; data-og-source-url=&quot;https://developers.naver.com/main/&quot; data-og-url=&quot;https://developers.naver.com/main&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nVoa1/hyQBcViaql/iFJDDcWwOa8auX7o4IJ4uK/img.jpg?width=940&amp;amp;height=492&amp;amp;face=0_0_940_492,https://scrap.kakaocdn.net/dn/b4NtH8/hyQzoXm8ne/i6QldpACnAcQ9kJP4YPmSK/img.jpg?width=940&amp;amp;height=492&amp;amp;face=0_0_940_492&quot;&gt;&lt;a href=&quot;https://developers.naver.com/main/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.naver.com/main/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nVoa1/hyQBcViaql/iFJDDcWwOa8auX7o4IJ4uK/img.jpg?width=940&amp;amp;height=492&amp;amp;face=0_0_940_492,https://scrap.kakaocdn.net/dn/b4NtH8/hyQzoXm8ne/i6QldpACnAcQ9kJP4YPmSK/img.jpg?width=940&amp;amp;height=492&amp;amp;face=0_0_940_492');&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;NAVER Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 경로에서 Papago 메뉴 클릭, 그리고&amp;nbsp; &quot;오픈 API 이용 신청&quot; 페이지 통해 API 신청을 진행 하시면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diWhgu/btrReF5887h/vk1VR2wAHPlr8P0VnAjHk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diWhgu/btrReF5887h/vk1VR2wAHPlr8P0VnAjHk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diWhgu/btrReF5887h/vk1VR2wAHPlr8P0VnAjHk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiWhgu%2FbtrReF5887h%2Fvk1VR2wAHPlr8P0VnAjHk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;109&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwEESP/btrRh69bFLq/AgEbUQotC8wKHkCR4vSexk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwEESP/btrRh69bFLq/AgEbUQotC8wKHkCR4vSexk/img.png&quot; data-alt=&quot;&amp;amp;lt; API 이용신청 페이지&amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwEESP/btrRh69bFLq/AgEbUQotC8wKHkCR4vSexk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwEESP%2FbtrRh69bFLq%2FAgEbUQotC8wKHkCR4vSexk%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;933&quot; height=&quot;752&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt; API 이용신청 페이지&amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 저는 API 이용 신청 시 서비스 환경의 경우 &quot;WEB 설정&quot; 으로 하였고, http 주소의 경우 별도 URL 주소가 없어서 http://127.0.0.1 로 설정 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( ※ 저와 같이 별도 URL 주소가 없는 경우에는 http://127.0.0.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;등록을 완료한 경우 &quot;내 애플리케이션&quot; 메뉴에서 Client ID와 Client Secret 정보가 발급된 것을 확인할 수 있습니다.&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;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import urllib.request
import json

text = '안녕. 뭐해?'
source = 'ko'
target = 'en'

encText = urllib.parse.quote(text)
data = f'source={source}&amp;amp;target={target}&amp;amp;text=' + encText

url = &quot;https://openapi.naver.com/v1/papago/n2mt&quot;
client_id = &quot;&quot; # 개발자센터에서 발급받은 Client ID 값
client_secret = &quot;&quot; # 개발자센터에서 발급받은 Client Secret 값

request = urllib.request.Request(url)
request.add_header(&quot;X-Naver-Client-Id&quot;, client_id)
request.add_header(&quot;X-Naver-Client-Secret&quot;, client_secret)

response = urllib.request.urlopen(request, data=data.encode(&quot;utf-8&quot;))
rescode = response.getcode()

if rescode == 200:
    response_body = response.read()
    decode = json.loads(response_body.decode('utf-8'))
    result = decode['message']['result']['translatedText']
    print(result)
else:
    print('Error Code:' + str(rescode))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 아래와 같이 출력 됩니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;Hi. What are you doing?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 네이버에서 제공하는 파파고 &lt;span style=&quot;color: #ee2323;&quot;&gt;Open API의 경우 무제한 사용 가능한게 아니며, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;API호출량/일일허용량 제한&lt;/span&gt;이 있으니 이점 참조하여 사용하시기 바랍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJC4R5/btrRiVzlSl5/XF3fBPTMCeJicBstKUa300/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJC4R5/btrRiVzlSl5/XF3fBPTMCeJicBstKUa300/img.png&quot; data-alt=&quot;&amp;amp;lt;API 호출안내&amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJC4R5/btrRiVzlSl5/XF3fBPTMCeJicBstKUa300/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJC4R5%2FbtrRiVzlSl5%2FXF3fBPTMCeJicBstKUa300%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;783&quot; height=&quot;338&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;API 호출안내&amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnIqxW/btrReGxeFwc/i459UWGaXH5bQIrto3VHN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnIqxW/btrReGxeFwc/i459UWGaXH5bQIrto3VHN0/img.png&quot; data-alt=&quot;&amp;amp;lt; Papago API 지원 언어&amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnIqxW/btrReGxeFwc/i459UWGaXH5bQIrto3VHN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnIqxW%2FbtrReGxeFwc%2Fi459UWGaXH5bQIrto3VHN0%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;660&quot; height=&quot;174&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt; Papago API 지원 언어&amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/27</guid>
      <comments>https://nick2ya.tistory.com/27#entry27comment</comments>
      <pubDate>Tue, 15 Nov 2022 17:32:28 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] 리눅스 Disk 상태 체크 방법</title>
      <link>https://nick2ya.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt; 리눅스에서 하드 디스크의 상태를 확인하기 위해서는 smartctl 을 사용합니다.&lt;br&gt;만약 서버에 smartctl을 사용할 수 없다면 아래와 같이 yum을 통해 설치하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;yum install -y smartmontools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;smartctl 명령어를 통한 Disk 체크 방법은 아래와 같습니다.&lt;br&gt;1) 명령어&lt;br&gt; #smartctl {옵션} {디스크}&lt;br&gt;2) 옵션&lt;br&gt; -a : 기본적으로 모든 정보를 확인할 때 사용합니다. &lt;br&gt; -H : 간단하게 디스크의 상태를 확인할 때 사용합니다.&lt;br&gt; -i : 간단하게 디스크 정보를 확인할 때 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;smartctl -a /dev/sda&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 위의 명령어를 실행했을 때 디스크마다 다른 항목들의 로그들이 나오는 경우도 있으며, 출력되는 내용이 다른 경우도 있습니다만 그중에서 유심히 봐야 할 항목들은 아래와 같습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   076   076   016    Pre-fail  Always       -       45155219
  2 Throughput_Performance  0x0005   125   125   054    Pre-fail  Offline      -       135
  3 Spin_Up_Time            0x0007   119   119   024    Pre-fail  Always       -       314 (Average 323)
  4 Start_Stop_Count        0x0012   100   100   000    Old_age   Always       -       30
  5 Reallocated_Sector_Ct   0x0033   100   100   005    Pre-fail  Always       -       126
  7 Seek_Error_Rate         0x000b   100   100   067    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   122   122   020    Pre-fail  Offline      -       39
  9 Power_On_Hours          0x0012   096   096   000    Old_age   Always       -       34808
 10 Spin_Retry_Count        0x0013   100   100   060    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       30
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       45
193 Load_Cycle_Count        0x0012   100   100   000    Old_age   Always       -       45
194 Temperature_Celsius     0x0002   200   200   000    Old_age   Always       -       30 (Lifetime Min/Max 8/35)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       144
197 Current_Pending_Sector  0x0022   100   100   000    Old_age   Always       -       43
198 Offline_Uncorrectable   0x0008   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x000a   200   200   000    Old_age   Always       -       0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Result&lt;br&gt; - 디스크의 상태가 정상이거나 사용하는데 문제가 없을 경우 PASSED 로 나옵니다. 만약 FAILED 로 나오는 경우에는 이미 디스크에 심각한 문제가 있는 경우입니다. &lt;br&gt;&lt;br&gt;2) Raw_Read_Error_Rate &lt;br&gt; - 디스크 표면으로부터 데이터를 읽는 과정에서 문제가 있을 때 카운팅 됩니다.( 주로 물리적 충격으로 유발 ) &lt;br&gt;&lt;br&gt;3) Rellocated_Sector_Ct &lt;br&gt; - 섹터에 문제가 생겨서 스페어 영역의 섹터로 대체된 횟수.&lt;br&gt;&lt;br&gt;4) Seek_Error_Rate &lt;br&gt; - 탐색 오류율.&lt;br&gt;&lt;br&gt;5) Current_Pending_Sector &lt;br&gt; - 불안정적인 섹터, 스페어영역 섹터로 remapping 을 준비중이거나 읽는 과정에서 문제가 생긴 섹터 (Current_Pending_Sector는 논리적 또는 물리적으로 문제가 있을 경우 카운팅 됩니다. 물리적으로 문제가 있을 경우 Rellocated_Sector_Ct 로 전환되고 논리적으로 문제가 있을 경우 카운팅 횟수가 줄어드는 경우도 있습니다.) &lt;br&gt;&lt;br&gt;6) Offline_Uncorrectable &lt;br&gt; - 읽기 / 쓰기에 문제가 생긴 섹터, 즉 디스크 표면이 손상. (배드 섹터 ) &lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>OS/Linux</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/26</guid>
      <comments>https://nick2ya.tistory.com/26#entry26comment</comments>
      <pubDate>Thu, 10 Nov 2022 17:11:51 +0900</pubDate>
    </item>
    <item>
      <title>[Server] Cloud  서비스 이해</title>
      <link>https://nick2ya.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt; Cloud 서비스란 서버/Storage/Network/Software 등 필요한 IT 자원을 사용자가 직접 구축할 필요 없이 Cloud 서비스 공급 업체를 통해 서비스를 제공받는 것을 의미합니다.&lt;br&gt; &lt;br&gt;Cloud 서비스 유형은 크게 Private Cloud, Public Cloud, Hybrid Cloud 3가지로 정의할 수 있습니다.&lt;br&gt; 그럼 각각의 유형에 대해 간략히 알아보도록 하겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;1. Cloud &lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;운영 유형&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Private Cloud&lt;/b&gt;&lt;br&gt; 가) 특징&lt;br&gt; - 기업 자체적으로 Cloud 환경을 구축하여 운영하는 형태입니다.&lt;br&gt; - 기업 자체적으로 유지관리가 필요하며, 보안에 민감한 서비스 환경에 적합합니다.&lt;br&gt;&lt;b&gt; &lt;/b&gt;&lt;br&gt;&lt;b&gt;2. Public Cloud&lt;/b&gt;&lt;br&gt; 가) 특징&lt;br&gt; - 기업 자체적으로 Cloud 환경을 구축 하지 않고, Cloud 서비스 업체를 통해 서비스를 제공받는 형태입니다.&lt;br&gt; - 기업 및 일반 사용자가 Cloud 서비스 업체에 요금을 지불하고 사용합니다.&lt;br&gt; - Private Cloud 환경에 비해 상대적으로 보안에 취약하기 때문에 외부에 제공되는 서비스 환경에 적합 합니다.&lt;br&gt;나) 서비스 제공업체&lt;br&gt; - Amazon Web Service (AWS)&lt;br&gt; - Microsoft Azure&lt;br&gt; - Google Cloud&lt;br&gt; - Oracle Cloud&lt;br&gt; - Naver Cloud&lt;br&gt; &lt;br&gt;&lt;b&gt;3. Hybrid Cloud&lt;/b&gt;&lt;br&gt; 가) 특징&lt;br&gt; - 필요에 따라 혼용하여 운영하는 방식으로, Public Cloud와 Private Cloud의 이점을 모두 제공받을 수 있는 장점이 있지만 그만큼 운영하는 입장에서는 환경이 복잡해 집니다.&lt;br&gt; &lt;br&gt;&lt;b&gt;4. On-Premise&lt;/b&gt;&lt;br&gt; 가) 특징&lt;br&gt; - Cloud 서비스가 나오기 이전에 기업 인프라 구축의 일반적인 방식입니다.&lt;br&gt; - On-Premise 환경의 경우 기업이 직접 서버실 이라고 하는 공간을 별도로 두고 물리적인 서버/Storage/Network 장비 등을 구축하여 운영하는 방식입니다.&lt;br&gt; &lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;2. Cloud &lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;서비스 종류&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. IaaS (Infrastructrue as a Service)&lt;/b&gt;&lt;br&gt; 1) 설명&lt;br&gt; - IaaS는 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서버, 스토리지, 네트워크를 가상화 환경으로 만들어, 필요에 따라 인프라 자원을 사용할 수 있게 서비스를 제공하는 형태를 의미한다&lt;/span&gt;&lt;/span&gt;. 사용자는 기존 VM과 비슷한 형태로 OS(Linux or Windows), CPU, Memory, Network, Storage 등 선택하여 손쉽게 가상 OS 환경을 제공 받을 수 있습니다.&lt;br&gt; &lt;br&gt; 2) 지원 플랫폼&lt;br&gt; 가) OpenStack&lt;br&gt; - OpenStack &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;은 IaaS 형태의 Cloud 환경을 구축할 수 있는 오픈소스 플랫폼으로, 기업 자체적으로 Private Cloud 환경의 IaaS 서비스 운영 시 사용 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; - &lt;/span&gt;&lt;/span&gt;OpenStack 은 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ESXi, Hyper-V, KVM, Xen 등 다양한 Hypervisor를 제공하며, &lt;/span&gt;&lt;/span&gt;Compute Node에 KVM 말고도 Docker 를 구성하여 사용 가능합니다.&lt;br&gt; 나) VMware&lt;br&gt; - 실무에서는 간혹 VMware를 통해 IaaS 형태의 Cloud 환경을 구성한 후 Private Cloud 환경의 IaaS 서비스를 운영하기도 합니다.&lt;br&gt; &lt;br&gt;&lt;b&gt;2. PaaS (Platform as a Service)&lt;/b&gt;&lt;br&gt; 1) 설명&lt;br&gt; - PaaS 는 어플리케이션 개발 및 실행에 필요한 환경(ex, OS, DB, 개발언어, Tomcat 등)&lt;br&gt;을 사용자에게 제공해 주는 서비스입니다.&lt;br&gt; - 즉, 사용자는 개발 및 운영환경을 따로 구축할 필요 없이 Cloud 업체의 PaaS 서비스를 통해&lt;br&gt;손쉽게 개발 및 운영환경을 제공 받을 수 있습니다.&lt;br&gt; &lt;br&gt; 2) 지원 플랫폼&lt;br&gt; 가) OpenShift&lt;br&gt; - OpenShift 를 통해 PaaS 형태의 Cloud 환경을 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;구축하고 관리할 수 있는 오픈소스 플랫폼입니다.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; - &lt;/span&gt;&lt;/span&gt;종종 Enterprise Kubernetes 로 소개되며, OpenShift 에서 Kubernetes는 필수 요소 입니다.&lt;br&gt; &lt;br&gt;&lt;b&gt;3. SaaS (Software as a Service)&lt;/b&gt;&lt;br&gt; - 서비스 제공업체가 관리하는 애플리케이션을 주로 웹 브라우저를 통해 사용자에게 제공하는 서비스입니다. Gmail Google Drive, MS Office 365 등이 SaaS의 대표적인 예시이고, 최근에는 ERP나 CRM 같은 Software 도 제공되고 있습니다.&lt;br&gt;- 업체가 사용자를 대신해 소프트웨어 업데이트, 버그 수정 및 기타 일반 소프트웨어 유지관리 작업을 처리하며, SaaS는 개별 사용자의 로컬 컴퓨터에 애플리케이션을 설치할 필요가 없이 바로 사용이 가능하므로 편리한 부분이 있습니다.&lt;br&gt; &lt;/p&gt;</description>
      <category>Server/Cloud</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/24</guid>
      <comments>https://nick2ya.tistory.com/24#entry24comment</comments>
      <pubDate>Fri, 28 Oct 2022 16:01:42 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] Table Size 확인</title>
      <link>https://nick2ya.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;PostgreSQL에서 Table Size 확인 시 아래 쿼리를 통해 조회가 가능합니다.&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;u&gt;&lt;i&gt;&lt;b&gt;1) 특정 Table Size 확인 (index 포함)&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; # &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;select pg_size_pretty(pg_total_relation_size('Table명'));&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;postgres=# select pg_size_pretty(pg_total_relation_size('pg_class'));

 pg_size_pretty
----------------
 224 kB
(1개 행)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;2) 특정 Table Size 확인 (index 미포함)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp; # &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;select pg_size_pretty(pg_relation_size('Table명'));&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;postgres=# select pg_size_pretty(pg_relation_size('pg_class'));
 
 pg_size_pretty
----------------
 88 kB
(1개 행)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;3) Size 큰 Table 조회&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; # &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;select A.relname as Tablename,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A.oid as OID,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A.relfilenode as Filename,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B.tablespace as Tablespace,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pg_relation_size(A.oid)/1024 as &quot;FILE_SIZE(KB)&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;from pg_class A, pg_tables B &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp; where A.relname = B.tablename&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order by 5 desc&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;postgres=# select A.relname as Tablename,
postgres-#     A.oid as OID,
postgres-#     A.relfilenode as Filename,
postgres-#     B.tablespace as Tablespace,
postgres-#     pg_relation_size(A.oid)/1024 as &quot;FILE_SIZE(KB)&quot;
postgres-# from pg_class A, pg_tables B
postgres-#    where A.relname = B.tablename
postgres-#     order by 5 desc
postgres-#     limit 10;

   tablename    | oid  | filename | tablespace | FILE_SIZE(KB)
----------------+------+----------+------------+---------------
 pg_shdepend    | 1214 |        0 | pg_global  |          1080
 pg_proc        | 1255 |        0 |            |           576
 pg_depend      | 2608 |     2608 |            |           432
 pg_attribute   | 1249 |        0 |            |           360
 pg_description | 2609 |     2609 |            |           272
 pg_statistic   | 2619 |     2619 |            |           184
 pg_operator    | 2617 |     2617 |            |           120
 pg_rewrite     | 2618 |     2618 |            |            96
 pg_class       | 1259 |        0 |            |            88
 pg_type        | 1247 |        0 |            |            72
(10개 행)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Database/PostgreSQL</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/23</guid>
      <comments>https://nick2ya.tistory.com/23#entry23comment</comments>
      <pubDate>Fri, 28 Oct 2022 00:01:14 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] DB 및 Tablespace Size 확인</title>
      <link>https://nick2ya.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;PostgreSQL에서 DB 및 Tablespace Size 확인 시 아래 쿼리를 통해 조회가 가능합니다.&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;u&gt;&lt;i&gt;&lt;b&gt;1) 특정 DB Size 확인&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; # select * from pg_size_pretty(pg_database_size ('DB명'));&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;postgres=# select * from pg_size_pretty(pg_database_size ('postgres'));

 pg_size_pretty
----------------
 7255 kB
(1개 행)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;2) 전체 DB Size 확인&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; #&lt;span&gt; select pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;postgres=# SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;

     datname     |  size
-----------------+---------
 postgres        | 7255 kB
&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;u&gt;&lt;i&gt;&lt;b&gt;3) Tablespace Size 확인&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; # &lt;span&gt;&lt;span&gt;select&amp;nbsp;spcname,&amp;nbsp;pg_size_pretty(pg_tablespace_size(spcname))&amp;nbsp;from&amp;nbsp;pg_tablespace;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;postgres=# select spcname, pg_size_pretty(pg_tablespace_size(spcname)) from pg_tablespace;

    spcname     | pg_size_pretty
----------------+----------------
 pg_default     | 1648 MB
 pg_global      | 6060 kB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Database/PostgreSQL</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/22</guid>
      <comments>https://nick2ya.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 27 Oct 2022 23:42:03 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 Dictionary 사용방법</title>
      <link>https://nick2ya.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Python에서 제공하는 자료구조 중 많이 사용하는 것중 하나가 Dictionary&amp;nbsp;입니다. &lt;br /&gt;&lt;br /&gt;Dictionary 의 경우 기본적으로 key와 value가 하나 또는 여러개가 { } 로 묶여져 있는 형태이고, Dictionary 내에 있는 데이터의 경우 쉼표(,)로 구분됩니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;{key:value, key:value, key:value}&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;&lt;i&gt;&lt;b&gt;1. &lt;b&gt;Dictionary 기초&lt;/b&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Dictionary 선언&lt;/b&gt; &lt;br /&gt;&lt;i&gt;&lt;b&gt;가) 데이터가 없는 빈 Dictionary 선언&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;port_dict = dict()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;나) 데이터가 존재하는 Dictionary 선언&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;port_dict = {'21':'ftp', '22':'ssh', '23':'telnet'}
print(port_dict)


# Output:
{'21': 'ftp', '22': 'ssh', '23': 'telnet'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 값 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;port_dict['80'] = 'http'
print(port_dict)


# Output:
{'21': 'ftp', '22': 'ssh', '23': 'telnet', '80': 'http'}&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;b&gt;3) 값 삭제&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;del(port_dict['21'])
print(port_dict)


# Output:
{'22': 'ssh', '23': 'telnet'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 값 갱신&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;port_dict['23'] = 'telnet-1'
print(port_dict)


# Output:
{'21': 'ftp', '22': 'ssh', '23': 'telnet-1'}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;i&gt;&lt;b&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Dictionary 사용&lt;/b&gt;&lt;/b&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) key 를 통한 value 조회&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;print(port_dict['22'])


# Output:
ssh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) for문 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;for key, val in port_dict.items():
    print(key, val)


# Output:
21 ftp
22 ssh
23 telnet&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 값 존재 여부 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;if '22' in port_dict:
    print('ssh 존재')


# Output:
ssh 존재&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 두개의 List를 Dictionary 변환&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;id = ['21', '22', '23', '80']
name = ['ftp', 'telnet', 'ssh', 'http']
id_name = [id, name]
port_dict = dict(zip(*id_name))
print(port_dict)


# Output:
{'21': 'ftp', '22': 'telnet', '23': 'ssh', '80': 'http'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) key를 기준으로 정렬(오름차순)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key 값을 기준으로 오름차순으로 정렬 하는 경우 sorted를 사용하고 item에[0] 이 dict의 key 를 의미합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;port_dict = {'443':'https', '22':'ssh','21':'ftp', '23':'telnet'}
sort_port_dict = sorted(port_dict.items(), key=lambda item: item[0])
print(sort_port_dict)


# Output:
[('21', 'ftp'), ('22', 'ssh'), ('23', 'telnet'), ('443', 'https')]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6) key를 기준으로 정렬(내림차순)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;오름차순과 코드는 동일하며, reverse=True 를 사용하면 됩니다.&lt;/i&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;port_dict = {'443':'https', '22':'ssh','21':'ftp', '23':'telnet'}
sort_port_dict = sorted(port_dict.items(), key=lambda item: item[0], reverse=True)
print(sort_port_dict)


# Output:
[('443', 'https'), ('23', 'telnet'), ('22', 'ssh'), ('21', 'ftp')]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7) value를 기준으로 정렬(오름차순)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key 값을 기준으로 오름차순으로 정렬 하는 경우 sorted를 사용하고 item에[1] 이 dict의 value 를 의미합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;port_dict = {'443':'https', '22':'ssh','21':'ftp', '23':'telnet'}
sort_port_dict = sorted(port_dict.items(), key=lambda item: item[1])
print(sort_port_dict)


# Output:
[('21', 'ftp'), ('443', 'https'), ('22', 'ssh'), ('23', 'telnet')]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8) &lt;b&gt;value를 기준으로 정렬(내림차순)&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;오름차순과 코드는 동일하며, reverse=True 를 사용하면 됩니다.&lt;/i&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;port_dict = {'443':'https', '22':'ssh','21':'ftp', '23':'telnet'}
sort_port_dict = sorted(port_dict.items(), key=lambda item: item[1], reverse=True)
print(sort_port_dict)


# Output:
[('23', 'telnet'), ('22', 'ssh'), ('443', 'https'), ('21', 'ftp')]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/21</guid>
      <comments>https://nick2ya.tistory.com/21#entry21comment</comments>
      <pubDate>Wed, 19 Oct 2022 16:21:28 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 3.0 이전 버전에서 한글 주석 사용하기</title>
      <link>https://nick2ya.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Python 3.0 이하 버전에서 한글 주석을 사용하는 경우 .py 소스파일 실행 시 에러가 발생하게 됩니다.&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;이런 경우 .py 소스파일 첫줄에 아래와 같이 한줄 추가를 해주면 간단히 해결 됩니다.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;#-*- coding: utf-8 -*-&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;span style=&quot;color: #000000;&quot;&gt;Python 2 버전의 경우 문자열을 Unicode형식으로 처리하기 때문에 위와 같은 인코딩 설정이 필요하며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Python 3.0 부터는 기본적으로 UTF-8을 사용하여 인코딩 설정을 하지 않아도 됩니다.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/20</guid>
      <comments>https://nick2ya.tistory.com/20#entry20comment</comments>
      <pubDate>Tue, 18 Oct 2022 17:57:45 +0900</pubDate>
    </item>
    <item>
      <title>[Windows] TCP/UDP 상태확인</title>
      <link>https://nick2ya.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Windows 서버 운영 시 TCP Socket 고갈로 인해 서비스에 문제가 발생하는 경우가 발생할 수 있습니다. &lt;br /&gt;이&amp;nbsp;경우&amp;nbsp;어떤&amp;nbsp;프로세스(PID)에서&amp;nbsp;TCP&amp;nbsp;세션을&amp;nbsp;많이&amp;nbsp;연결되어&amp;nbsp;있는지&amp;nbsp;확인하는&amp;nbsp;것이&amp;nbsp;중요한데,&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;netstat&amp;nbsp;명령어를&amp;nbsp;통해&amp;nbsp;확인이&amp;nbsp;가능합니다. &lt;br /&gt;&lt;br /&gt;우선&amp;nbsp;netstat&amp;nbsp;명령어란? &lt;br /&gt;&amp;nbsp;- 내 컴퓨터 또는 서버의 네트워크 상태를 확인할 수 있는 명령어로서 어떤 Port가 열려 있고 해당 Port는 어떤 PID에 의해 오픈 되었는지 등의 정보 확인이 가능합니다.&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;i&gt;[ netstat 에서 자주 사용하는 옵션 ]&lt;/i&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;-a&lt;/b&gt;&amp;nbsp;:&amp;nbsp;모든&amp;nbsp;연결&amp;nbsp;및&amp;nbsp;수신&amp;nbsp;대기&amp;nbsp;포트를&amp;nbsp;표시합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-n&lt;/b&gt;&amp;nbsp;:&amp;nbsp;주소&amp;nbsp;및&amp;nbsp;포트&amp;nbsp;번호를&amp;nbsp;숫자&amp;nbsp;형식으로&amp;nbsp;표시합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-o&lt;/b&gt;&amp;nbsp;:&amp;nbsp;각&amp;nbsp;연결의&amp;nbsp;소유자&amp;nbsp;프로세스&amp;nbsp;ID를&amp;nbsp;표시합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-p&lt;/b&gt;&amp;nbsp;:&amp;nbsp;proto로&amp;nbsp;지정한&amp;nbsp;프로토콜의&amp;nbsp;연결을&amp;nbsp;표시합니다.&amp;nbsp;proto는&amp;nbsp;TCP,&amp;nbsp;UDP,&amp;nbsp;TCPv6&amp;nbsp;또는&amp;nbsp;UDPv6&amp;nbsp;중&amp;nbsp;하나입니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;1)&amp;nbsp;TCP/UDP&amp;nbsp;리스트&amp;nbsp;확인&lt;/b&gt;&lt;/i&gt; &lt;br /&gt;&amp;nbsp;#netstat -an&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;i&gt;&lt;b&gt;2)&amp;nbsp;TCP&amp;nbsp;리스트&amp;nbsp;확인&lt;/b&gt;&lt;/i&gt; &lt;br /&gt;#netstat&amp;nbsp;-anp&amp;nbsp;tcp &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;3)&amp;nbsp;TCP&amp;nbsp;리스트에&amp;nbsp;PID정보&amp;nbsp;함께&amp;nbsp;조회&lt;/b&gt;&lt;/i&gt; &lt;br /&gt;#netstat&amp;nbsp;-anpo&amp;nbsp;tcp&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0aOZm/btrOX3uikaB/KdlVoPKu9V1JG3A8tIQKjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0aOZm/btrOX3uikaB/KdlVoPKu9V1JG3A8tIQKjk/img.png&quot; data-alt=&quot;&amp;amp;lt; netstat -anpo tcp 결과 화면 &amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0aOZm/btrOX3uikaB/KdlVoPKu9V1JG3A8tIQKjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0aOZm%2FbtrOX3uikaB%2FKdlVoPKu9V1JG3A8tIQKjk%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;593&quot; height=&quot;384&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt; netstat -anpo tcp 결과 화면 &amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;4) 특정 Port로 접속한 IP 확인&lt;/b&gt;&lt;/i&gt; &lt;br /&gt;#netstat&amp;nbsp;-ano&amp;nbsp;|&amp;nbsp;find&amp;nbsp;&quot;443&quot; &lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;5) netstat 상태 값&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;- LISTEN&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt; 연결 요구를 기다리는 상태, 포트가 열려 있는 상태. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;- ESTABLISHED&amp;nbsp; &amp;nbsp;&lt;/b&gt; 서로 연결되어 있는 상태 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;- SVN_SENT&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt; 클라이언트가 서버에 SYN 패킷을 보내고 연결을 요청한 상태. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;- SVN_RECV&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt;서버가 클라이언트의 SYN 패킷으로 요청을 받은 후 응답으로 SYN/ACK 패킷을 보내고 클라이언트에게 ACK를 받기 위해 기다리는 상태. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;- TIME_WAIT&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt;TCP 상태의 가장 마지막 단계로서, 이미 기존 연결이 종료되었거나 다음 연결을 위해 기다리는 상태. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;- CLOSE_WAIT&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt;원격의 연결 요청을 받고 연결이 종료되길 기다리는 상태.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- FIN_WAIT1&amp;nbsp; &amp;nbsp;&lt;/b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 클라이언트가 서버에게 연결을 끊고자 요청하는 상태.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;- FIN_WAIT2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/b&gt;서버가 클라이언트로부터 연결 종료 응답을 기다리는 상태.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;- LAST_ACK&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt;연결이 종료되었고 승인을 기다리는 상태. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;- CLOSED&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt; 완전히 연결이 종료된 상태.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Windows</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/19</guid>
      <comments>https://nick2ya.tistory.com/19#entry19comment</comments>
      <pubDate>Tue, 18 Oct 2022 16:44:55 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] 리눅스 메모리 사용현황 파악</title>
      <link>https://nick2ya.tistory.com/18</link>
      <description>&lt;p&gt;&amp;nbsp;리눅스 서버의 경우 여유 메모리를 Cache 영역으로 사용하려고 하는 습성이 있는데, 이는 여유 메모리를 최대한 Cache 영역으로 활용하면 성능 향상에 도움이 되기 때문입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;그럼 리눅스 서버의 전반적인 메모리 사용현황을 손쉽게 확인할 수 있는 방법에 대해 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;&lt;i&gt;free 명령어&lt;/i&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;free.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;86&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bop3Yz/btqWsIJjMSO/Hkl0Gx03BiS3KpSGki2rG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bop3Yz/btqWsIJjMSO/Hkl0Gx03BiS3KpSGki2rG0/img.png&quot; data-alt=&quot;[ free 명령어 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bop3Yz/btqWsIJjMSO/Hkl0Gx03BiS3KpSGki2rG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbop3Yz%2FbtqWsIJjMSO%2FHkl0Gx03BiS3KpSGki2rG0%2Fimg.png&quot; data-filename=&quot;free.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;86&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ free 명령어 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;[total] :&amp;nbsp;&lt;span&gt;&lt;/span&gt;&lt;/b&gt;Total 메모리 Size&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[used] :&lt;/b&gt;&lt;span&gt; 현재 &lt;/span&gt;사용중인 메모리 Size. (used = total-(free+buff/cache))&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[free] :&lt;span&gt; &lt;/span&gt;&lt;/b&gt;실제 사용 가능한 여유 있는 메모리 Size. (free = total-(used+buff/cache))&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[shared] :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;tmpfs(메모리 파일 시스템), ramfs 등으로 사용되는 메모리. 여러 프로세스에서 사용할 수 있는 공유 메모리 Size.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[buff/cache] :&lt;/b&gt;&lt;span&gt; Buffer&lt;/span&gt;와 Cache를 더해 사용 중인 메모리 Size.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Buffer ?&lt;/b&gt; : 디스크의 입/출력 효율을 높이기 위해 주기억장치(Memory)의 한 영역을 최근에 사용된 디스크 블록의 내용을 기억하는 영역으로 할당한 것을 의미하며, 해당 영역에 있는 디스크 블록은 디스크 액세스 없이 바로 이용할 수 있는 영역.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cache ? : &lt;/b&gt;자주 사용하는 데이터나 값을 디스크가 아닌 DRAM(Memory영역)에 임시 저장하여 좀 더 빠르게 데이터에 접근할 수 있게 해주는 영역.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[available] :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;swapping 없이 새로운 응용 프로그램(프로세스)에서 사용할 수 있는 메모리 Size.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Swap :&amp;nbsp;&lt;/b&gt;Swap 영역에서 전체 Size, 사용 중인 Size, 여유 공간.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Swap ? :&lt;/b&gt; 디스크의 일정 영역을 메모리 부족 시 마치 메모리처럼 사용하기 위해 미리 설정해둔 영역.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;마지막으로 아래는 free 명령어의 옵션 정보이니 참조하여 사용해 보시기 바랍니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[root@centos7&amp;nbsp;~]#&amp;nbsp;free&amp;nbsp;--help &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Usage: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;free&amp;nbsp;[options] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Options: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-b,&amp;nbsp;--bytes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;output&amp;nbsp;in&amp;nbsp;bytes &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-k,&amp;nbsp;--kilo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;output&amp;nbsp;in&amp;nbsp;kilobytes &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-m,&amp;nbsp;--mega&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;output&amp;nbsp;in&amp;nbsp;megabytes &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-g,&amp;nbsp;--giga&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;output&amp;nbsp;in&amp;nbsp;gigabytes &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--tera&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;output&amp;nbsp;in&amp;nbsp;terabytes &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-h,&amp;nbsp;--human&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;human-readable&amp;nbsp;output &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--si&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;use&amp;nbsp;powers&amp;nbsp;of&amp;nbsp;1000&amp;nbsp;not&amp;nbsp;1024 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-l,&amp;nbsp;--lohi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;detailed&amp;nbsp;low&amp;nbsp;and&amp;nbsp;high&amp;nbsp;memory&amp;nbsp;statistics &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-t,&amp;nbsp;--total&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;show&amp;nbsp;total&amp;nbsp;for&amp;nbsp;RAM&amp;nbsp;+&amp;nbsp;swap &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-s&amp;nbsp;N,&amp;nbsp;--seconds&amp;nbsp;N&amp;nbsp;&amp;nbsp;&amp;nbsp;repeat&amp;nbsp;printing&amp;nbsp;every&amp;nbsp;N&amp;nbsp;seconds &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-c&amp;nbsp;N,&amp;nbsp;--count&amp;nbsp;N&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repeat&amp;nbsp;printing&amp;nbsp;N&amp;nbsp;times,&amp;nbsp;then&amp;nbsp;exit &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-w,&amp;nbsp;--wide&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wide&amp;nbsp;output &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--help&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;display&amp;nbsp;this&amp;nbsp;help&amp;nbsp;and&amp;nbsp;exit &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;-V,&amp;nbsp;--version&amp;nbsp;&amp;nbsp;output&amp;nbsp;version&amp;nbsp;information&amp;nbsp;and&amp;nbsp;exit &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;For&amp;nbsp;more&amp;nbsp;details&amp;nbsp;see&amp;nbsp;free(1).&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Linux</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/18</guid>
      <comments>https://nick2ya.tistory.com/18#entry18comment</comments>
      <pubDate>Mon, 8 Feb 2021 16:44:56 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 exe 파일 Windows 기본 icon 사용하기</title>
      <link>https://nick2ya.tistory.com/17</link>
      <description>&lt;p&gt;&amp;nbsp;파이썬으로 작성한 코드를 pyinstaller를 통해 exe 파일을 만드는 경우 기본 icon은 아래와 같이 생성됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;137&quot; data-origin-height=&quot;28&quot; data-filename=&quot;dd.png&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o0n3o/btqV0740bKC/DYkjP8YHjW7LthJVSwVvkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o0n3o/btqV0740bKC/DYkjP8YHjW7LthJVSwVvkK/img.png&quot; data-alt=&quot;[ 기본 icon ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o0n3o/btqV0740bKC/DYkjP8YHjW7LthJVSwVvkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo0n3o%2FbtqV0740bKC%2FDYkjP8YHjW7LthJVSwVvkK%2Fimg.png&quot; data-origin-width=&quot;137&quot; data-origin-height=&quot;28&quot; data-filename=&quot;dd.png&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 기본 icon ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;물론 해당 icon을 그대로 사용해도 되고, 다른 icon을 사용해도 전혀 문제가 되지 않습니다.&lt;/p&gt;
&lt;p&gt;다만 저 같은 경우에는 Windows 기본 icon을 사용하고 싶어 해당 방법을 찾아보았고, 혹 저와 같은 생각을 가지시는 분들이 계실 거 같아 이 글을 작성하게 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;구글링을 통해 pyinstaller 시 Windows 기본 icon을 사용하는 방법을 찾아보면,&lt;/p&gt;
&lt;p&gt;대부분 pyinstaller로 exe 파일 만들 때 &quot;--icon=NONE&quot; 옵션을 사용하라고 가이드하고 있습니다.&lt;/p&gt;
&lt;p&gt;하지만 &lt;span style=&quot;color: #333333;&quot;&gt;저 같은 경우에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;해당 옵션을 사용해도 pyinstaller에서 제공하는 기본 icon으로 계속 빌드가 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;결국 제가 최종적으로 선택한 방법은 &lt;u&gt;&lt;i&gt;&lt;b&gt;pyinstaller를 통해 exe 파일을 만들 후 &quot;Resource Hacker&quot;라고 하는 유틸리티를 통해 기본 icon을 제거하는 방식으로&lt;/b&gt;&lt;/i&gt;&lt;/u&gt; 진행하였습니다.&lt;/p&gt;
&lt;p&gt;Resource Hacker는 무료 프로그램이며, 아래의 링크를 통해 다운로드하실 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- Download Site : &lt;a href=&quot;https://resource-hacker.softonic.kr/&quot;&gt;resource-hacker.softonic.kr/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;파이썬 exe파일 Windows 기본 icon 사용&quot;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p&gt;&lt;b&gt;1. pyinstaller를 통해 exe 파일 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;pyinstaller.png&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;239&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Feyyl/btqV35k7xHZ/V4bkk012ahKrStc40Cxct0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Feyyl/btqV35k7xHZ/V4bkk012ahKrStc40Cxct0/img.png&quot; data-alt=&quot;[ pyinstaller 통해 exe 파일 만들기 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Feyyl/btqV35k7xHZ/V4bkk012ahKrStc40Cxct0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFeyyl%2FbtqV35k7xHZ%2FV4bkk012ahKrStc40Cxct0%2Fimg.png&quot; data-filename=&quot;pyinstaller.png&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;239&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ pyinstaller 통해 exe 파일 만들기 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;exe.png&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;79&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd6xH3/btqV199jFCf/KqciQpLktKALc8FYN5fje1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd6xH3/btqV199jFCf/KqciQpLktKALc8FYN5fje1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd6xH3/btqV199jFCf/KqciQpLktKALc8FYN5fje1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd6xH3%2FbtqV199jFCf%2FKqciQpLktKALc8FYN5fje1%2Fimg.png&quot; data-filename=&quot;exe.png&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;79&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. Resource Hacker 프로그램 실행&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;re.png&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;525&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7B6WS/btqV0EBWVIH/6PNAGKcyKTl9MbE5QIrrZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7B6WS/btqV0EBWVIH/6PNAGKcyKTl9MbE5QIrrZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7B6WS/btqV0EBWVIH/6PNAGKcyKTl9MbE5QIrrZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7B6WS%2FbtqV0EBWVIH%2F6PNAGKcyKTl9MbE5QIrrZk%2Fimg.png&quot; data-filename=&quot;re.png&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;525&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3. 열기 버튼으로 pyinstaller를 통해 생성한 exe 파일 열기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;open.png&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;96&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crLPgQ/btqV2WID03m/B6jBT0ZB0bSVZKqK9s4Xk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crLPgQ/btqV2WID03m/B6jBT0ZB0bSVZKqK9s4Xk1/img.png&quot; data-alt=&quot;[ Open 버튼으로 exe 파일 불러오기 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crLPgQ/btqV2WID03m/B6jBT0ZB0bSVZKqK9s4Xk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrLPgQ%2FbtqV2WID03m%2FB6jBT0ZB0bSVZKqK9s4Xk1%2Fimg.png&quot; data-filename=&quot;open.png&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;96&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ Open 버튼으로 exe 파일 불러오기 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4. Icon Group 메뉴 펼친 후 icon 선택하여 리소스 삭제&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;del.png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;522&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3lemf/btqV8FzApZB/Bo5jzmmFF0j6mQAUkuw1I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3lemf/btqV8FzApZB/Bo5jzmmFF0j6mQAUkuw1I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3lemf/btqV8FzApZB/Bo5jzmmFF0j6mQAUkuw1I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3lemf%2FbtqV8FzApZB%2FBo5jzmmFF0j6mQAUkuw1I1%2Fimg.png&quot; data-filename=&quot;del.png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;522&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;5. 저장 버튼을 통해 저장하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;- 저장을 하면 exe 파일 경로에 기존 exe 파일은 &quot;_원본. exe&quot;라고 백업이 되고 편집한 파일이 생성됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;save.png&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;96&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coKVdv/btqWjqPn8ml/caeKjB7HmwKwCtkKjm5nA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coKVdv/btqWjqPn8ml/caeKjB7HmwKwCtkKjm5nA0/img.png&quot; data-alt=&quot;[ 편집 후 저장 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coKVdv/btqWjqPn8ml/caeKjB7HmwKwCtkKjm5nA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoKVdv%2FbtqWjqPn8ml%2FcaeKjB7HmwKwCtkKjm5nA0%2Fimg.png&quot; data-filename=&quot;save.png&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;96&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 편집 후 저장 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;save2.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;88&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMMw3G/btqV0EIKpSw/9l3ZsW7tuHL7kEoUEep5j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMMw3G/btqV0EIKpSw/9l3ZsW7tuHL7kEoUEep5j1/img.png&quot; data-alt=&quot;[ 편집파일 생성 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMMw3G/btqV0EIKpSw/9l3ZsW7tuHL7kEoUEep5j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMMw3G%2FbtqV0EIKpSw%2F9l3ZsW7tuHL7kEoUEep5j1%2Fimg.png&quot; data-filename=&quot;save2.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;88&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 편집파일 생성 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/17</guid>
      <comments>https://nick2ya.tistory.com/17#entry17comment</comments>
      <pubDate>Mon, 8 Feb 2021 01:44:17 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 Windows 서비스 등록</title>
      <link>https://nick2ya.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 시간에는 파이썬으로 제작한 exe 실행파일을 Windows 서비스에 등록하여 실행시키는 방법에 대해 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 구현하고자 하는 방식은 아래와 같습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #456771; color: #ffffff;&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp;[ &lt;u&gt;프로그램 구성&lt;/u&gt; ]&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Watchdog.exe&amp;nbsp; &amp;nbsp;(Windows Service 등록)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Main.exe&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: #ffffff; background-color: #456771;&quot;&gt;&lt;i&gt;&lt;b&gt;&amp;nbsp;[ &lt;u&gt;프로그램 실행 방식&lt;/u&gt; ]&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&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;1) Windows Service 에서 Watchdog 서비스(ex, Test Service) 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) Watchdog.exe 가 Main.exe 프로그램 실행&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1) Windows Service 에서 Watchdog 서비스&lt;span style=&quot;color: #333333;&quot;&gt;(ex, Test Service)&lt;/span&gt; 중지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2) Watchdog.exe 가 Main.exe 프로그램 종료(kill)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 테스트 환경&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python : 3.7&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;servicemanager : 1.8.1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pywin32 : 227&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;version.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmAAIY/btqVTHK5Kp4/T8w8vfrdtNRbFaHbVkJ33k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmAAIY/btqVTHK5Kp4/T8w8vfrdtNRbFaHbVkJ33k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmAAIY/btqVTHK5Kp4/T8w8vfrdtNRbFaHbVkJ33k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmAAIY%2FbtqVTHK5Kp4%2FT8w8vfrdtNRbFaHbVkJ33k%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;748&quot; height=&quot;202&quot; data-filename=&quot;version.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 참조 소스&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;import servicemanager
import socket
import sys
import win32event
import win32service
import win32serviceutil
import time
import subprocess
import os


class TestService(win32serviceutil.ServiceFramework):
    _svc_name_ = &quot;TestService&quot;
    _svc_display_name_ = &quot;Test Service&quot;

    def __init__(self, args):
         win32serviceutil.ServiceFramework.__init__(self, args)
         self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
         socket.setdefaulttimeout(60)
         self.is_running = False

     def SvcStop(self):
         # Main.exe Process Kill
         subprocess.Popen(&quot;taskkill /im Main.exe /f&quot;, shell=True)   # 서비스 중지 시 Main.exe 프로세스 taskkill 명령어로 중지.
         time.sleep(1)

         self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
         self.is_running = False # is_running 를 False로 바꿔 줌으로써 Main.exe 주기적 호출 막기
         win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
         self.is_running = True
         current_location = str(os.path.abspath(os.path.dirname(sys.argv[0])))   # 현재 위치 체크

         while self.is_running: # self.is_running이 True인 경우에만 while 실행

               rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
               if rc == win32event.WAIT_OBJECT_0:

                  break
               else:
                  subprocess.Popen([current_location + &quot;\\Main.exe&quot;]) # 현재 경로에 위치한 Main.exe 프로그램 실행
               time.sleep(55)


if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(TestService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(TestService)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Windows Service&amp;nbsp; exe 실행파일 만들기&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Windows Service에 등록하기 위한 Watchdog 프로그램을 빌드하는 경우 pyinstaller를 활용하여 아래의 명령어로 exe 파일을 만들면 됩니다.&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;#pyinstaller -F --hidden-&lt;span&gt;import&lt;/span&gt;=win32timezone -n Watchdog.exe py파일명&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;build2.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2DXYA/btqVRwDtx9Y/tRZYvtOc4A2op2HIwMn2S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2DXYA/btqVRwDtx9Y/tRZYvtOc4A2op2HIwMn2S1/img.png&quot; data-alt=&quot;[ Watchdog exe 파일 생성 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2DXYA/btqVRwDtx9Y/tRZYvtOc4A2op2HIwMn2S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2DXYA%2FbtqVRwDtx9Y%2FtRZYvtOc4A2op2HIwMn2S1%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;720&quot; height=&quot;271&quot; data-filename=&quot;build2.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ Watchdog exe 파일 생성 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. Windows Service 등록&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&amp;nbsp;&quot;&lt;b&gt;cmd창을 관리자 권한으로 실행&quot; &lt;/b&gt;&lt;/i&gt;한 다음 Watchdog 파일(ex, Watchdog.exe)이 위치한 경로로 이동해 줍니다.&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;b&gt;&amp;nbsp;1) Windows 서비스 등록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;#exe파일명 --startup=auto install&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;install.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/trDVy/btqVTGFBBHy/bMUMJils50075oFrF2iyI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/trDVy/btqVTGFBBHy/bMUMJils50075oFrF2iyI1/img.png&quot; data-alt=&quot;[ Windows Service 등록 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/trDVy/btqVTGFBBHy/bMUMJils50075oFrF2iyI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtrDVy%2FbtqVTGFBBHy%2FbMUMJils50075oFrF2iyI1%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;499&quot; height=&quot;61&quot; data-filename=&quot;install.png&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ Windows Service 등록 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;service.png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BGoYG/btqVOrWVTKK/b02YajsXnS1cs1v66vK6O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BGoYG/btqVOrWVTKK/b02YajsXnS1cs1v66vK6O1/img.png&quot; data-alt=&quot;[ Windows Service에 등록된 화면 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BGoYG/btqVOrWVTKK/b02YajsXnS1cs1v66vK6O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBGoYG%2FbtqVOrWVTKK%2Fb02YajsXnS1cs1v66vK6O1%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;866&quot; height=&quot;150&quot; data-filename=&quot;service.png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ Windows Service에 등록된 화면 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;2) Windows 서비스 삭제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;#exe파일명 remove&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;remove.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfQnt7/btqVTGliUYb/sfZwGu0zvMqHntek49t8I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfQnt7/btqVTGliUYb/sfZwGu0zvMqHntek49t8I1/img.png&quot; data-alt=&quot;[ Windows Service 삭제 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfQnt7/btqVTGliUYb/sfZwGu0zvMqHntek49t8I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfQnt7%2FbtqVTGliUYb%2FsfZwGu0zvMqHntek49t8I1%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;392&quot; height=&quot;52&quot; data-filename=&quot;remove.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ Windows Service 삭제 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/16</guid>
      <comments>https://nick2ya.tistory.com/16#entry16comment</comments>
      <pubDate>Sat, 6 Feb 2021 09:00:27 +0900</pubDate>
    </item>
    <item>
      <title>[Excel] 엑셀 기본 단축키 모음</title>
      <link>https://nick2ya.tistory.com/15</link>
      <description>&lt;p&gt;&amp;nbsp;직장인이라면 누구나 엑셀을 사용하실 겁니다. 엑셀에는 아주 많은 단축키가 존재하는데, 이 많은 단축키를 모두 외우기란 불가능합니다. 이번 시간에는 기본적이면서도 업무의 효율성을 높여줄 수 있는 단축키 위주로 정리하여 보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;한 번씩 따라 해 보시면 금방 본인의 것으로 만들 수 있으며, 해당 단축키를 잘만 활용한다면 업무시간을 조금이나마 단축시킬 수 있지 않을까 조심스럽게 생각해 봅니다. &lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;※ 해당 단축키는 MS 2013 버전 기준으로 작성하였습니다.&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;h1&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;엑셀 유용한 단축키 모음&quot;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;[ 엑셀 바로 실행 ]&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&amp;nbsp;-&amp;nbsp;윈도우키&amp;nbsp;+&amp;nbsp;r&amp;nbsp;키로&amp;nbsp;실행창을&amp;nbsp;열고&amp;nbsp;excel&amp;nbsp;이라고&amp;nbsp;입력&amp;nbsp;후&amp;nbsp;확인을&amp;nbsp;누르거나&amp;nbsp;엔터를&amp;nbsp;치면&amp;nbsp;엑셀이&amp;nbsp;바로&amp;nbsp;실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;excel.png&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;206&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n1bju/btqVIKbtb3O/enykJ41uw3JvhFFSmVGs9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n1bju/btqVIKbtb3O/enykJ41uw3JvhFFSmVGs9k/img.png&quot; data-alt=&quot;[ 엑셀 빠르게 실행 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n1bju/btqVIKbtb3O/enykJ41uw3JvhFFSmVGs9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn1bju%2FbtqVIKbtb3O%2FenykJ41uw3JvhFFSmVGs9k%2Fimg.png&quot; data-filename=&quot;excel.png&quot; data-origin-width=&quot;399&quot; data-origin-height=&quot;206&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 엑셀 빠르게 실행 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[ 시트 이동 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Crtl&amp;nbsp;+&amp;nbsp;Page&amp;nbsp;Up&amp;nbsp;또는&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;Page&amp;nbsp;Down &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 셀 좌/우측 끝으로 이동 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;왼쪽/오른쪽&amp;nbsp;방향키 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 셀 상/하단 끝으로 이동 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;위/아래&amp;nbsp;방향키 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 가로 셀 한 번에 선택 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;왼쪽/오른쪽&amp;nbsp;방향키 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 세로 셀 한 번에 선택 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;위/아래&amp;nbsp;방향키 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 전체 셀 선택 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;a &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 선택한 셀 편집 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;F2 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 다른 이름으로 저장 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;F12 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 글자 굵게 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;b &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 글자 밑줄 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;u &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 글자 기울임 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;i &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 검 색 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;f &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 바꾸기 ]&lt;/b&gt; (특정 문자를 찾아서 바꾸는 기능) &lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;h &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 작업 취소 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;z &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 마지막 작업 반복 ]&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Ctrl&amp;nbsp;+&amp;nbsp;y&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>컴퓨터 팁</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/15</guid>
      <comments>https://nick2ya.tistory.com/15#entry15comment</comments>
      <pubDate>Fri, 5 Feb 2021 12:47:48 +0900</pubDate>
    </item>
    <item>
      <title>[Windows] 윈도우 단축키 모음</title>
      <link>https://nick2ya.tistory.com/14</link>
      <description>&lt;p&gt;&amp;nbsp;컴퓨터를 통해 업무를 보는 분들이라면 기본적으로 알고 있으면 좋을 만한 윈도우 단축키 정보를 정리해 보았습니다. 마우스를 통해 일일이 클릭하는 것보단 아래와 같은 기본적인 단축키 정도만 알고 있어도 업무 효율성을 조금이나마 높여줄 것으로 생각됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;640&quot; data-filename=&quot;keyboard-311803_1280.png&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cABEkq/btqVIbNkeU2/WNK5okklPaDeGbFYBcYGFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cABEkq/btqVIbNkeU2/WNK5okklPaDeGbFYBcYGFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cABEkq/btqVIbNkeU2/WNK5okklPaDeGbFYBcYGFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcABEkq%2FbtqVIbNkeU2%2FWNK5okklPaDeGbFYBcYGFk%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;640&quot; data-filename=&quot;keyboard-311803_1280.png&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;h1&gt;&lt;i&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;유용한 단축키 모음&quot;&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 바탕화면 바로가기&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 윈도우키 + d&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 화면보호기 모드 실행&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 윈도우키 + l&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 전체화면 캡처&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;Print Screen&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 현재화면 캡처&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;Alt + Print Screen&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 파일탐색기 실행&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 윈도우키 + e&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. 현재 창 및 프로그램 종료&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; Alt + F4&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7. 복사&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; Ctrl + c&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8. 붙여넣기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; Ctrl + v&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;9. 파일 및 폴더이름 변경&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; F2&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10. 파일 저장&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; Alt + s&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;11. 작업 취소&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; Ctrl + c&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;12. 작업 되돌리기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; Ctrl + z&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;13. 프로그램 전환&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Alt + tab&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>OS/Windows</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/14</guid>
      <comments>https://nick2ya.tistory.com/14#entry14comment</comments>
      <pubDate>Thu, 4 Feb 2021 17:03:05 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] PostgreSQL 서비스 수동 중지 및 시작</title>
      <link>https://nick2ya.tistory.com/13</link>
      <description>&lt;p&gt;&amp;nbsp;Windows 서버에서 PostgreSQL 을 운영하는 도중 다양한 이유로 인해 Windows 서비스에서 PostgreSQL 서비스가 컨트롤(중지 및 시작) 되지 않는 경우가 발생할 수 있습니다. 이때 PostgreSQL에서 제공해 주는 pg_ctl.exe를 통해 수동으로 서비스를 중지 및 시작할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;우선 pg_ctl.exe 은 PostgreSQL 이 설치된 디렉토리 중 bin 디렉토리에 위치하며, 해당 파일이 하는 역할은 크게 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;pg_ctl.exe 는 PostgreSQL 데이터베이스 제반 작업을 수행하게 됩니다. 이 작업은 데이터베이스 클러스터 초기화, 서버 시작, 중지, 재시작, 서버 상태 출력 등입니다. 물론 서버는 postgres 명령으로 직접 실행할 수 있으나, pg_ctl.exe 명령을 이용하면, 보다 쉽고, 안전하게 관리할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;pg_ctl.exe에서 제공해 주는 옵션은 아래와 같이 다양합니다. 하지만 우리가 필요한 옵션은 서비스 중지 및 시작 시 참조할 옵션이며, 수동으로 서비스를 중지 및 시작하는 옵션은 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;1) 서비스 수동 중지&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;※ cmd창 관리자 권한 실행&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; #cd &lt;span style=&quot;color: #333333;&quot;&gt;D:\Postgresql\pgsql\&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;bin&amp;nbsp; (bin디렉토리 이동)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp; #pg_ctl.exe stop -m fast-D &quot;DB data 경로 지정&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;-m, --mode 는 중지 시 참조하는 Mode. (smart, fast, immediate&amp;nbsp;중 하나)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- smart&amp;nbsp;모든 클라이언트의 연결이 끊기게 되면 중지 됨&lt;br /&gt;&amp;nbsp; &amp;nbsp;- fast&amp;nbsp;클라이언트의 연결을 강제로 끊고 정상적으로 중지 됨&lt;br /&gt;&amp;nbsp; &amp;nbsp;- immediate&amp;nbsp;그냥 무조건 중지함;&amp;nbsp;다시 시작할 때 복구 작업을 할 수도 있음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;2) 서비스 수동 시작&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;※ cmd창 관리자 권한 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; #cd&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;D:\Postgresql\pgsql\&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;bin&amp;nbsp; (bin디렉토리 이동)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp; #pg_ctl.exe start -D &lt;span style=&quot;color: #ee2323;&quot;&gt;&quot;DB data 경로 지정&quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;[ pg_ctl.exe 전체 옵션 ]&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;D:\Postgresql\pgsql\&lt;span&gt;bin&lt;/span&gt;&amp;gt;pg_ctl.exe --&lt;span&gt;help&lt;br /&gt;&lt;/span&gt;pg_ctl &lt;span&gt;프로그램은 &lt;/span&gt;PostgreSQL &lt;span&gt;서버를 초기화&lt;/span&gt;, &lt;span&gt;시작&lt;/span&gt;, &lt;span&gt;중지&lt;/span&gt;, &lt;span&gt;제어하는 도구입니다&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;사용법&lt;/span&gt;:&lt;br /&gt;pg_ctl init[db] [-D &lt;span&gt;데이터디렉터리&lt;/span&gt;] [-s] [-o &lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;옵션&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;]&lt;br /&gt;pg_ctl start [-w] [-t &lt;span&gt;초&lt;/span&gt;] [-D &lt;span&gt;데이터디렉터리&lt;/span&gt;] [-s] [-l &lt;span&gt;로그파일&lt;/span&gt;] [-o &lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;옵션&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;]&lt;br /&gt;pg_ctl stop [-W] [-t &lt;span&gt;초&lt;/span&gt;] [-D &lt;span&gt;데이터디렉터리&lt;/span&gt;] [-s] [-m &lt;span&gt;중지모드&lt;/span&gt;]&lt;br /&gt;pg_ctl restart [-w] [-t &lt;span&gt;초&lt;/span&gt;] [-D &lt;span&gt;데이터디렉터리&lt;/span&gt;] [-s] [-m &lt;span&gt;중지모드&lt;/span&gt;]&lt;br /&gt;[-o &lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;옵션&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;]&lt;br /&gt;pg_ctl reload [-D &lt;span&gt;데이터디렉터리&lt;/span&gt;] [-s]&lt;br /&gt;pg_ctl status [-D &lt;span&gt;데이터디렉터리&lt;/span&gt;]&lt;br /&gt;pg_ctl promote [-D &lt;span&gt;데이터디렉터리&lt;/span&gt;] [-s]&lt;br /&gt;pg_ctl kill &lt;span&gt;시그널이름 &lt;/span&gt;PID&lt;br /&gt;pg_ctl register [-N &lt;span&gt;서비스이름&lt;/span&gt;] [-U &lt;span&gt;사용자이름&lt;/span&gt;] [-P &lt;span&gt;암호&lt;/span&gt;] [-D &lt;span&gt;데이터디렉터리&lt;/span&gt;]&lt;br /&gt;[-S &lt;span&gt;시작형태&lt;/span&gt;] [-w] [-t &lt;span&gt;초&lt;/span&gt;] [-o &lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;옵션&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;]&lt;br /&gt;pg_ctl unregister [-N &lt;span&gt;서비스이름&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;&lt;span&gt;일반 옵션들&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;-D, --pgdata=&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;데이터디렉터리 데이터베이스 자료가 저장되어있는 디렉터리&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;-e SOURCE &lt;span&gt;서비스가 실행 중일때 쌓을 로그를 위한 이벤트 소스&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;-s, --silent &lt;span&gt;일반적인 메시지는 보이지 않고&lt;/span&gt;, &lt;span&gt;오류만 보여줌&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;-t, --timeout=&lt;span&gt;초 &lt;/span&gt;-w &lt;span&gt;옵션 사용 시 대기 시간&lt;/span&gt;(&lt;span&gt;초&lt;/span&gt;)&lt;br /&gt;-V, --version &lt;span&gt;버전 정보를 보여주고 마침&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;-w &lt;span&gt;작업이 끝날 때까지 기다림&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;-W &lt;span&gt;작업이 끝날 때까지 기다리지 않음&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;-?, --&lt;span&gt;help &lt;/span&gt;&lt;span&gt;이 도움말을 보여주고 마침&lt;br /&gt;&lt;/span&gt;(&lt;span&gt;기본 설정은 중지 할 때는 기다리고&lt;/span&gt;, &lt;span&gt;시작이나 재시작할 때는 안 기다림&lt;/span&gt;.)&lt;br /&gt;-D &lt;span&gt;옵션을 사용하지 않으면&lt;/span&gt;, PGDATA &lt;span&gt;환경변수값을 사용함&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;start, restart 때 사용할 수 있는 옵션들:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;-c, --core-files 이 플랫폼에서는 사용할 수 없음&lt;br /&gt;-l, --log=로그파일 서버 로그를 이 로그파일에 기록함&lt;br /&gt;-o 옵션들 PostgreSQL 서버프로그램인 postgres나 initdb&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;명령에서 사용할 명령행 옵션들&lt;br /&gt;-p PATH-TO-POSTGRES 보통은 필요치 않음&lt;br /&gt;&lt;br /&gt;stop, restart 때 사용 할 수 있는 옵션들:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;-m, --mode=모드 모드는 &quot;smart&quot;, &quot;fast&quot;, &quot;immediate&quot; &lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;중 하나&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;중지방법 설명:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;smart 모든 클라이언트의 연결이 끊기게 되면 중지 됨&lt;br /&gt;fast 클라이언트의 연결을 강제로 끊고 정상적으로 중지 됨&lt;br /&gt;immediate 그냥 무조건 중지함; &lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;다시 시작할 때 복구 작업을 할 수도 있음&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;사용할 수 있는 중지용&lt;/span&gt;(&lt;span&gt;for &lt;/span&gt;kill) &lt;span&gt;시그널 이름&lt;/span&gt;:&lt;br /&gt;ABRT HUP INT QUIT TERM USR1 USR2&lt;br /&gt;&lt;br /&gt;&lt;span&gt;서비스 등록&lt;/span&gt;/&lt;span&gt;제거용 옵션들&lt;/span&gt;:&lt;br /&gt;-N SERVICENAME &lt;span&gt;서비스 목록에 등록될 &lt;/span&gt;PostgreSQL &lt;span&gt;서비스 이름&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;-P PASSWORD &lt;span&gt;이 서비스를 실행할 사용자의 암호&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;-U USERNAME &lt;span&gt;이 서비스를 실행할 사용자 이름&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;-S &lt;span&gt;시작형태 서비스로 등록된 &lt;/span&gt;PostgreSQL &lt;span&gt;서버 시작 방법&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;시작형태 설명&lt;/span&gt;:&lt;br /&gt;auto &lt;span&gt;시스템이 시작되면 자동으로 서비스가 시작됨 &lt;/span&gt;(&lt;span&gt;초기값&lt;/span&gt;)&lt;br /&gt;demand &lt;span&gt;수동 시작&lt;/span&gt;&lt;/p&gt;</description>
      <category>Database/PostgreSQL</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/13</guid>
      <comments>https://nick2ya.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 2 Feb 2021 01:57:03 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 SMTP를 통한 메일 전송</title>
      <link>https://nick2ya.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;파이썬에서 제공해 주는 라이브러리 중 기본 내장된 &quot;smtplib&quot; 라는 모듈을 통해 아주 쉽게 메일을 전송할 수 있습니다. 아래 예제를 참조하여 해당 기능을 잘 활용한다면 본인의 업무 효율성을 높여줄 수 있는 하나의 좋은 무기가 될 수 있으니 업무에 한 번씩 적용해 보셔도 좋을 거 같습니다.&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;우선 STMP가 무엇인지 살짝 알아보고 넘어가도록 하겠습니다. SMTP는 &quot;Simple Mail Transfer Protocol&quot; 의 약자로서 메일을 보내는데 사용되는 프로토콜입니다.&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;보통 사내에 SMTP 서버를 구축하여 메일 서버를 통해 메일 발송이 이루어지는데, 요즘은 굳이 사내에 메일 서버를 구축할 필요 없이 Google, MS, 네이버, 다음 등을 통해서 좀 더 편리하게 메일 기능을 사용할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;오늘 이시간에는 네이버를 통해 메일을 전송하는 예제를 진행해 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 네이버를 통해 메일을 발송하기 위해서는 아래와 같이 사전 준비작업이 필요하니 아래 정보 참조하여 사전 준비작업을 해주시기 바랍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;&lt;i&gt;&quot;사전 준비작업&quot;&lt;/i&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;1) 네이버 로그인 후 메일 환경 설정 이동&lt;/b&gt;&lt;/i&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;mail1.png&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lwIuD/btqVvOC6VkR/mAnGvB8KlX4co0x9QDI5z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lwIuD/btqVvOC6VkR/mAnGvB8KlX4co0x9QDI5z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lwIuD/btqVvOC6VkR/mAnGvB8KlX4co0x9QDI5z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlwIuD%2FbtqVvOC6VkR%2FmAnGvB8KlX4co0x9QDI5z1%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;246&quot; height=&quot;50&quot; data-filename=&quot;mail1.png&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;2) POP3/IMAP 설정 메뉴&amp;nbsp; =&amp;gt;&amp;nbsp; &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;IMAP/STMP 설정 탭&amp;nbsp; =&amp;gt; &lt;/b&gt;&lt;b&gt;&amp;nbsp;IMAP/SMTP 사용함 선택 후 확인 버튼 누르기&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;mail2.png&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n1MKN/btqVnYtuGt7/xFfORONXbfvFwggnCjOk90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n1MKN/btqVnYtuGt7/xFfORONXbfvFwggnCjOk90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n1MKN/btqVnYtuGt7/xFfORONXbfvFwggnCjOk90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn1MKN%2FbtqVnYtuGt7%2FxFfORONXbfvFwggnCjOk90%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;795&quot; height=&quot;478&quot; data-filename=&quot;mail2.png&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;&lt;i&gt;&quot;네이버 메일 보내기&quot;&lt;/i&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예제를 참조하여 네이버 SMTP를 통해 메일 전송이 가능합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;import smtplib
from email.mime.text import MIMEText

sendmail = &quot;네이버ID@naver.com&quot;   #ex) test@naver.com
receivemail = &quot;받는 대상&quot;   #ex) target@daum.net
password = &quot;네이버 비밀번호&quot;   #ex) 네이버 ID의 패스워드

smtpaddress = &quot;smtp.naver.com&quot;  #네이버 SMTP 서버 주소
smtpport = 587  #네이버 SMTP 포트 번호

text = &quot;매일 내용 입력&quot;
msg = MIMEText(text)

msg['Subject'] =&quot;메일제목 입력&quot;
msg['From'] = sendmail
msg['To'] = receivemail

s = smtplib.SMTP( smtpaddress , smtpport )  # 네이버 메일 서버 연결 부분
s.starttls()  #TLS 보안 처리
s.login( sendmail, password )  #로그인 부분
s.sendmail( sendmail, receivemail, msg.as_string() )  #메일 전송 부분
s.close()  #네이버 smtp 서버와 연결 종료&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/12</guid>
      <comments>https://nick2ya.tistory.com/12#entry12comment</comments>
      <pubDate>Tue, 2 Feb 2021 01:27:51 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 웹 크롤링(Crawling) 주의사항</title>
      <link>https://nick2ya.tistory.com/11</link>
      <description>&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;h1&gt;&lt;i&gt;&lt;b&gt;&quot;모든 정보를 크롤링 할 수 없다!&quot;&lt;/b&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;현재 인터넷상에는 정말 다양한 사이트들과 다양한 정보들이 존재하는데, 모든 정보에 대해 크롤링이 허용되는 것이 아닙니다. 개인정보가 있는 사이트의 경우 당연히 수집 못하도록 막을 것이고, 가져가지 말아야할 정보를 가져 가는 경우에는 저작권에 걸려 법적 문제까지 가는 경우가 발생할 수 도 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;그럼 이런경우 어떻게 구분하여 수집해도 문제없는 정보인지, 수집하면 안되는 정보인지 확인하는 방법은 해당 사이트에 존재하는 &quot;robots.txt&quot; 이라는 파일을 참조하는 것입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;robots.txt 파일은 무분별한 크롤링을 막고 제어하기 위해 1994년 6월에 로봇 배제 규약이 만들어졌습니다. 말 그대로 로봇이 수집을 못하게 막을 목적으로 만들어졌는데 로봇의 접근 관련 내용(크롤링 허가/불허의 여부)을 robot.txt 라는 파일에 적어두는 방법입니다. 결국 &lt;u&gt;&lt;i&gt;&lt;b&gt;robots.txt 파일은 해당 사이트의 안내문과 같은 역할을 하며 반드시 해당 사이트에 있는 정보를 수집하기 전에 읽어 보아야 합니다.&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;robots.txt 파일의 위치는 참조하고자 하는 웹사이트의 주소 뒤에 슬래시 후 바로 robot.txt 를 넣어서 접근하면 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- ex) &lt;a href=&quot;http://namu.wiki/robot.net&quot;&gt;http://namu.wiki/robots.txt&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 robots.txt 파일의 형식은 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;[ robots.txt 파일 형식 ]&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;User-agent: &amp;lt;= 검색봇 이름&lt;/p&gt;
&lt;p&gt;Disallow: &amp;lt;= 접근 설정&lt;/p&gt;
&lt;p&gt;Crawl-delay: 다음방문까지의 디레이(초)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;[ 모든 검색봇에 차단 ]&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;User-agent: *&lt;/p&gt;
&lt;p&gt;Disallow: /&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[ 모든 검색봇에 허용 ]&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;User-agent: *&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Disallow:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[ 모든 검색봇에 대해 일부만 허용 ]&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;User-agent: *&lt;/p&gt;
&lt;p&gt;Disallow: /page1/&lt;/p&gt;
&lt;p&gt;Disallow: /page2/&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/11</guid>
      <comments>https://nick2ya.tistory.com/11#entry11comment</comments>
      <pubDate>Thu, 21 Jan 2021 01:32:25 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 속도개선</title>
      <link>https://nick2ya.tistory.com/10</link>
      <description>&lt;p&gt;&amp;nbsp;파이썬은 많은 장점들이 있지만 컴파일 언어에 비해 속도가 느리다는 단점이 존재합니다. 파이썬의 속도를 높이기 위해 인터넷에서 찾아보면 &quot;병렬처리&quot; 또는 &quot;Cython&quot; 이라고 하는 내용이 많이 보이는데, 해당 내용은 좀더 고급 스킬을 요구하는 내용들이라 초보 개발자 분들이 지금 바로 접하고 적용하기에는 다소 어려운 내용들이라고 생각됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;이번 시간에는 위에서 언급한 &quot;병렬처리&quot;와 &quot;&lt;span style=&quot;color: #333333;&quot;&gt;Cython&lt;/span&gt;&quot;을 접하기 이전에 좀더 쉬운 방식으로 파이썬 속도를 개선할 수 있는 방법에 대해 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;i&gt;&lt;b&gt;&quot;반복문에서 간단한 구문 변경으로 속도 개선&quot;&lt;/b&gt;&lt;/i&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;개발을 하다보면 반복문은 필수적으로 다루어야 하는 내용입니다. 파이썬에서 반복문 사용할 떄 loop 내에 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;. &lt;/span&gt;&lt;/b&gt;을 사용하게 되면 속도저하가 발생하게 됩니다. 아래 간단한 예시를 통해 확인해 보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. loop 안에 . 을 사용하는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w1sEV/btqSASvFaxX/ak81krOSxpI8PwOTdDK89k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w1sEV/btqSASvFaxX/ak81krOSxpI8PwOTdDK89k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w1sEV/btqSASvFaxX/ak81krOSxpI8PwOTdDK89k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw1sEV%2FbtqSASvFaxX%2Fak81krOSxpI8PwOTdDK89k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- loop내 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt; 을 사용하는 경우 Elapsed Time은 312 ms 가 나왔습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. 미사용 하는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- &lt;span style=&quot;color: #000000;&quot;&gt;list comprehension 를 통한 예시입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HPYnz/btqSmzKMVkl/thc4SDeQuK2v86b7fnPNGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HPYnz/btqSmzKMVkl/thc4SDeQuK2v86b7fnPNGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HPYnz/btqSmzKMVkl/thc4SDeQuK2v86b7fnPNGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHPYnz%2FbtqSmzKMVkl%2Fthc4SDeQuK2v86b7fnPNGK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- .을 사용하지 않고 &lt;span style=&quot;color: #000000;&quot;&gt;list comprehension 를 통해 구현하는 경우 &lt;span style=&quot;color: #333333;&quot;&gt;Elapsed Time은 114 ms 가 나왔습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;위 예시 내용과 같이 간단한 구문 변경만으로 파이썬 속도를 개선할 수 있는 것을 확인 하였습니다. 반복문 loop 내에&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt; 사용을 최대한 피하고, 반복문을 통해 리스트를 만드는 경우에는 &lt;span style=&quot;color: #000000;&quot;&gt;list comprehension 사용하여 속도 개선을 해보시기 바랍니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/10</guid>
      <comments>https://nick2ya.tistory.com/10#entry10comment</comments>
      <pubDate>Tue, 5 Jan 2021 03:00:27 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 ssh 를 통한 업무 자동화</title>
      <link>https://nick2ya.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;ssh를 사용하는 환경(ex, Unix/Linux 서버)인 경우 파이썬에서 제공하는 &quot;paramiko&quot; 라이브러리를 설치하여 손쉽게 ssh 접속하여 원하는 작업을 자동화하여 사용할 수 있습니다. 물론 기존에도 쉘 스크립트를 통해 어느 정도 자동화가 가능하지만 파이썬에서 제공되는 자동화에 비하면 한계점(ex, 쉘 스크립트 최초 배포, 쉘 수정 시 배포 필요 등) 들이 있어 파이썬을 통한 업무 자동화를 개인적으로는 추천드립니다.&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;기존에 ssh 접속하여 직접 Command를 실행하였던 작업들 또는 수작업으로 특정 파일을 업로드/다운로드하였던 부분들을 이젠 좀 더 쉽고 고급스럽게 자동화하여 사용이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이런 기능을 본인의 업무 환경에 맞게 잘 활용한다면 &lt;span style=&quot;color: #333333;&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;&amp;nbsp;우선 해당 기능을 사용하기 위해서는 늘 그래 왔듯이 &lt;span style=&quot;color: #333333;&quot;&gt;paramiko 라이브러리가 사전에 설치가 되어 있어야 하며, 당연히 ssh 접속하고자 하는 대상 장비에 ssh가 설치 및 활성화되어 있어야 하는 점 참조 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;저 같은 경우 모든 작업을 파이참을 통해 이루어지다 보니 파이참을 통해 &lt;span style=&quot;color: #333333;&quot;&gt;paramiko 2.5.0 버전을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;설치하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;( ※ 파이참이 아닌 pip 명령어로 설치하는 경우 &quot;pip install &lt;span style=&quot;color: #333333;&quot;&gt;paramiko==2.5.0&lt;/span&gt;&quot; 명령어를 통해 설치 진행하셔도 됩니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgmLHi/btqROfMXg3G/z2ChSNprxuzxXtnci8mytk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgmLHi/btqROfMXg3G/z2ChSNprxuzxXtnci8mytk/img.png&quot; data-alt=&quot;[ paramiko 설치 화면 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgmLHi/btqROfMXg3G/z2ChSNprxuzxXtnci8mytk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgmLHi%2FbtqROfMXg3G%2Fz2ChSNprxuzxXtnci8mytk%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;1013&quot; height=&quot;721&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ paramiko 설치 화면 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;1. ssh 접속하기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;ssh 접속은 아래와 같이 몇 줄 안 되는 코드로 통해 손쉽게 접속이 가능합니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import paramiko

try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    ssh.connect(&quot;192.168.0.236&quot;, username=&quot;root&quot;, password=&quot;abc123&quot;)    # 대상IP, User명, 패스워드 입력
    print('ssh connected.')    # ssh 정상 접속 후 메시지 출력

    ssh.close()   # ssh 접속하여 모든 작업 후 ssh 접속 close 하기


except Exception as err:
    print(err)    # ssh 접속 실패 시 ssh 관련 에러 메시지 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;정상적으로 ssh 접속이 되는 경우 &quot;&lt;span style=&quot;color: #333333;&quot;&gt;ssh connected.&quot; 메시지가 &lt;/span&gt;출력 될 것이고, 만약 ssh 접속이 안 되는 경우는 아래와 같이 ssh 에러 메시지가 출력될 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMK32t/btqRXHn4R14/x6lViksZ3Xhpckbjr7cfF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMK32t/btqRXHn4R14/x6lViksZ3Xhpckbjr7cfF1/img.png&quot; data-alt=&quot;[ ssh 접속 에러 시 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMK32t/btqRXHn4R14/x6lViksZ3Xhpckbjr7cfF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMK32t%2FbtqRXHn4R14%2Fx6lViksZ3Xhpckbjr7cfF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;56&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ ssh 접속 에러 시 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;2. 명령어 실행&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;특정 명령어를 실행하는 경우 위 예제 코드에서 &lt;span style=&quot;color: #333333;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;'ssh connected.'&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;) 부분과 ssh.close() 사이에 아래 코드를 넣어 사용하시면 됩니다. 저 같은 경우에는 디렉토리 및 파일 리스트를 확인하는 예제이기 때문에 리스트 결과를 화면에 출력까지 하는 것이며, 만약 실행하고자 하는 명령어가 리턴 받을 내용이 없다고 하면 명령어(&lt;span style=&quot;color: #333333;&quot;&gt;ssh.exec_command 부분&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt;만 활용하셔도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;stdin, stdout, stderr = ssh.exec_command(&quot;ls -l&quot;)   # ssh 접속한 경로에 디렉토리 및 파일 리스트 확인 명령어 실행
lines = stdout.readlines()
for i in lines:    # for문을 통해 명령어 결과값 출력.
    re = str(i).replace('\n', '')
    print(re)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRrkdR/btqRQTpmdO8/Ym1ihxfWXBhIEmkcYLNQ10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRrkdR/btqRQTpmdO8/Ym1ihxfWXBhIEmkcYLNQ10/img.png&quot; data-alt=&quot;[ 명령어 실행 결과 확인 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRrkdR/btqRQTpmdO8/Ym1ihxfWXBhIEmkcYLNQ10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRrkdR%2FbtqRQTpmdO8%2FYm1ihxfWXBhIEmkcYLNQ10%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;556&quot; height=&quot;243&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 명령어 실행 결과 확인 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;3. 파일 업로드/다운로드&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;paramiko 라이브러리를 통해 작업하고자 하는 대상 장비에 sftp로 접속하여 파일을 업로드/다운로드가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 코드는 아래와 같습니다. 저 같은 경우 프로젝트 디렉토리 내에 위치한 &quot;&lt;span style=&quot;color: #333333;&quot;&gt;upload_file.txt&quot; 파일을 /tmp 디렉토리에 업로드하였습니다.&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;i&gt;&lt;b&gt;1) 업로드&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import paramiko

try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    ssh.connect(&quot;192.168.0.236&quot;, username=&quot;root&quot;, password=&quot;abc123&quot;)    # 대상 IP, User명, 패스워드 입력
    print('ssh connected.\n')

    # File Upload
    sftp = ssh.open_sftp()
    sftp.put('.\\upload_file.txt', '/tmp/upload_file.txt')
    print('sftp upload success.\n')

    ssh.close()

except Exception as err:
    print(err)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;파일이 정상적으로 업로드되면 아래와 &quot;&lt;span style=&quot;color: #333333;&quot;&gt;sftp upload success.&quot; 메시지가 출력이 될 것이며, 대상 서버에 접속해 보면 업로드한 파일이 업로드된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDXW3C/btqR1E5KEaq/ikpHXWnVk9IT3N9Ws6WN0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDXW3C/btqR1E5KEaq/ikpHXWnVk9IT3N9Ws6WN0k/img.png&quot; data-alt=&quot;[ 파일 업로드 완료 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDXW3C/btqR1E5KEaq/ikpHXWnVk9IT3N9Ws6WN0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDXW3C%2FbtqR1E5KEaq%2FikpHXWnVk9IT3N9Ws6WN0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;114&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 파일 업로드 완료 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beF47g/btqRVqNLWBo/8dY5EAJKHDq9S1QfKkBY8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beF47g/btqRVqNLWBo/8dY5EAJKHDq9S1QfKkBY8k/img.png&quot; data-alt=&quot;[ 대상 서버에 파일 업로드 완료 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beF47g/btqRVqNLWBo/8dY5EAJKHDq9S1QfKkBY8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeF47g%2FbtqRVqNLWBo%2F8dY5EAJKHDq9S1QfKkBY8k%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;733&quot; height=&quot;274&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 대상 서버에 파일 업로드 완료 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;2) 다운로드&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;파일을 다운로드하는 경우 위 예제 코드에서 &quot;sftp.put(&lt;span&gt;'.&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;upload_file.txt'&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;'/tmp/upload_file.txt'&lt;/span&gt;)&quot; 이 부분을 아래와 같이 변경하여 사용하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;저 같은 경우에는 &quot;/tmp/download_file.txt&quot; 파일을 현재 프로젝트 디렉토리로 다운로드하도록 하겠습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;sftp.get('/tmp/download_file.txt', '.\\download_file.txt')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/9</guid>
      <comments>https://nick2ya.tistory.com/9#entry9comment</comments>
      <pubDate>Thu, 31 Dec 2020 12:38:45 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 postgresql 접속 및 select 하기</title>
      <link>https://nick2ya.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;파이썬에서 제공해주는 라이브러리 중에서 &lt;b&gt;&lt;i&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;i&gt;psycopg2&quot;&lt;/i&gt;&lt;/b&gt; 라고 하는 라이브러리를 통해 &lt;/span&gt;PostgreSQL을 접속하여 Database 정보 확인이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;psycopg2 라이브러리는 pip install 명령어를 통해 쉽게 설치가 가능하며, 저 같은 경우에는 모든 작업을 파이참을 통해 진행하기 때문에 파이참을 통해 psycopg2 라이브러리를 설치하였습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;참고로 파이참에서 라이브러리를 설치 하는 경우 File - Setting - Project Interpreter 메뉴에서 해당 라이브러리를 찾아서 설치하였으니 참조 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;1. 접속하기&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# host : PostgreSQL 서버 IP&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# dbname : 접속하고자 하는 Database 명&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# user : 접속하고자 하는 Database 계정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;# password = &lt;span style=&quot;color: #333333;&quot;&gt;접속하고자 하는 Databsae User의 비밀번호&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import psycopg2

# Try to connect
try:
    conn = psycopg2.connect(host=&quot;127.0.0.1&quot;, dbname=&quot;testdb&quot;, user=&quot;testuser&quot;, password=&quot;abc123&quot;)
except:
    print(&quot;Not Connected!.&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;만약 Database에 접속이 되지않아 PostgreSQL 자체에서 발생하는 로그를 바로 확인하고자 하는 경우에는 except 코드 부분을 아래와 같이 수정하면 좀더 자세한 Database 접속에러 내역을 볼 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;except psycopg2.DatabaseError as db_err:
    print(db_err)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZPgAG/btqRXITVzCM/PVCo7FmvhuwQkXkohBhFk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZPgAG/btqRXITVzCM/PVCo7FmvhuwQkXkohBhFk0/img.png&quot; data-alt=&quot;[ DB Connect Error 예시 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZPgAG/btqRXITVzCM/PVCo7FmvhuwQkXkohBhFk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZPgAG%2FbtqRXITVzCM%2FPVCo7FmvhuwQkXkohBhFk0%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;711&quot; height=&quot;87&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ DB Connect Error 예시 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;2. 조회하기&lt;/b&gt;&lt;/h1&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import psycopg2

# Try to connect
try:
    conn = psycopg2.connect(host=&quot;127.0.0.1&quot;, dbname=&quot;testdb&quot;, user=&quot;testuser&quot;, password=&quot;abc123&quot;)

    cur = conn.cursor()
    cur.execute(&quot;select * from urlstate;&quot;)
    rows = cur.fetchall()

    print(rows)

except psycopg2.DatabaseError as db_err:
    print(db_err)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xWOdY/btqRVo9f58G/gBLpTsLPKKHFaoFQ9CmoVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xWOdY/btqRVo9f58G/gBLpTsLPKKHFaoFQ9CmoVK/img.png&quot; data-alt=&quot;[ 쿼리 가로 결과 예시 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xWOdY/btqRVo9f58G/gBLpTsLPKKHFaoFQ9CmoVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxWOdY%2FbtqRVo9f58G%2FgBLpTsLPKKHFaoFQ9CmoVK%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;1022&quot; height=&quot;77&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;77&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 쿼리 가로 결과 예시 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위 샘플코드를 실행하면 기본적으로 실행 결과가 가로로 표기가 되게 됩니다. 쿼리 결과를 &lt;span style=&quot;color: #333333;&quot;&gt;세로로 보고자 하는 경우에는 &lt;/span&gt;&quot;&lt;span style=&quot;color: #333333;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(rows)&quot; 코드 부분을 아래와 같이 수정하면 &lt;/span&gt;세로 형태로 확인이 가능합니다.&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;for i in rows:
    print(i)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beX9dL/btqRQSwhVWp/6FWj2MzX85o1cUhwt9KgZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beX9dL/btqRQSwhVWp/6FWj2MzX85o1cUhwt9KgZ1/img.png&quot; data-alt=&quot;[ 쿼리 세로 결과 예시 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beX9dL/btqRQSwhVWp/6FWj2MzX85o1cUhwt9KgZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeX9dL%2FbtqRQSwhVWp%2F6FWj2MzX85o1cUhwt9KgZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;162&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 쿼리 세로 결과 예시 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/8</guid>
      <comments>https://nick2ya.tistory.com/8#entry8comment</comments>
      <pubDate>Wed, 30 Dec 2020 02:07:50 +0900</pubDate>
    </item>
    <item>
      <title>[Python] pyinstaller로 exe 실행파일 만들때 파일 버전정보 설정</title>
      <link>https://nick2ya.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;파이썬에서 pyinstaller를 통해 exe 실행파일을 생성하는 경우 별도로 파일 버전을 설정하지 않아도 아무 문제없이 exe 실행파일 생성이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다만, 소스코드가 길어지고 코드 수정이 잦아지게 되면 결국 exe 실행파일을 여러번 만들게 되는데, 이런 경우 exe 실행파일 관리하는 부분에 있어 어려움이 발생하게 되어 exe 실행파일에 파일버전을 설정하여 좀더 수월한 관리가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;추가적으로 exe 실행파일을 좀더 고급스럽고 전문가적인 느낌을 주기위해서도 exe 실행파일에 파일 버전 정보를 설정하는 것을 개인적으로는 추천해 드리고 싶습니다.&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;pyinstaller를 통해 exe 실행파일 만들때 파일 버전정보를 설정하는 방법은 아래와 같이 프로젝트 경로에 아래의 샘플내역을 txt 파일형태로 저장한 다음 &quot;--version-file&quot; 옵션을 통해 txt 파일을 불러오시면 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;1. 준비사항&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;1) txt 샘플내역 저장 및 편집&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 아래 txt 샘플내역 저장 후 빨간색 글자 부분만 편집하여 프로젝트 경로에 파일을 위치 시켜 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - txt 샘플내역은 아래 첨부파일에서 다운 받으시면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dWGIw5/btqRI7ufdYX/I8P1SjTmF3r1RJTjz7IPMK/file_version_info.txt?attach=1&amp;amp;knm=tfile.txt&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;file_version_info.txt&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) txt 샘플내역&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;# UTF-8

#

VSVersionInfo(
  ffi=FixedFileInfo(
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)

# Set not needed items to zero 0.
filevers=(1, 0, 0, 0),
prodvers=(1, 0, 0, 0),

# Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file.
flags=0x0,

# The operating system for which this file was designed.
# 0x4 - NT and there is no need to change it.
OS=0x4,
# The general type of file.

# 0x1 - the file is an application.
fileType=0x1,
# The function of the file.
# 0x0 - the function is not defined for this fileType
subtype=0x0,

# Creation date and time stamp.
date=(0, 0)
),
  kids=[
StringFileInfo(

  [
  StringTable(
    u'040904B0',
    [StringStruct(u'CompanyName', u''),
    StringStruct(u'FileDescription', u'test'),
    StringStruct(u'FileVersion', u'1.0.0.0'),
    StringStruct(u'InternalName', u''),
    StringStruct(u'LegalCopyright', u''),
    StringStruct(u'OriginalFilename', u''),
    StringStruct(u'ProductName', u'test.exe'),
    StringStruct(u'ProductVersion', u'1.0.0.0')])
  ]),
VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
  ]
)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h1&gt;&lt;b&gt;2. 설정 옵션 및 명령어&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;1) 옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp; &lt;i&gt;--version-file txt파일명&lt;/i&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;b&gt;&amp;nbsp;2) 명령어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;#pyinstaller 파이썬소스.py &lt;span style=&quot;color: #333333;&quot;&gt;--version-file file_version.txt&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/InL5X/btqRGp20kJU/FzdYG7muObSakynKQJXCvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/InL5X/btqRGp20kJU/FzdYG7muObSakynKQJXCvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/InL5X/btqRGp20kJU/FzdYG7muObSakynKQJXCvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FInL5X%2FbtqRGp20kJU%2FFzdYG7muObSakynKQJXCvK%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;814&quot; height=&quot;292&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 파일 버전 확인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- pyinstaller로 exe 실행파일을 생성하는 경우 프로젝트 경로의 'dist&quot; 라고 하는 디렉토리에 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- exe 실행파일에서 마우스 우클릭 후 &quot;속성&quot; 메뉴에 들으간 다음 &quot;자세히&quot; 탭을 보면 위에서 설정한 파일 버전정보가 잘 설정된 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q4HAm/btqRQTomiDm/BuLJ23IGFJhK6kVxR4kIaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q4HAm/btqRQTomiDm/BuLJ23IGFJhK6kVxR4kIaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q4HAm/btqRQTomiDm/BuLJ23IGFJhK6kVxR4kIaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq4HAm%2FbtqRQTomiDm%2FBuLJ23IGFJhK6kVxR4kIaK%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;421&quot; height=&quot;598&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/7</guid>
      <comments>https://nick2ya.tistory.com/7#entry7comment</comments>
      <pubDate>Wed, 30 Dec 2020 00:33:08 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 exe 실행파일 만들기</title>
      <link>https://nick2ya.tistory.com/6</link>
      <description>&lt;p&gt;&amp;nbsp;정성 들여 코딩한 결과물을 배포하는 경우 직접 코딩한 소스를 배포할 수 도 있지만, 보안 및 여러 다양한 문제들로 인해 소스 자체를 배포하기보단 exe 실행파일로 만들어서 배포하는 경우가 대부분입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;파이썬에서도 exe 파일을 생성할 수 있는 다양한 라이브러리들이 제공되는데, 저 같은 경우는 가장 쉽고 편하다고 알려진 &quot;pyinstaller&quot;를 사용하고 있으며, 이 시간에는 &lt;span style=&quot;color: #333333;&quot;&gt;pyinstaller를 통해 exe 파일을 생성하는 방법에 대해 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우선 pyinstaller를 사용하기 위해서는 당연히 &lt;span style=&quot;color: #333333;&quot;&gt;pyinstaller 가 사전에 설치가 되어 있어야 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;pyinstaller 설치는 아래와 같이 pip 명령어를 통해 손쉽게 설치가 가능합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;#pip install &lt;span style=&quot;color: #333333;&quot;&gt;pyinstaller&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;1. 참고사항&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;pyinstaller를 통해 실행파일을 만들 수 있는 형태는 크게 2가지 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;1) 하나의 exe 실행파일 형태&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;가) pyinstaller를 통해 하나의 exe 파일을 생성하는 것이며, 가장 보편적이고 많이 사용하는 형태라고 생각됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;나) 장/단점&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- 장점 : 하나의 exe 파일로 배포 가능하며, 압축이 되어 exe 파일사이즈가 작다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- 단점 : 프로그램 실행시 압축된 exe 파일을 압축해제 후 프로그램이 실행되다 보니 디렉토리 형태에 비해 실행 속도가 느리다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nI5aS/btqRI78iB3c/6EbHVdHgGazO04O4MlkYCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nI5aS/btqRI78iB3c/6EbHVdHgGazO04O4MlkYCK/img.png&quot; data-alt=&quot;[ 하나의 exe 파일 형태 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nI5aS/btqRI78iB3c/6EbHVdHgGazO04O4MlkYCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnI5aS%2FbtqRI78iB3c%2F6EbHVdHgGazO04O4MlkYCK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 하나의 exe 파일 형태 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;2) 디렉토리 형태 (&lt;i&gt;&lt;b&gt;여러 부가적인 파일 포함)&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;가) &lt;span style=&quot;color: #333333;&quot;&gt;pyinstaller를 통해 하나의 exe 파일을 생성하는 것이 아닌, exe 파일 실행 시 필요한 부가적인 파일들도 같이 디렉토리 내에 표기 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;나) 장/단점&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- 장점 : 별도의 압축해제 과정이 없어서 프로그램 실행속도가 빠르다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;- 단점 : 파일이 많기 때문에 관리가 번거로우며, 실행파일 사이즈가 압축이 되지 않다보니 하나의 exe 파일 형태보다 파일의 사이즈가 크다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PX8wo/btqRAllZBN4/arvnatGx902QZZxTxpUDp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PX8wo/btqRAllZBN4/arvnatGx902QZZxTxpUDp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PX8wo/btqRAllZBN4/arvnatGx902QZZxTxpUDp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPX8wo%2FbtqRAllZBN4%2FarvnatGx902QZZxTxpUDp1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다시한번 위 2가지 방법의 가장 큰 차이점을 살펴보면 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;1) 하나의 exe 실행파일로 생성할지 여부와&lt;/p&gt;
&lt;p&gt;&amp;nbsp;2) 프로그램 실행 속도 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;하나의 exe 파일로 생성하는 경우 사용자가 프로그램을 실행 시 exe 로 묶여 있는 파일을 풀어서 실행해 주는 과정이 필요하며, 하나의 실행 파일이 아닌 여러 파일로 생성된 경우는 이 과정이 생략되기 때문에 프로그램 실행 속도 차이가 발생할 수 밖에 없습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;파일 사이즈가 작은 경우에는 그 차이가 미비하겠지만, 파일 사이즈가 큰 경우에는 이 차이가 상당하기 때문에 참조하시어 실행파일을 만드시기 바랍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp; ※ 참고적으로 최근 Trend 분석 테스트로 인해 fbprophet 을 통해 코드 작성 후 실행파일을 생성한 경우가 있는데, exe 파일 하나로 묶은 경우 파일 사이즈가 압축이 되어서 300 MB 였었고, 디렉토리 형태로 만든 경우에는 압축이 되지 않아 1 GB가 좀 넘었습니다. 그리고 실행 속도는 exe파일로 만든 경우가 디렉토리 형태로 만든 파일 보다 2배 더 느린 속도를 보였습니다.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;2. exe 실행파일 만들기&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;저 같은 경우 파이참을 통해 모든 작업이 이루어 지다 보니 파이참을 통해 exe 파일을 만드는 과정을 보여드리는 부분 참조해 주시기 바랍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;pyinstaller를 통해 exe 파일을 만드는 방법은 생각보다 쉽습니다.&lt;/p&gt;
&lt;p&gt;결국 아래의 명령어로 exe 파일 생성이 가능하며, 부가적인 옵션사항에 대해서만 숙지하셔도 기본적인 부분은 충분하다고 생각됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;#pyinstaller 파이썬소스.py&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;1) exe 실행파일 만들기&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;가) 명령어&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp;#&lt;span style=&quot;color: #333333;&quot;&gt;pyinstaller 파이썬소스.py&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;나) 참조예시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mBfCj/btqRCU2NKxX/gEbjn64z4gekBFa9KyK1D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mBfCj/btqRCU2NKxX/gEbjn64z4gekBFa9KyK1D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mBfCj/btqRCU2NKxX/gEbjn64z4gekBFa9KyK1D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmBfCj%2FbtqRCU2NKxX%2FgEbjn64z4gekBFa9KyK1D0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;2) exe 실행파일 확인&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- exe 실행파일은 해당 파이썬 코드가 위치한 프로젝트 경로에 가시면 &quot;dist&quot;라고 하는 디렉토리에 실행파일이 만들어 지제 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; - 기본적으로 아무 옵션 없이 exe파일을 만들게 되는 경우 예시와 같이 디렉토리 형태로 실행파일이 만들어 집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9o7uz/btqRI7tKQvx/mwuVs4J4BWYx5kTeCXKUv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9o7uz/btqRI7tKQvx/mwuVs4J4BWYx5kTeCXKUv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9o7uz/btqRI7tKQvx/mwuVs4J4BWYx5kTeCXKUv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9o7uz%2FbtqRI7tKQvx%2FmwuVs4J4BWYx5kTeCXKUv1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;3) 옵션 내역&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 우선 가장 많이 사용되는 옵션들로만 정리 하였습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 76px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;b&gt;구 분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;b&gt;옵 션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;b&gt;참조 명령어&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;하나의 exe 실행파일 생성&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;--onefile (또는 -F)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;pyinstaller --onefile query_test.py&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;exe 파일명 지정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;-n&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;pyinstaller --n Query_Test.exe query_test.py&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;icon 지정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;--icon=&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;pyinstaller &lt;span style=&quot;color: #333333;&quot;&gt;--icon=test.ico&lt;/span&gt;&amp;nbsp;query_test.py&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;cmd 콘솔화면 미출력 되도록 설정&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;--noconsole&amp;nbsp;(또는 -w)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;pyinstaller --noconsole&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;query_test.py&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/6</guid>
      <comments>https://nick2ya.tistory.com/6#entry6comment</comments>
      <pubDate>Tue, 29 Dec 2020 11:12:00 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 데이터 타입 (문자열)</title>
      <link>https://nick2ya.tistory.com/5</link>
      <description>&lt;p&gt;&amp;nbsp;문자열(String)이란 문자, 단어 등으로 구성된 문자들의 집합을 의미 합니다.&lt;/p&gt;
&lt;p&gt;예를 들어 아래와 같은 것 들이 모두 문자열에 속하게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;Hello Python&quot;&lt;/p&gt;
&lt;p&gt;&quot;abc&quot;&lt;/p&gt;
&lt;p&gt;&quot;123&quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;그러면 이제 문자열을 어떻게 선언하여 사용하는지 그리고 기본적으로 알아야 하고 가장 많이 사용되는 문자열 조작 방법에 대해 알아 보도록 하겠습니다.&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;1. 문자열 사용 방법&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;1) 큰 따옴표(&quot;)로 양쪽 둘러싸기&lt;/p&gt;
&lt;p&gt;&amp;nbsp; - &quot;Hello Python&quot;&lt;/p&gt;
&lt;p&gt;2) 작은&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;따옴표(')로 양쪽 둘러싸기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; - 'Hello Python'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;크게 위 두가지 방법이 가장 많이 사용되는 방법이며, 만약 두가지를 같이 사용하게 되는 경우가 발생하면,&lt;/p&gt;
&lt;p&gt;아래와 같이 작은 따옴표(') 안에 큰 따옴표(&quot;)를 포함해서 사용하시면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; - 'Python is &quot;very&quot; simple language.'&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;b&gt;2. 문자열 조작하기&lt;/b&gt;&lt;/h1&gt;
&lt;p&gt;1) 문자열 바꾸기(치환하기)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 특정 문자열을 치환하는 경우 replace 라고 하는 함수를 통해 문자열 치환이 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;303&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7btaM/btqRI7l80EF/atR8uOn0wNMDHkZzyjfuvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7btaM/btqRI7l80EF/atR8uOn0wNMDHkZzyjfuvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7btaM/btqRI7l80EF/atR8uOn0wNMDHkZzyjfuvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7btaM%2FbtqRI7l80EF%2FatR8uOn0wNMDHkZzyjfuvk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;303&quot; height=&quot;NaN&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;2) 문자열 분리하기&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 특정 문자열을 분리하는 경우 split 이라고 하는 함수를 통해 문자열 분리가 가능합니다. split의 경우 기본적으로 공백을 기준으로 분리하기 때문에 분리하고자 하는 기호(ex, a.split(',')를 괄호안에 넣어 주어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 문자열을 분리하는 이유는 다양하겠지만 split을 통해 분리한 문자열의 경우 리스트 형태로 변환이 됩니다.&amp;nbsp; 그래서 손쉽게 문자열을 리스트 형태로 변환하여 for문과 같은 반복문으로도 사용이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;233&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmTlSr/btqRxZvZBUx/dqfCaInl8f3ufBuThrt5V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmTlSr/btqRxZvZBUx/dqfCaInl8f3ufBuThrt5V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmTlSr/btqRxZvZBUx/dqfCaInl8f3ufBuThrt5V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmTlSr%2FbtqRxZvZBUx%2FdqfCaInl8f3ufBuThrt5V1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;233&quot; height=&quot;NaN&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;3) 모든 공백 제거하기&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 특정 문자열에서 모든 공백을 제거하고자 하는 경우 1)번에서 사용한 함수와 동일한 replace 함수를 통해 공백 제거가 가능합니다. replcace 함수 괄호안 작은 따옴표에 공백(' ')을 공백 없음('')으로 작성하여 문자열에 있는 모든 공백을 제거할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;268&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9chWm/btqRqR6NrEA/pT1ZKhFJoURCqklOTk8uRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9chWm/btqRqR6NrEA/pT1ZKhFJoURCqklOTk8uRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9chWm/btqRqR6NrEA/pT1ZKhFJoURCqklOTk8uRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9chWm%2FbtqRqR6NrEA%2FpT1ZKhFJoURCqklOTk8uRK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;268&quot; height=&quot;NaN&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;4) 왼쪽 공객 제거하기&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 특정 문자열에서 왼쪽에 위치한 공백을 제거하고자 하는 경우 lstrip 함수를 통해 제거가 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;216&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q6Tbu/btqRCWrXgiI/EShqsjQLwHwwkWv7OBUx41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q6Tbu/btqRCWrXgiI/EShqsjQLwHwwkWv7OBUx41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q6Tbu/btqRCWrXgiI/EShqsjQLwHwwkWv7OBUx41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq6Tbu%2FbtqRCWrXgiI%2FEShqsjQLwHwwkWv7OBUx41%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;216&quot; height=&quot;NaN&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;5) 오른쪽 공백 제거하기&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 특정 문자열에서 오른쪽에 위치한 공백을 제거하고자 하는 경우 rstrip 함수를 통해 제거가 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;216&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvrGFj/btqRt6PU7U3/K7V303ZHZkK2pGCJ0GpDE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvrGFj/btqRt6PU7U3/K7V303ZHZkK2pGCJ0GpDE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvrGFj/btqRt6PU7U3/K7V303ZHZkK2pGCJ0GpDE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvrGFj%2FbtqRt6PU7U3%2FK7V303ZHZkK2pGCJ0GpDE0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;216&quot; height=&quot;NaN&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;6) 양쪽 공백 제거하기&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 특정 문자열에서 양쪽 끝에 위치한 공백을 제거하고자 하는 경우 strip 함수를 통해 제거가 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;220&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nq3Ap/btqRwadshTY/7kkyn0hEcqmrzJNg9iFC40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nq3Ap/btqRwadshTY/7kkyn0hEcqmrzJNg9iFC40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nq3Ap/btqRwadshTY/7kkyn0hEcqmrzJNg9iFC40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNq3Ap%2FbtqRwadshTY%2F7kkyn0hEcqmrzJNg9iFC40%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;220&quot; height=&quot;NaN&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;7) 소문자를 대문자로 바꾸기(upper)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 특정 문자열을 소문자에서 대문자로 바꾸고자 하는 경우 upper 라고 하는 함수를 통해 손쉽게 변경이 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;193&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpKJGD/btqRx09tlrF/QkG3JvQnH2S2ztU5omsFWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpKJGD/btqRx09tlrF/QkG3JvQnH2S2ztU5omsFWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpKJGD/btqRx09tlrF/QkG3JvQnH2S2ztU5omsFWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpKJGD%2FbtqRx09tlrF%2FQkG3JvQnH2S2ztU5omsFWK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;193&quot; height=&quot;NaN&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;8) 대&lt;span style=&quot;color: #333333;&quot;&gt;문자를 소문자로 바꾸기(lower)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 특정 문자열을 대문자에서 소문자로 바꾸고자 하는 경우 lower 라고 하는 함수를 통해 손쉽게 변경이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;199&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kx1wp/btqRqbR1t7z/mVjGahajQm36bvq1GAFoR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kx1wp/btqRqbR1t7z/mVjGahajQm36bvq1GAFoR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kx1wp/btqRqbR1t7z/mVjGahajQm36bvq1GAFoR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkx1wp%2FbtqRqbR1t7z%2FmVjGahajQm36bvq1GAFoR0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;199&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/5</guid>
      <comments>https://nick2ya.tistory.com/5#entry5comment</comments>
      <pubDate>Mon, 28 Dec 2020 01:54:37 +0900</pubDate>
    </item>
    <item>
      <title>[PostgreSQL] Vacuum 이란?</title>
      <link>https://nick2ya.tistory.com/4</link>
      <description>&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Vacuum 이란?&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;Vacuum은 DB의 오래된 영역을 재사용하거나 정리 해주는 프로세스입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PostgreSQL에서 특정 Row를 업데이트 할 경우, 디스크 상의 해당 Row를 물리적으로 업데이트하여 사용하지 않고, 새로운 영역을 할당해 쓰게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;즉, Update나 Delete 한다고 해서, 해당영역이 자동으로 재사용되거나 사라지지 않는다. 이러한, 오래된 영역을 재사용하거나 정리해주는 명령어가 Vacuum 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Vacuum 종류&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1) Vacuum&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - 삭제 된 데이터나 Update된 데이터의 이전 버전을 마킹 하여 그 공간을 다시 사용할 수 있게 해 주는 기본 Vacuum 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2) Vacuum Freeze&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - 삭제 된 데이터만이 아니라 남아있는 데이터에 대해서도 XID를 2로 변경해 주어 앞으로 XID wrap around가 발생하더라도 문제가 없도록 해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3) Vacuum (prevent wrap around)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - XID Wrap around가 다가오는 상황에서 아직 freeze 되지 않은 데이터가 남아 있을 경우 강제로 vacuum freez를 시도 하는데 이 때 실행되는 vacuum 작업이 VACUUM (prevent wrap around) 입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4) Vacuum Full&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - 삭제된 데이터를 마킹만 하는게 아니라 아예 정상적인 데이터만으로 테이블을 새로 만들어서 빈공간까지 회수하는 작업, Table 전체에 Lock을 걸기 때문에 운영중에 실행하면 안됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5) Auto Vacuum&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - 내부 알고리즘으로 필요에 따라 자동으로 실행되는 Vacuum 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - 기본적으로 실시간(주기적)으로 Vacuum 작업(ex, vacuum만 실행, vacuum full아님) 실시하며, autovacuum_freeze_max_age에 도달하면 강제로 Vacuum 작업(ex, vacuum freeze)을 실시하게 됩니다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Vacuum 의 중요성&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1) 변경 또는 삭제된 자료들이 차지하는 디스크 공간 재사용하기 위한 디스크 공간을 확보해 줍니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2) Postgresql 쿼리 실행 계획기가 사용할 통계 정보 갱신할 필요가 있어 자동적으로 갱신해 줍니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - 쿼리 실행 계획기는 쿼리의 좋은 실행 계획을 짜기 위해서 각 테이블에 저장된 자료를 바탕으로 수집된 통계 정보를 이용 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3) index 전용 검색 성능을 향상하는데 이용하는 실자료(Visibility Map, vm) 정보를 갱신하는 작업을 해줍니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4) 트랜잭션 ID(XID) 겹침이나, 다중 트랜잭션 ID 겹침 상황으로 오래된 자료가 손실 될 가능성을 방지하여 줍니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; - XID 겹침오류(wraparound)을 방지하기 위해서 주기적으로 Vacuum이 반드시 실행 되어야 하며, XID 겹침방지를 위해 Vacuum은 오래된 XID 값을 FrozenXID(XID 2)로 바꾸는 방식으로 XID 겹침 오류를 방지하게 됩니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(vacuum_freeze_min_age 파라미터값에 도달하면 Vacuum이 해당 옛 XID를 FrozenXID로 변경한다.)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 이렇게 오래된 XID 값을 &quot;영구 보관용&quot; 자료로 바꿔 놓으면, 트랜잭션 XID 비교 작업에서 항상 제외 되기 때문에, XID 겹침 오류를 피해갈 수 있게 되며, 결국 이 XID 변경 작업을 바로 Vacuum 명령으로 하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. Vacuum 명령어&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1) 옵 션&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;가) 표준 Vacuum (옵션 없이 수행)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;- Vacuum 수행 중에도, SELECT, DML 작업이 가능 합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;- 단순히 사용 가능한 공간을 Free Space Map에 반환되는 것이며, 실제 다스크 공간 확보 안됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;나) Full&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;- 디스크상의 여유공간이 확보됩니다. 하지만 시간이 오래 걸리며, 수행되는 테이블에 대한 exclusive Lock이 발생하게 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;- 데이터베이스가 잠김(Lock)처리가 되므로 &lt;span style=&quot;color: #ee2323;&quot;&gt;운영중인 데이터베이스에서는 Full 옵션으로 사용 금지.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;다) Analyze&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;- 통계 메타데이터를 업데이트하므로 쿼리 옵티마이저가 더 정확한 쿼리 계획을 생성할 수 있어 vacuum 명령어시 같이 실행하는 것이 좋습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2) 명령어&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;가) DB 전체 풀 실행&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp; #vacuum full analyze;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;나) DB 전체 간단하게 실행&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp; #vacuum verbose analyze;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;다) 특정 테이블만 간단하게 실행&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp; #vacuum analyse [테이블 명];&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;라) 특정 테이블만 풀 실행&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp; #vacuum full [테이블명];&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Database/PostgreSQL</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/4</guid>
      <comments>https://nick2ya.tistory.com/4#entry4comment</comments>
      <pubDate>Thu, 24 Dec 2020 14:20:41 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 데이터 타입 (숫자)</title>
      <link>https://nick2ya.tistory.com/3</link>
      <description>&lt;p&gt;파이썬에서는 제공해 주는 다양한 데이터 Type 중에서 첫번째로 숫자 Type에 대해 알아 보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;기본적으로 파이썬에서 숫자값을 입력하게 되면, 자동으로 해당 값이 정수형인지 실수형인지 Type 을 구분해 주기 때문에 사용하기에 좀더 편리한 부분이 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;204&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uBkp8/btqRjeNc1HC/iKAB1kuEwVn7hz78MtKIfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uBkp8/btqRjeNc1HC/iKAB1kuEwVn7hz78MtKIfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uBkp8/btqRjeNc1HC/iKAB1kuEwVn7hz78MtKIfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuBkp8%2FbtqRjeNc1HC%2FiKAB1kuEwVn7hz78MtKIfK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;204&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;가장 많이 사용되는 숫자 Type의 종류는 아래와 같습니다.&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. int&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;- int는 정수형 입니다. (ex, 0, -1, -2, 1, 2 ...)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 영어로 integer, 파이썬에서는 줄여서 int 라고 표현합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 기본적으로 int형인 경우 소수점을 제외(소수점 뒤는 버림)하고 정수형태의 값을 변환하여 출력 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 만약 실수형 값을 정수형으로 변환 한다고 하면 아래와 같이 소수점은 제외하고 출력이 되게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;161&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAHW12/btqRjfZDzpY/H1flnzmruAt6AGqOg5EWc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAHW12/btqRjfZDzpY/H1flnzmruAt6AGqOg5EWc1/img.png&quot; data-alt=&quot;[ ex, 3.8 실수형을 정수형으로 변경시 3 으로 출력 ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAHW12/btqRjfZDzpY/H1flnzmruAt6AGqOg5EWc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAHW12%2FbtqRjfZDzpY%2FH1flnzmruAt6AGqOg5EWc1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;161&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ ex, 3.8 실수형을 정수형으로 변경시 3 으로 출력 ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. float&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;- float는 실수형 입니다. (ex, 0.1, -1.1, -2.2, 1.1, 2.2 ...)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 영어로 &lt;span style=&quot;color: #000000;&quot;&gt;floating-point&lt;/span&gt;, 파이썬에서는 줄여서 float 라고 표현합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- float는 결국 소수점이 붙는 숫자를 처리하기 위해 사용됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결국 int(정수형)와 float(실수형)의 가장 큰 차이는 소수점이 있느냐 없느냐 차이입니다.&lt;/p&gt;
&lt;p&gt;프로그램 코딩 시 숫자 처리하는 부분에 있어 위 2가지만 알고 있으면 ,기본적인 숫자 처리 부분은 크게 어려움이 없을 것으로 생각됩니다.&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/3</guid>
      <comments>https://nick2ya.tistory.com/3#entry3comment</comments>
      <pubDate>Thu, 24 Dec 2020 13:16:54 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 파이썬 장단점</title>
      <link>https://nick2ya.tistory.com/2</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IT생활을 하는 대부분의 사람들이라면 파이썬 이라고 하는 언어에 대해 한번씩은 들어 보았을 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 유명하디 유명한 파이썬에 대해 간략히 살펴보고 넘어가도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Python 인기 어느정도?&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;TIOBE Index 라고 하는 사이트는 프로그래밍 언어들에 대해 과거부터 현재까지 얼마나 인기 있었는지를 종합적으로 판단하여 순위를 선정하여 제공해 주는 곳입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;아래 정보는 2020년 기준 정보이며, 파이썬의 경우 3위에 랭크되어 있는 것을 확인할 수 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 사이트에 따르면 파이썬의 인기가 어느정도인지 대략적으로 실감을 할 수 있는 부분입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bubCGk/btqRcHpkgrr/nnxCMyW2RAWUy2tzKPyeh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bubCGk/btqRcHpkgrr/nnxCMyW2RAWUy2tzKPyeh0/img.png&quot; data-alt=&quot;[ 출저 : TIOBE ]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bubCGk/btqRcHpkgrr/nnxCMyW2RAWUy2tzKPyeh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbubCGk%2FbtqRcHpkgrr%2FnnxCMyW2RAWUy2tzKPyeh0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 출저 : TIOBE ]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;자 그럼 이런 인기 있는 프로그래밍 언어인 파이썬이 도대체 어떤 장점이 있어 많은 사람들의 선택을 받아 이렇게 사용되고 있는지 장/단점에 대해 살펴 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Python 장/단점&lt;/b&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;제가 개인적으로 사용해보고 느낀 부분들을 간략히 정리해보면,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 장 점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;1) 다른 언어들(ex, C, C++, Java 등)에 비해 배우기 쉽다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; - 구문자체가 간결하여 초보자가 배우기에 쉬운 편입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; - 이런 부분 때문에 미국에서는 초등학생들에게 코딩 교육을 할때 파이썬을 많이 사용한다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;2) 생산성이 뛰어나다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; - 배우기 쉽고 코드 자체가 간결하기 때문에 결과물이 다른 언어에 비해 빨리 나올 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;3) 다양한 라이브러리 및 다양한 예제가 많다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- 많은 사람들이 사용하다보니 다양한 라이브러리가 제공되어 필요한 라이브러리를 손쉽게 다운받아 사용이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- 그리고 다양하고 많은 예제들이 인터넷에 존재하기 때문에 필요한 예제 코드를 가져와 자기 입맛에 맞게 활용 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 단 점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;1) 속도가 느리다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- C와&amp;nbsp;C++은&amp;nbsp;소스코드를&amp;nbsp;기계어로&amp;nbsp;컴파일해서&amp;nbsp;실행파일을&amp;nbsp;만들어&amp;nbsp;실행하는&amp;nbsp;컴파일&amp;nbsp;언어라&amp;nbsp;속도가&amp;nbsp;빠른&amp;nbsp;편입니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파이썬의&amp;nbsp;경우에는&amp;nbsp;인터프리터&amp;nbsp;언어로서&amp;nbsp;코드를&amp;nbsp;한줄씩&amp;nbsp;읽어&amp;nbsp;내려가며&amp;nbsp;실행하는&amp;nbsp;언어라&amp;nbsp;컴파일&amp;nbsp;언어들에&amp;nbsp;비해&amp;nbsp;속도가&amp;nbsp;느립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;2) 취업이 어렵다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;- 개발자를 전문 직업으로 생각하고 있는 분인 경우 파이썬 하나만 마스터 한다고 해서 취업하기는 현재로서는 쉽지 않을 거라고 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;아직 국내시장은 전통적인 언어(ex, C, C++, Java 등)를 주언어로 사용하고 있기 때문에 해당 언어를 사용할 수 있는 인재를 더 우선적으로 채용할 것이며, 파이썬의 경우 다른 언어들에 비해 배우기 쉬운 편이라 전문적인 개발자 분들은 금방 파이썬에 적응하여 필요한 결과물을 만들어 낼 수 있기 때문에 주언어를 파이썬으로 잡고 취업하기에는 조금 힘든 부분이 존재할 것으로 생각됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Development/파이썬 [Python]</category>
      <author>요체크다</author>
      <guid isPermaLink="true">https://nick2ya.tistory.com/2</guid>
      <comments>https://nick2ya.tistory.com/2#entry2comment</comments>
      <pubDate>Thu, 24 Dec 2020 00:58:02 +0900</pubDate>
    </item>
  </channel>
</rss>