<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>힘내라 일처리</title>
    <link>https://keepworking.tistory.com/</link>
    <description>이것저것 개발관련 글을 쓰려구 해요</description>
    <language>ko</language>
    <pubDate>Tue, 7 Apr 2026 15:22:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>일처리</managingEditor>
    <image>
      <title>힘내라 일처리</title>
      <url>https://tistory1.daumcdn.net/tistory/3812864/attach/1ce5213cb8e24e4bb23c2ecab11dbd81</url>
      <link>https://keepworking.tistory.com</link>
    </image>
    <item>
      <title>개인 개발 환경 구성 소개</title>
      <link>https://keepworking.tistory.com/51</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일한 지 한 10년 차 정도 된 거 같은데 점점 개발 환경에 대한 구성이 정립되어 가는 것 같아서 이번 기회에 이를 공유하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;PC 구성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고성능 Linux PC (개발및 빌드용)&lt;/li&gt;
&lt;li&gt;저성능 Window PC 또는 노트북 (GUI 및 SSH Client용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC구성은 위와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 업무는 Yocto를 빌드하거나 AOSP를 빌드하는 일이 많음에 따라 CPU자원을 아주 많이 소비하는데, 빌드가 진행 되는 동안에는 코드 편집이나, 웹 서핑, 사내 메신저를 통한 채팅등의 업무에 영향이 감에 따라 빌드가 진행되는 PC는 완전히 분리해야 한다.&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;실제 개발 업무는 SSH를 통해서 많이 이루어진다, 복잡한 코드 수정 작업은 vscode를 통해 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Linux 단 기본 패키지&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Byobu -&amp;gt; &lt;a href=&quot;https://keepworking.tistory.com/20&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://keepworking.tistory.com/20&lt;/a&gt; 해당 글에서 소개한 적이 있다.&lt;/li&gt;
&lt;li&gt;Lazygit&lt;/li&gt;
&lt;li&gt;tldr&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 정도인 듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Docker&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Docker는 기본적인 개발환경의 형상을 세부적으로 관리하는 데 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/keepworking/docker-on-myhome&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/keepworking/docker-on-myhome&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1745752038116&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - keepworking/docker-on-myhome: dev env management settings&quot; data-og-description=&quot;dev env management settings. Contribute to keepworking/docker-on-myhome development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/keepworking/docker-on-myhome&quot; data-og-url=&quot;https://github.com/keepworking/docker-on-myhome&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/diacU8/hyYIjfDtaU/xLSuLibx2z1WfZ1B6PakUK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/gmIEG/hyYMb1T7xS/waJrBS9mwGTJPN0ZtGi23k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/keepworking/docker-on-myhome&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/keepworking/docker-on-myhome&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/diacU8/hyYIjfDtaU/xLSuLibx2z1WfZ1B6PakUK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/gmIEG/hyYMb1T7xS/waJrBS9mwGTJPN0ZtGi23k/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - keepworking/docker-on-myhome: dev env management settings&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;dev env management settings. Contribute to keepworking/docker-on-myhome development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 github이 내가 실제로 사용하는 Docker를 구성하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 도커 방식은 회사의 시니어 분이 사용하던걸 배워서 내 입맛대로 수정해서 사용하는 중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 특징이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 home dir 마운트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ssh pubkey 재사용 목적&lt;/li&gt;
&lt;li&gt;프로젝트 소스코드는 host에서 별도로 관리&lt;/li&gt;
&lt;li&gt;yocto나 aosp처럼 빌드 과정에서 저장장치에 쓰는 데이터가 많은 경우 경우, docker의 볼륨을 사용하는 경우 io성능이 많이 떨어짐에 따라 직접 마운트 해서 사용하는 것이 적절하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 파일 시스템에 작성하는 게 아니라 overlayFS를 사용함에 따라 Upper와 Lower을 비교해서 파일을 읽고 쓰는데 추가 비용이 발생함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;i&gt;--rm -it를&lt;/i&gt; 통한 세션 실행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발에 사용되는 패키지를 지속적으로 관리하도록 유도&lt;/li&gt;
&lt;li&gt;불필요한 패키지가 지속 적으로 누적되는 것 예방&lt;/li&gt;
&lt;li&gt;컨테이너 세션 관리의 번거로움 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Base Docker이미지 상속
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주로 애용하는 패키지들이 있는데 이러한 것들을 공통으로 사용하기 위함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 구조로 구성하여 사용하고 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1745754686325&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-on-myhome$ tree --dirsfirst
.
├── aosp
│&amp;nbsp;&amp;nbsp; ├── build.sh
│&amp;nbsp;&amp;nbsp; ├── Dockerfile
│&amp;nbsp;&amp;nbsp; └── run.sh
├── default
│&amp;nbsp;&amp;nbsp; ├── build.sh
│&amp;nbsp;&amp;nbsp; ├── Dockerfile
│&amp;nbsp;&amp;nbsp; └── run.sh
├── example
│&amp;nbsp;&amp;nbsp; ├── build.sh
│&amp;nbsp;&amp;nbsp; ├── Dockerfile
│&amp;nbsp;&amp;nbsp; └── run.sh
├── nodejs
│&amp;nbsp;&amp;nbsp; ├── build.sh
│&amp;nbsp;&amp;nbsp; ├── Dockerfile
│&amp;nbsp;&amp;nbsp; └── run.sh
├── optee
│&amp;nbsp;&amp;nbsp; ├── build.sh
│&amp;nbsp;&amp;nbsp; ├── Dockerfile
│&amp;nbsp;&amp;nbsp; └── run.sh
├── yocto
│&amp;nbsp;&amp;nbsp; ├── build.sh
│&amp;nbsp;&amp;nbsp; ├── Dockerfile
│&amp;nbsp;&amp;nbsp; └── run.sh
├── build.sh
├── Dockerfile
└── LICENSE&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;h4 data-ke-size=&quot;size20&quot;&gt;Byobu&lt;/h4&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;ssh로 작업하다가 창을 종료하면 다시 켰을때 작업 중인 디렉터리로 다시 찾아가거나 하는 경험을 해봤다면 해당 byobu를 사용하는 걸 추천한다.&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;창을 닫더라도 다시 byobu에 접속하면 이전 작업으로 돌아갈 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://keepworking.tistory.com/20&quot;&gt;https://keepworking.tistory.com/20&lt;/a&gt; 해당 글에 자세한 사용법을 정리했으니 둘러보면 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmMURL/btsNCAL7f3m/A6CSFUSQ5p2Zq5ejRMFPZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmMURL/btsNCAL7f3m/A6CSFUSQ5p2Zq5ejRMFPZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmMURL/btsNCAL7f3m/A6CSFUSQ5p2Zq5ejRMFPZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmMURL%2FbtsNCAL7f3m%2FA6CSFUSQ5p2Zq5ejRMFPZ1%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;1046&quot; height=&quot;652&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;652&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;보통 이런 식으로 docker 환경과 함께 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Lazygit&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git 명령어를 더 쉽게 다루기 위한 TUI도구인데, 변경사항을 브라우징 하거나 커밋 시에 부분적으로 선택해서 커밋하는 작업을 수행할 때 아주 용이하다. git 명령어에 능숙하더라도 실용성 측면에서 권장하는 도구이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단축키 구성이 간단해 진입장벽이 낮으니 아직 그냥 git을 사용하는 사람이나 gui를 사용하는 사람은 이참에 lazygit을 사용하면 좋을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JMBMd/btsNARu0QH7/k6GOtAQvlTB02Lgs4Bj4e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JMBMd/btsNARu0QH7/k6GOtAQvlTB02Lgs4Bj4e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JMBMd/btsNARu0QH7/k6GOtAQvlTB02Lgs4Bj4e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJMBMd%2FbtsNARu0QH7%2Fk6GOtAQvlTB02Lgs4Bj4e1%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;1090&quot; height=&quot;696&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;696&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;h4 data-ke-size=&quot;size20&quot;&gt;tldr&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 기본 명령어들을 사용하다 가끔 기억이 안 날 때가 있는데 해당 명령어들의 치트시트를 제공해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar의 경우 자주 사용하니 손에 익더라도 unrar은 손에 익지 않을 때 빠르게 사용법을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;696&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blJXhC/btsNBCRqu0M/R7LWBo2UlY8YkPO1kn8aik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blJXhC/btsNBCRqu0M/R7LWBo2UlY8YkPO1kn8aik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blJXhC/btsNBCRqu0M/R7LWBo2UlY8YkPO1kn8aik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblJXhC%2FbtsNBCRqu0M%2FR7LWBo2UlY8YkPO1kn8aik%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;1090&quot; height=&quot;696&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;696&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;이렇게 직접 적인 사용법이 나온다. man을 읽는 것보다 직관적이다.&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;h3 data-ke-size=&quot;size23&quot;&gt;Windows 단 기본 패키지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별로 특별한 건 설치하지 않는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Windows 터미널&lt;/li&gt;
&lt;li&gt;VSCode&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 정도면 충분하다.&lt;/p&gt;</description>
      <category>기록</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/51</guid>
      <comments>https://keepworking.tistory.com/51#entry51comment</comments>
      <pubDate>Sun, 27 Apr 2025 21:01:11 +0900</pubDate>
    </item>
    <item>
      <title>AOSP Build sandboxing disabled due to nsjail error. 해결법 Ubuntu 24.04 (w. Docker Ubuntu 22.04) / Android 16</title>
      <link>https://keepworking.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1745594462320&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;00:20:04 Build sandboxing disabled due to nsjail error.

============================================
PLATFORM_VERSION_CODENAME=Baklava
PLATFORM_VERSION=Baklava
TARGET_PRODUCT=aosp_cf_x86_64_phone
TARGET_BUILD_VARIANT=eng
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=silvermont
TARGET_2ND_ARCH=x86
TARGET_2ND_ARCH_VARIANT=silvermont
HOST_OS=linux
HOST_OS_EXTRA=Linux-6.8.0-55-generic-x86_64-Ubuntu-22.04.5-LTS
HOST_CROSS_OS=windows
BUILD_ID=BP1A.250405.007
OUT_DIR=out
============================================&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;위와같이 nsjail 을 통한 샌드박싱에 실패한다는 오류가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(여기서는 docker를 통해서 실행하기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 오류가 나오더라도 진행은 할수 있으나 나중에 가서 결국 Trusty 를 빌드하는 과정에서 오류가 나서 진행이 안된다.&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;blockquote data-ke-style=&quot;style2&quot;&gt;I can confirm that with docker 19.03 or later, using&amp;nbsp;--security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt systempaths=unconfined&amp;nbsp;works instead of&amp;nbsp;--privileged&amp;nbsp;(the patch in #10 was submitted). Still turning off a lot of security, but better than before if you still wanted to run nsjail.&lt;br /&gt;It should be possible to create minimally-modified apparmor &amp;amp; seccomp profiles with just the cutouts that we need instead of leaving them unconfined as well.&lt;br /&gt;&lt;b&gt;https://issuetracker.google.com/issues/123210688?pli=1&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 방식이 일반적이기도 하고 효과가 있었으나, 최신 ubuntu의 apparmor 정책은 새로운 사용자 네임스페이스에서 대응이 다른듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1745594674945&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[3659605.200351] audit: type=1400 audit(1745592489.725:4281): apparmor=&quot;AUDIT&quot; operation=&quot;userns_create&quot; class=&quot;namespace&quot; info=&quot;Userns create - transitioning profile&quot; profile=&quot;unconfined&quot; pid=2396683 comm=&quot;nsjail&quot; requested=&quot;userns_create&quot; target=&quot;unprivileged_userns&quot;
[3659605.207663] audit: type=1400 audit(1745592489.732:4282): apparmor=&quot;DENIED&quot; operation=&quot;mount&quot; class=&quot;mount&quot; info=&quot;failed mntpnt match&quot; error=-13 profile=&quot;unprivileged_userns&quot; name=&quot;/&quot; pid=2396684 comm=&quot;nsjail&quot; flags=&quot;rw, rprivate&quot;
[3659656.037824] audit: type=1400 audit(1745592540.562:4283): apparmor=&quot;AUDIT&quot; operation=&quot;userns_create&quot; class=&quot;namespace&quot; info=&quot;Userns create - transitioning profile&quot; profile=&quot;unconfined&quot; pid=2397831 comm=&quot;nsjail&quot; requested=&quot;userns_create&quot; target=&quot;unprivileged_userns&quot;
[3659656.038686] audit: type=1400 audit(1745592540.563:4284): apparmor=&quot;DENIED&quot; operation=&quot;capable&quot; class=&quot;cap&quot; profile=&quot;unprivileged_userns&quot; pid=2397832 comm=&quot;nsjail&quot; capability=6  capname=&quot;setgid&quot;
[3659656.038731] audit: type=1400 audit(1745592540.563:4285): apparmor=&quot;DENIED&quot; operation=&quot;capable&quot; class=&quot;cap&quot; profile=&quot;unprivileged_userns&quot; pid=2397832 comm=&quot;nsjail&quot; capability=1  capname=&quot;dac_override&quot;
[3659656.038752] audit: type=1400 audit(1745592540.563:4286): apparmor=&quot;DENIED&quot; operation=&quot;mount&quot; class=&quot;mount&quot; info=&quot;failed mntpnt match&quot; error=-13 profile=&quot;unprivileged_userns&quot; name=&quot;/&quot; pid=2397832 comm=&quot;nsjail&quot; flags=&quot;rw, rprivate&quot;&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;새로운 사용자 네임스페이스에서는 unprivileged_userns 라는 별도 ns가 프로파일로 등록 되는 듯 하다. 이때 해당 프로파일이 여러 기능에서 제한이 됨에 따라 오류가 발생하는 것으로 확인이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 최신 ubuntu 24.04 에서 docker를 통한 aosp빌드시 nsjail에서 오류가 난다면 해당 도커 실행 인수로 다음을 넣어주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1745595214056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--privileged --security-opt apparmor=linux-sandbox&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;설명&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 사용되는 프로필은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1745595256821&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# This profile allows everything and only exists to give the
# application a name instead of having the label &quot;unconfined&quot;

abi &amp;lt;abi/4.0&amp;gt;,
include &amp;lt;tunables/global&amp;gt;

profile linux-sandbox /usr/libexec/@{multiarch}/bazel/linux-sandbox flags=(unconfined) {
  userns,

  # Site-specific additions and overrides. See local/README for details.
  include if exists &amp;lt;local/linux-sandbox&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 프로세스를 위한 프로필이나, 일반 unconfined는 userns 시 unprivileged_userns 가 됨에 따라 userns,권한이 추가된 unconfined 프로파일이 있어 샌드박싱 기능등에 제약이 안생긴다. 이를 docker에 적용하여 aosp빌드 과정에서 발생하는 권한 이슈를 해결하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀더 정석적으로는 별도 프로필을 만드는게 좋으나 이걸로 충분하다.&lt;/p&gt;</description>
      <category>기록</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/50</guid>
      <comments>https://keepworking.tistory.com/50#entry50comment</comments>
      <pubDate>Sat, 26 Apr 2025 00:39:24 +0900</pubDate>
    </item>
    <item>
      <title>RFC 번역 사이트 개발 후기</title>
      <link>https://keepworking.tistory.com/47</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 tls관련 기능을 개발하게 되어서 rfc문서를 보는 일이 많아졌는데 막상 나에게는 해당 문서를 읽는 것이 많이 어려웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 영어 실력의 부족&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 번역기 사용의 어려움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 먼저의 영어 실력의 부족함은 내가 단기간에 커버할 방법이 없다 물론 꾸준히 공부할 필요는 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번역기 사용의 어려움 같은 경우에는 rfc원본 문서의 컨텐츠속 본문이 중간에 잘려있는 (종이 출력시 폭맞춤을 위한 줄바꿈) 영역이 번역기에 혼란을 주는 것이 컸다. 이부분의 경우 어느정도 전처리가 가능할 것이라 판단 했고. 기능 구현을 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Su0Js/btsARhfaSvl/lK20HTVbcRc9YxRKeO6TOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Su0Js/btsARhfaSvl/lK20HTVbcRc9YxRKeO6TOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Su0Js/btsARhfaSvl/lK20HTVbcRc9YxRKeO6TOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSu0Js%2FbtsARhfaSvl%2FlK20HTVbcRc9YxRKeO6TOK%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;845&quot; height=&quot;499&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 컨텐츠가 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 먼저는 깃에 첨부해서 볼 수있는 md파일 형식으로 만들고자 했고. 번역 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 내에서 좋게 평가 해주신거에 자신감이 생겨서 여기저기 올려보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://news.hada.io/topic?id=11996&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://news.hada.io/topic?id=11996&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1700836605158&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;IETF RFC문서 한글 번역 서비스 | GeekNews&quot; data-og-description=&quot;IETF의 RFC문서를 한글로 번역해서 볼 수 있는 웹 서비스 입니다.최근들어 RFC문서를 볼 일이 생겨서 개인적으로 사용하려고 만들게 되었는데 평이 좋아서 이곳에도 소개 드리고 싶어서 공유 드립&quot; data-og-host=&quot;news.hada.io&quot; data-og-source-url=&quot;https://news.hada.io/topic?id=11996&quot; data-og-url=&quot;https://news.hada.io/topic?id=11996&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIKW4P/hyUB7QPUJI/a8sexjQxjekmbQCRpO1l1k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/7giLc/hyUB7pM7AA/8jIAFb64GVyKXRBQHCkXk1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://news.hada.io/topic?id=11996&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://news.hada.io/topic?id=11996&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIKW4P/hyUB7QPUJI/a8sexjQxjekmbQCRpO1l1k/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/7giLc/hyUB7pM7AA/8jIAFb64GVyKXRBQHCkXk1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;IETF RFC문서 한글 번역 서비스 | GeekNews&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;IETF의 RFC문서를 한글로 번역해서 볼 수 있는 웹 서비스 입니다.최근들어 RFC문서를 볼 일이 생겨서 개인적으로 사용하려고 만들게 되었는데 평이 좋아서 이곳에도 소개 드리고 싶어서 공유 드립&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;news.hada.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긱뉴스에 글을 올려도 보고 okky랑 kldp에도 올려봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사하게도 긍정적으로 봐주셨고, 의견도 주셨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제법 많은 분들의 눈에 들어서 그런지 번역된 컨텐츠가 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 많은게 아니었는지 꽤 큰돈이 결제 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠깐 서버에 접속되서 번역된 컨텐츠들 기준으로 계산해보니 rfc문서 하나당 평균 1.5달러 정도&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nfb8z/btsAPKPFGCt/6kuOzOSiQ16xkWbevruQ6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nfb8z/btsAPKPFGCt/6kuOzOSiQ16xkWbevruQ6k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nfb8z/btsAPKPFGCt/6kuOzOSiQ16xkWbevruQ6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnfb8z%2FbtsAPKPFGCt%2F6kuOzOSiQ16xkWbevruQ6k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;490&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 많은 사람들의 눈에 띈 덕에 급격하게 늘었을 거라 생각 하고 추후에 필요한 사람들이 간헐 적으로 쓸때는 이렇게 까지는 많이 보지 않으리라는 생각이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수량이 너무 많으면 나중에 대처를 좀 해야할듯 싶다.&lt;/p&gt;</description>
      <category>기록</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/47</guid>
      <comments>https://keepworking.tistory.com/47#entry47comment</comments>
      <pubDate>Fri, 24 Nov 2023 23:57:17 +0900</pubDate>
    </item>
    <item>
      <title>Audio Framework - 오디오 기본</title>
      <link>https://keepworking.tistory.com/45</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사를 이직하면서 이제 한동안 리눅스 및 안드로이드 환경에서 오디오 프레임웍을 다루게 될 일이 없어서 기록이라도 남겨 둘겸 글을 쓰고자 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PCM - 가장 기본적인 오디오 데이터 인코딩 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Pulse Code Modulation) 펄스 코드 변조라는 의미로, 현실 세계의 파형을 디지털화 해서 다룰 수 있도록 한 대상이라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현실의 오디오의 파형이 표본화 -&amp;gt; 양자화 -&amp;gt; 부호화 일렬의 과정을 거치면서 생성된 음성 데이터가 순서대로 나열된다고 생각 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이렇게 저장된 PCM데이터를 다시 읽어들일때 필요한정보가 몇가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Sample Rate ( 1초에 몇번 샘플링을 했는지 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아날로그 신호를 수집하는 속도에 대한 정보이다. 48KHz 로 수집했는데 44.1KHz로 재생하면 원래 녹음시간 보다 길게 재생될거고 말소리도 뭔가 늘려서 말하는 것처럼 들리게된다고 본다. 동일 시간 내에 수집된 횟수가 많을 수록 해상도가 좋아진다고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PCM속도를 어느정도의 속도로 재생하면 좋은지에 대한 지표라고 보면 된다.&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. PCM Format (샘플링된 데이터를 어떻게 저장했는지)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수집된 하나의 값을 몇 비트로 저장 했는지에 대한 내용이다. 이는 오디오의 해상도에 직접적으로 연관이 된다, 바이트 수가 크면 클수록 전채 진폭에서 정확한 위치를 나타내기 유리하기 때문이다, PCM데이터는 결국 각 샘플 간의 구별없이 주욱 나열하기 때문에 2바이트씩 읽을 지 3바이트씩 읽을지 정확히 알아야 소리를 제대로 재생 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Channel Count (마이크 몇개 썼고, 스피커 몇개 쓸건지)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 뭐 8채널 16채널 하면서 스피커가 너무 많다. 각 스피커에서 나올 소리들도 조금씩 다르기 때문에, 스피커의 갯수만큼 오디오가 전달이 되어야 한다. PCM데이터는 채널마다 샘플을 번갈아 가면서 저장한다 16bit pcm format에 2ch 이라면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L(2byte), R(2byte), L(2byte), R(2byte), L(2byte), R(2byte), L(2byte), R(2byte), L(2byte), R(2byte) ....&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;이런것들이 PCM 데이터를 쓰고, 읽을 때 고려되는 내용들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에 소개 할건 PCM인코딩 방식을 사용하는 가장 대표적인 오디오 컨테이너 인 .wav 에 대해 설명하려고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;WAV - 가장 기본적인 오디오 컨테이너&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적이라는 것도 내기준이긴 하지만, 가장 흔히 보는 오디오 컨테이너 이니 이걸로 소개하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PCM 데이터만 있는 파일이 있으면 위에 서 이야기한 Sample Rate, PCM Format, Channel Count 에 대한 정보가 따로 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAV는 파일 헤더에 이러한 정보를 추가하고 뒤에 이어서 PCM 데이터를 넣어주는 구조를 가진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJpXKg/btsg2ZwQk9J/CRM9DsGY2mfl6HcqKuaxx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJpXKg/btsg2ZwQk9J/CRM9DsGY2mfl6HcqKuaxx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJpXKg/btsg2ZwQk9J/CRM9DsGY2mfl6HcqKuaxx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJpXKg%2Fbtsg2ZwQk9J%2FCRM9DsGY2mfl6HcqKuaxx1%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;677&quot; height=&quot;358&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 서버에 있는 wav파일 아무거나 찾아서 hex view로 가져와 봤다. AOA 뭐라고 적힌거 보니까 아이돌 앨범 곡인듯.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괜히 보여줄려는거 말고 다른 복잡한게 있어서 좀더 단순한걸로 가져와야 겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z9TbG/btsg0oEoxDI/4ksXxF0btwCnZuK89uBNKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z9TbG/btsg0oEoxDI/4ksXxF0btwCnZuK89uBNKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z9TbG/btsg0oEoxDI/4ksXxF0btwCnZuK89uBNKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz9TbG%2Fbtsg0oEoxDI%2F4ksXxF0btwCnZuK89uBNKk%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;618&quot; height=&quot;215&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마음에 든다, 단순하고, 보기 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wav 파일 헤더에 대한 자료는 다음 링크를 보면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.fileformat.com/audio/wav/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.fileformat.com/audio/wav/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684772826259&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;WAV - Waveform Audio File Format&quot; data-og-description=&quot;Learn about WAV file format and APIs that can create and open WAV files.&quot; data-og-host=&quot;docs.fileformat.com&quot; data-og-source-url=&quot;https://docs.fileformat.com/audio/wav/&quot; data-og-url=&quot;https://docs.fileformat.com/audio/wav/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.fileformat.com/audio/wav/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.fileformat.com/audio/wav/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;WAV - Waveform Audio File Format&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn about WAV file format and APIs that can create and open WAV files.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.fileformat.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPgQBU/btsg1WNSF1P/ec5opLSTAGAlsXsiuM4EY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPgQBU/btsg1WNSF1P/ec5opLSTAGAlsXsiuM4EY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPgQBU/btsg1WNSF1P/ec5opLSTAGAlsXsiuM4EY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPgQBU%2Fbtsg1WNSF1P%2Fec5opLSTAGAlsXsiuM4EY1%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;1228&quot; height=&quot;716&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 각 위치별 데이터가 무얼 나타내는 지에 대한 정보인데 이렇게 읽으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2396&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd5Lmv/btsg3VAWa8L/XksBXWUYn0EKNdaFyEShp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd5Lmv/btsg3VAWa8L/XksBXWUYn0EKNdaFyEShp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd5Lmv/btsg3VAWa8L/XksBXWUYn0EKNdaFyEShp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd5Lmv%2Fbtsg3VAWa8L%2FXksBXWUYn0EKNdaFyEShp0%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;2396&quot; height=&quot;978&quot; data-origin-width=&quot;2396&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;진폭에 대해서 - 진폭과 음량의 관계?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 진폭과 우리 귀에서 들리는 음량의 상관 관계에 대해서 나타내면 얼추 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;베버-페히너의 법칙에 따라서 ( 얼추 사람의 감각기관은 로그 스케일이라 신호가 약할때 변화에 민감하고 신호가 크면 변화에 둔감해진다는 법칙 ) 소리를 받아들이고 인식한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 진폭으로 정비례하게 올리면 사람 귀에는 초반에 급격히 커지고, 후반에는 천천히 커지는 것으로 보이게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고로, 지수 함수를 이용해서 소리를 키워야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3aldu/btsg0OCR2GJ/EN6k2upENoa4BsMVkIpV7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3aldu/btsg0OCR2GJ/EN6k2upENoa4BsMVkIpV7K/img.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;415&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3aldu/btsg0OCR2GJ/EN6k2upENoa4BsMVkIpV7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3aldu%2Fbtsg0OCR2GJ%2FEN6k2upENoa4BsMVkIpV7K%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;914&quot; height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9JiNX/btsgTidDlfo/FU3AwF1FNUGvf6PlSymZ6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9JiNX/btsgTidDlfo/FU3AwF1FNUGvf6PlSymZ6K/img.png&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;415&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9JiNX/btsgTidDlfo/FU3AwF1FNUGvf6PlSymZ6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9JiNX%2FbtsgTidDlfo%2FFU3AwF1FNUGvf6PlSymZ6K%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;914&quot; height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나름 정리한건데 이미지 크게 확대해서 보면 잘 보일거라 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리하여 오디오의 음량을 표현하는 단위는 데시벨 단위를 사용한다. 다만 이제 디지털 오디오 시스템에서는 약간의 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디지털 출력 으로 나오는 음압은 전력량에 비례한다. 전류와 전압의 곱으로서 소비되는 에너지가 그대로 음압으로 나온다고 이해 하면 되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 디지털 오디오 시스템 내부에서는 전압을 통해서 제어하기 때문에 로그 스케일이 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전력에 의한 음압이, 소리의 크기가 10배가 될때, 10dB 가 되지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전압을 기준으로 했을때 전압이 10배가 되면, 전력은 100배가 되고, 20dB가 된다.&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;V=IR -&amp;gt; I=V/R,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;W = I * V -&amp;gt; W = V/R * V -&amp;gt; W = V^2/R&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R = 1 이고, V = 1 이 기준이라 했을때, 1 = 1^2/1, 100 = 10^2/1 이런식으로 실제 값이 100배로 뛰게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 전력 량은 전압의 제곱에 비례 하므로, 20Log(value/base) 기준으로 계산 하도록 해야한다.&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;여기서 추가로, 스피커에 출력되는 신호는 전압 신호이기 때문에 20Log 스케일 을 사용한다. ( 음량 20dB가 전압의 10배 )&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;또한 최대 진폭이 내는 최대 음량은 보통 최종 DAC와 AMP, 스피커가 결정 하기 때문에 소프트웨어 내부에서는 MAX치 기준으로 얼마나 줄어드는지 ~ 에 대한 목적으로 -dB 단위를 사용한다.&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;그래서 최대 음량을 기준으로 dB 를 계산 하고 싶다면 10^(dB/20) 의 수식을 이용 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-20dB를 줄이고 싶다면 10^(-20/20) = 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;결국 최대 음량 기준 -20dB를 줄인 오디오 pcm 을 만들고 싶다면, 각 샘플에 대해 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;여기서는 pcm볼륨을 조절하지만 오디오 장치의 볼륨을 조절 할때도 사용하니 해당 수식은 잊지 않고 기억하면 유리하다.&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;다음에는 실제 alsa와 같은 리눅스 디바이스에서 오디오를 재생할때 사용되는 요소들에 대해 설명하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버퍼 레이턴시 피리어드 피리어드 카운트 등등...&amp;nbsp;&lt;/p&gt;</description>
      <category>기록/오디오 프레임웍</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/45</guid>
      <comments>https://keepworking.tistory.com/45#entry45comment</comments>
      <pubDate>Tue, 23 May 2023 02:51:25 +0900</pubDate>
    </item>
    <item>
      <title>콘솔에서 로그 하이라이트 하는법 알아보기 : hl (pipeline highlighter)</title>
      <link>https://keepworking.tistory.com/44</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;프로젝트 소개: hl - pipeline highlighter&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/keepworking/hl&quot;&gt;https://github.com/keepworking/hl&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680680630019&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - keepworking/hl: pipeline highlighter&quot; data-og-description=&quot;pipeline highlighter. Contribute to keepworking/hl development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/keepworking/hl&quot; data-og-url=&quot;https://github.com/keepworking/hl&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/B11uZ/hySaUMA66H/PSkQdShTv8N43un6UpGPx0/img.png?width=1200&amp;amp;height=600&amp;amp;face=916_127_989_207&quot;&gt;&lt;a href=&quot;https://github.com/keepworking/hl&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/keepworking/hl&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/B11uZ/hySaUMA66H/PSkQdShTv8N43un6UpGPx0/img.png?width=1200&amp;amp;height=600&amp;amp;face=916_127_989_207');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - keepworking/hl: pipeline highlighter&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;pipeline highlighter. Contribute to keepworking/hl development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&quot;hl&quot;은 간단한 파이프라인 하이라이트 도구입니다. 주요 목적은 로그 파일이나 텍스트 데이터에서 특정 단어나 패턴을 찾아 텍스트에 색상을 입혀 강조하는 것입니다. 이 도구를 사용하면 데이터를 빠르게 분석하고, 오류나 관심사항을 쉽게 파악할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;장점&lt;/span&gt;&lt;/h3&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;간단한 명령어로 사용이 쉽습니다.&lt;/span&gt;&lt;br /&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;대소문자 구분 없이 검색할 수 있는 옵션을 제공합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;확장된 정규 표현식을 지원합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;단점:&lt;/span&gt;&lt;/h3&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;기능이 매우 단순하고 한정적입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;현재는 리눅스 환경에서만 사용 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&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;&lt;/span&gt;&lt;/h3&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;개발자, 시스템 관리자, 데이터 분석가 등 다양한 분야의 사용자들이 이 도구를 사용해 로그 파일이나 텍스트 데이터에서 특정 패턴을 찾아내는 데 도움을 받을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;옵션 설명:&lt;/span&gt;&lt;/h3&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;-i: 대소문자를 무시합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-E: 확장된 정규 표현식을 지원합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-c: 색상을 변경합니다. 각 글자 'c'가 추가될 때마다 다른 색상이 선택됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-[0~5]: 숫자를 사용하여 색상을 설정합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-b: 밝은 색상으로 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;사용 예시:&lt;/span&gt;&lt;/h3&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;로그 파일에서 &quot;fail&quot; 또는 &quot;error&quot;와 같은 단어를 찾아서 하이라이트할 경우, 다음과 같이 명령어를 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;adb logcat | hl -iE &quot;fail|error&quot;&lt;/code&gt;&lt;/pre&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;이 명령어는 adb logcat의 출력을 받아 대소문자 구분 없이 &quot;fail&quot;이나 &quot;error&quot;라는 단어가 포함된 텍스트를 하이라이트합니다. 이를 통해 오류나 실패 사례를 빠르게 파악할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6MSbU/btr8eXWhaUS/nvdKkTW2ydwFA5cduWABM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6MSbU/btr8eXWhaUS/nvdKkTW2ydwFA5cduWABM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6MSbU/btr8eXWhaUS/nvdKkTW2ydwFA5cduWABM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6MSbU%2Fbtr8eXWhaUS%2FnvdKkTW2ydwFA5cduWABM0%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;1280&quot; height=&quot;554&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/44</guid>
      <comments>https://keepworking.tistory.com/44#entry44comment</comments>
      <pubDate>Wed, 5 Apr 2023 16:44:37 +0900</pubDate>
    </item>
    <item>
      <title>Caddy2 알아보기 / 자동 HTTPS / 리버스 프록시</title>
      <link>https://keepworking.tistory.com/43</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;caddy-logo.svg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU4dz6/btrYkLDMQph/W9c6iwOSIpf2yHk9xWMN91/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU4dz6/btrYkLDMQph/W9c6iwOSIpf2yHk9xWMN91/tfile.svg&quot; data-alt=&quot;caddy logo&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU4dz6/btrYkLDMQph/W9c6iwOSIpf2yHk9xWMN91/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU4dz6%2FbtrYkLDMQph%2FW9c6iwOSIpf2yHk9xWMN91%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;580&quot; height=&quot;174&quot; data-filename=&quot;caddy-logo.svg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;caddy logo&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Caddy2 에 대해서&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐디 2는 사용하기 쉽고, 빠르고, 안전하도록 설계된 웹 서버 소프트웨어이자 강력한 HTTP/2 서버입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 기능들을 가집니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동 HTTPS: Caddy 2는 Let's Encrypt에서 SSL/TLS 인증서를 자동으로 가져오고 갱신하므로 HTTPS로 웹 사이트를 쉽게 보호할 수 있습니다.&lt;/li&gt;
&lt;li&gt;리버스 프록시: 캐디 2는 리버스 프록시를 지원하므로 단일 IP 주소에서 여러 웹 사이트를 서비스하고 여러 서버에 트래픽을 분산시켜 성능을 향상시킬 수 있습니다.&lt;/li&gt;
&lt;li&gt;간편한 구성: 캐디 2는 읽고 쓰기 쉬운 인간 친화적인 구성 구문을 사용합니다. 단일 캐디 파일을 사용하여 HTTP 및 HTTPS 리디렉션, 콘텐츠 압축 등 웹 사이트의 모든 측면을 구성할 수 있습니다.&lt;/li&gt;
&lt;li&gt;미들웨어 지원: Caddy 2는 사용자 지정 헤더 추가, 파일 업로드 처리, 동적 콘텐츠 제공 등 다양한 작업을 수행할 수 있는 플러그인인 미들웨어를 지원합니다.&lt;/li&gt;
&lt;li&gt;HTTP/2 지원: 캐디 2는 HTTP 프로토콜의 최신 버전인 HTTP/2에 완전히 최적화되어 있습니다. 즉, 웹 사이트 방문자의 페이지 로드 시간이 빨라지고 성능이 향상됩니다.&lt;/li&gt;
&lt;li&gt;로깅 및 메트릭: Caddy 2는 자세한 로그 및 메트릭을 제공하므로 웹 사이트 트래픽을 모니터링 및 분석하고 성능 문제를 진단하고 오류를 추적할 수 있습니다.&lt;/li&gt;
&lt;li&gt;보안 기능: Caddy 2에는 XSS(사이트 간 스크립팅) 공격, CSRF(사이트 간 요청 위조) 공격 등의 보안 기능이 내장되어 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것들은 캐디 2의 주요 기능 중 몇 가지에 불과하다. 캐디 2는 소규모 개인 웹 사이트나 대규모 엔터프라이즈 애플리케이션을 호스팅하려는 경우에 관계없이 다양한 사용 사례를 처리할 수 있는 다목적의 강력한 웹 서버입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Caddy2 와 다른 기존 소프트웨어의 차이점은?&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nginx: Nginx는 가장 널리 사용되는 웹 서버 소프트웨어 중 하나이며 높은 성능, 확장성 및 보안으로 유명합니다. 정적 파일 서비스에서 업스트림 서버에 대한 프록시 요청에 이르기까지 다양한 사용 사례를 처리할 수 있는 다목적 소프트웨어입니다. 주요 장점 중 하나는 시스템 리소스의 효율적인 사용으로 트래픽이 많은 웹 사이트에 적합합니다. 그러나 Nginx는 캐디 2에 비해 학습 곡선이 가파르고 구성 구문이 더 복잡합니다.&lt;/li&gt;
&lt;li&gt;Apache: Apache는 오랫동안 사용되어 온 또 다른 인기 있는 웹 서버 소프트웨어입니다. 그것은 강력한 기능 세트, 광범위한 커뮤니티 지원, 그리고 광범위한 플랫폼과 프로그래밍 언어와의 호환성으로 유명하다. 그러나 Apache는 Nginx만큼 효율적이지 않으며 특히 트래픽 부하가 높을 때 더 많은 시스템 리소스를 사용할 수 있습니다. 또한 캐디 2에 비해 구성 구문이 더 복잡합니다.&lt;/li&gt;
&lt;li&gt;Lighttpd: Lighttpd는 특히 정적 파일을 처리할 때 빠르고 효율적으로 설계된 경량 웹 서버 소프트웨어입니다. 트래픽이 적은 웹 사이트에 적합하거나 동적 콘텐츠를 제공하는 역방향 프록시로 적합합니다. 그러나 Lighttpd는 Nginx나 Apache에 비해 많은 기능이나 광범위한 커뮤니티 지원을 가지고 있지 않습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하면, 캐디 2는 사용 편의성과 고급 기능 사이의 균형을 잘 유지합니다. 특히 중소 웹 사이트의 경우 설치 및 관리가 쉬운 웹 서버를 찾고 있는 개발자에게 적합한 선택입니다. 그러나 트래픽이 많은 웹 사이트를 위한 보다 강력한 솔루션이 필요한 경우 Nginx 또는 Apache가 더 나은 선택일 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Caddy2 설치&lt;/h2&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://caddyserver.com/docs/install&quot;&gt;https://caddyserver.com/docs/install&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Caddy2의 설치 프로세스는 운영 체제에 따라 다릅니다. 공식 설명서는 Windows, macOS, Linux 등을 포함한 다양한 플랫폼에 대한 지침을 제공합니다. 또한 패키지 관리자를 통해 apt, yum, pacman 등의 Caddy2를 설치하는 옵션도 제공합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Caddy2 관리 명령어&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Caddy2 서비스 시작 : `sudo systemctl start caddy`&lt;/li&gt;
&lt;li&gt;Caddy2 서비스 중지 : `sudo systemctl stop caddy`&lt;/li&gt;
&lt;li&gt;Caddy2 서비스 재시작 : `sudo systemctl restart caddy`&lt;/li&gt;
&lt;li&gt;Caddy2 서비스 상태 확인 : `sudo systemctl status caddy`&lt;/li&gt;
&lt;li&gt;Caddy2 서비스 활성화 (부팅 시 자동으로 실행) : `sudo systemctl enable caddy`&lt;/li&gt;
&lt;li&gt;Caddy2 서비스 비활성화 : `sudo systemctl disable caddy`&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Caddy2 리버스 프록시 구성 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 리버스 프록시를 구성해 볼 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;example.com {
    reverse_proxy localhost:8000
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CaddyFile에 다음과 같이 설정하면 example.com에서 포트 8000의 로컬 호스트로 모든 트래픽을 라우팅합니다. 따라서 example.com에 액세스하면 localhost:8000에서 실행 중인 서버로 접속이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 좀더 복잡한 옵션 또한 구성이 가능합니다.&lt;/p&gt;
&lt;pre class=&quot;puppet&quot;&gt;&lt;code&gt;example.com {
    reverse_proxy localhost:8000 {
        header_up Host {host}
        header_up X-Real-IP {remote}
        header_up X-Forwarded-Proto {scheme}
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 구성하면 X-Real-IP 및 X-Forwarded-Proto 헤더를 통해 localhost:8000의 백엔드 서버로 전달됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자동 HTTPS 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Caddy2에서 기본으로 제공하는, SSL 구성 기능의 사용법은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;example.com {
    tls email@example.com
    reverse_proxy localhost:8000
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tls &lt;a href=&quot;mailto:email@example.com&quot;&gt;email@example.com&lt;/a&gt;을 사용하여 인증서 암호화 관리를 위한 이메일 주소를 지정합니다. Caddy2가 실행되면 example.com에 대한 유효한 SSL 인증서를 자동으로 얻고 HTTPS를 통해 사이트 서비스를 시작합니다. SSL 인증서가 만료되기 전에 자동으로 갱신됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tls 이메일 주소는 필수는 아니지만 인증서 만료와 갱신에 대한 알림을 받아 볼 수 있습니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/43</guid>
      <comments>https://keepworking.tistory.com/43#entry43comment</comments>
      <pubDate>Tue, 7 Feb 2023 01:18:37 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 컨테이너 알아보기 - 컨테이너 동작 원리</title>
      <link>https://keepworking.tistory.com/42</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;컨테이너의 동작 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 기술은 간단해 보이지만 자그마치 3개의 커널 기술이 사용된 컴비네이션이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cgroup (Control Group)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템의 자원에 제한을 둠. CPU사용량, 메모리 사용량등에 제한을 줄 수 있음.&lt;/li&gt;
&lt;li&gt;꼭 필 수 인가? 는 잘 모르겠음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;chroot (Change root) 또는 pivot_root
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 시스템의 루트 경로를 바꿈. 새로운 파일 시스템을 만들거나 (임베디드에서 yocto나 buildroot 를 사용하지 않았을때는 이걸로 파일시스템을 직접 구성할 수 있었다. 안에서 패키지도 설치 가능했던걸로 기억 Qemu를 이용하고 그랬어야함.), 웹 호스팅 등을 제공할때 사용됨&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chroot&lt;/code&gt; 는 별도로 취약점 문제가 있어서 이후에는 &lt;code&gt;pivot_root&lt;/code&gt; 를 사용함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;namespace
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네임스페이스는 프로세스가 볼 수 있는 범위를 제한한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mnt&lt;/li&gt;
&lt;li&gt;pid&lt;/li&gt;
&lt;li&gt;net&lt;/li&gt;
&lt;li&gt;ipc&lt;/li&gt;
&lt;li&gt;uid&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 기능들을 바탕으로 프로세스를 실행하면, 해당 프로세스는 자신만의 파일 시스템과 다른 프로세스는 보이지 않고 하위 프로세스만 조회 가능한 상태가 됨. 해당 프로세스 입장에서는 자신 이외에는 아무것도 없는 것처럼 느낄 것이다.&lt;br /&gt;마치 영화 &quot;트루먼쇼&quot;에서 짐 캐리가 연기한 트루먼 버뱅크가 영화 세트장(컨테이너) 밖에 실제 세상이 있는걸 모르던 것처럼.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Pasted image 20230123000531.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzwvwI/btrWRXG47Ue/KfuHThcQkztoXgnVXTkXQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzwvwI/btrWRXG47Ue/KfuHThcQkztoXgnVXTkXQK/img.png&quot; data-alt=&quot;트루먼쇼 포스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzwvwI/btrWRXG47Ue/KfuHThcQkztoXgnVXTkXQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzwvwI%2FbtrWRXG47Ue%2FKfuHThcQkztoXgnVXTkXQK%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;750&quot; height=&quot;1101&quot; data-filename=&quot;Pasted image 20230123000531.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;1101&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너를 보고 트루먼 쇼를 떠올린건 나뿐만은 아닌거 같다. &lt;code&gt;https://www.youtube.com/watch?v=n-l9ccP1zR8&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;go 언어로 단순하게 구성된 프로젝트가 있다. [&lt;a href=&quot;https://github.com/zeyneloz/simple-container-with-go%5D&quot;&gt;https://github.com/zeyneloz/simple-container-with-go]&lt;/a&gt; 이것도 참고해보면 이해하는데 도움이 될듯 하다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/42</guid>
      <comments>https://keepworking.tistory.com/42#entry42comment</comments>
      <pubDate>Tue, 24 Jan 2023 00:20:43 +0900</pubDate>
    </item>
    <item>
      <title>byobu 아주 긴 내용 복사하는 법 알아보기</title>
      <link>https://keepworking.tistory.com/37</link>
      <description>&lt;h1&gt;개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 &lt;code&gt;byobu&lt;/code&gt;를 이용하다보면 여러 여러줄의 내용을 복사하고 싶을 경우가 있을 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2544&quot; data-origin-height=&quot;1321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C5UDY/btrJ6UCaBYk/0c3I2MzVPHpq9qZsKp0Wk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C5UDY/btrJ6UCaBYk/0c3I2MzVPHpq9qZsKp0Wk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C5UDY/btrJ6UCaBYk/0c3I2MzVPHpq9qZsKp0Wk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC5UDY%2FbtrJ6UCaBYk%2F0c3I2MzVPHpq9qZsKp0Wk0%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;2544&quot; height=&quot;1321&quot; data-origin-width=&quot;2544&quot; data-origin-height=&quot;1321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 여러 줄의 출력을 복사하고 싶을 경우에는 보통 &lt;code&gt;shift&lt;/code&gt; + &lt;code&gt;drag&lt;/code&gt; , &lt;code&gt;ctrl&lt;/code&gt; + &lt;code&gt;shift&lt;/code&gt; + &lt;code&gt;c&lt;/code&gt; 를 이용해서 복사를 하지만 만약에 스크롤을 여러번 할정도로 긴 내용이라면, 클립보드에 직접 복사하지는 않더라도 파일에 저장을 하는 과정을 거쳐서 출력 내용을 복사할 수 있습니다.&lt;/p&gt;
&lt;h1&gt;방법&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마우스 활성화 &lt;code&gt;alt&lt;/code&gt; + &lt;code&gt;f12&lt;/code&gt; (이미 되어 있다면 생략 가능합니다.)&lt;/li&gt;
&lt;li&gt;내용 드래그&lt;/li&gt;
&lt;li&gt;cat &amp;gt; copied.txt&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alt&lt;/code&gt; + &lt;code&gt;insert&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ctrl&lt;/code&gt; + &lt;code&gt;d&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 복사된 내용이 있는 txt파일이 저장이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이파일을 직접 열어서 다시 클립보드에 복사를 하거나 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/007MW/btrJ7q8x4od/FHzrPmJAUUSz14vhqsMbO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/007MW/btrJ7q8x4od/FHzrPmJAUUSz14vhqsMbO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/007MW/btrJ7q8x4od/FHzrPmJAUUSz14vhqsMbO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F007MW%2FbtrJ7q8x4od%2FFHzrPmJAUUSz14vhqsMbO0%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;1044&quot; height=&quot;821&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;821&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 저장된 파일을 볼 수 있습니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/37</guid>
      <comments>https://keepworking.tistory.com/37#entry37comment</comments>
      <pubDate>Wed, 24 Aug 2022 13:34:36 +0900</pubDate>
    </item>
    <item>
      <title>pdf 문서 번역하는 법 알아보기</title>
      <link>https://keepworking.tistory.com/36</link>
      <description>&lt;h1&gt;  개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;궁금한것이 있어서 자료를 찾다보니 그나마 있던 자료가 영문으로 있으면 번역을 해서 보고 싶은 마음이 간절합니다.&lt;br /&gt;그런데 pdf파일은 웹브라우저에서 바로 번역이 안되다보니 읽는게 너무 어려워집니다.&lt;br /&gt;방법이 없을까 고생을 하다보니 좋은 방법이 있어서 이를 공유 드립니다.&lt;/p&gt;
&lt;h1&gt;링크&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;translate.google.com&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기대를 드린것이 무안하게 구글 번역기의 기능을 이용하는 것인데요, 방법은 아래에 정리해 두겠습니다.&lt;/p&gt;
&lt;h1&gt;방법&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구글 번역 사이트 에스 문서 탭 클릭&lt;/li&gt;
&lt;li&gt;pdf파일을 업로드&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/botzw1/btrJB21HdZJ/iRUyAkhaYWv9SZToEesscK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/botzw1/btrJB21HdZJ/iRUyAkhaYWv9SZToEesscK/img.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;531&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;55.24&quot; style=&quot;width: 54.6025%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/botzw1/btrJB21HdZJ/iRUyAkhaYWv9SZToEesscK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbotzw1%2FbtrJB21HdZJ%2FiRUyAkhaYWv9SZToEesscK%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;849&quot; height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/carfoK/btrJGUA6EWS/8GtcaW0Qmu9V88Rex6Gdj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/carfoK/btrJGUA6EWS/8GtcaW0Qmu9V88Rex6Gdj1/img.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;657&quot; data-is-animation=&quot;false&quot; style=&quot;width: 44.2347%;&quot; data-widthpercent=&quot;44.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/carfoK/btrJGUA6EWS/8GtcaW0Qmu9V88Rex6Gdj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcarfoK%2FbtrJGUA6EWS%2F8GtcaW0Qmu9V88Rex6Gdj1%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;851&quot; height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 파일을 업로드하면 아래와 같은 pdf파일이 변하는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QYwzO/btrJHd8qObL/Ux7dsbBjKZn1KJizgcZHtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QYwzO/btrJHd8qObL/Ux7dsbBjKZn1KJizgcZHtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QYwzO/btrJHd8qObL/Ux7dsbBjKZn1KJizgcZHtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQYwzO%2FbtrJHd8qObL%2FUx7dsbBjKZn1KJizgcZHtK%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;1372&quot; height=&quot;1024&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;1024&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;1357&quot; data-origin-height=&quot;997&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sjJFR/btrJEK6Q76p/YWm6whKfCA7dsfxtC6zqTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sjJFR/btrJEK6Q76p/YWm6whKfCA7dsfxtC6zqTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sjJFR/btrJEK6Q76p/YWm6whKfCA7dsfxtC6zqTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsjJFR%2FbtrJEK6Q76p%2FYWm6whKfCA7dsfxtC6zqTk%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;1357&quot; height=&quot;997&quot; data-origin-width=&quot;1357&quot; data-origin-height=&quot;997&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완벽하게 폰트 사이즈나 그런게 유지되지는 않았지만 어느정도 양식도 유지가 되고 꽤 좋은 결과가 나왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;239&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYpAKz/btrJAQmOq2U/bXhREBmYlV82uV8fcSCiDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYpAKz/btrJAQmOq2U/bXhREBmYlV82uV8fcSCiDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYpAKz/btrJAQmOq2U/bXhREBmYlV82uV8fcSCiDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYpAKz%2FbtrJAQmOq2U%2FbXhREBmYlV82uV8fcSCiDK%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;239&quot; height=&quot;260&quot; data-origin-width=&quot;239&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 글자가 깨지는 부분도 있기는 하지만 그래도 그내용을 어느정도 볼 수 는 있어 도움이 많이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일할때 영어로 작성된 문서를 볼일이 많았는데, 이건 좀 도움이 될거 같네요&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/36</guid>
      <comments>https://keepworking.tistory.com/36#entry36comment</comments>
      <pubDate>Sun, 14 Aug 2022 01:06:36 +0900</pubDate>
    </item>
    <item>
      <title>의미가 쉽사리 짐작 가지 않는 unix / linux 명령어들의 의미 알아보기</title>
      <link>https://keepworking.tistory.com/35</link>
      <description>&lt;h1&gt; ️ 개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난번에 작성했던 &lt;code&gt;*.rc&lt;/code&gt; 의 의미를 알아보는 글을 작성하던 와중에, 좀 더 다양한 그리고 제가 뜻을 모르고 있던 많은 명령어들의 의미를 알려주는 글을 찾았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kb.iu.edu/d/abnd&quot;&gt;In Unix, what do some obscurely named commands stand for?&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 글에서 일부 내용만 가져왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHUTzx/btrHZro0Gqh/PRIJOQCokFaKkKLHATvzO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHUTzx/btrHZro0Gqh/PRIJOQCokFaKkKLHATvzO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHUTzx/btrHZro0Gqh/PRIJOQCokFaKkKLHATvzO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHUTzx%2FbtrHZro0Gqh%2FPRIJOQCokFaKkKLHATvzO1%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;529&quot; height=&quot;351&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;⚒️ 명령어들 목록&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ awk&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 awk를 어쩌다 한번 다루어 봤었는데, 제가 기억하기로는 데이터를 파싱 해서 원하는 형태로 가공을 하기 위한 도구로 알고 있습니다. 특정 종류의 데이터만 뽑아낸다거나, 원하는 순서로 정렬을 한다거나 하는 등으로 가공이 가능합니다.&lt;br /&gt;&lt;code&gt;awk&lt;/code&gt; 는 특별한 의미가 있는 것은 아니고 이 소프트웨어의 제작자들의 이름을 따서 만든 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;a&lt;/code&gt; : &lt;code&gt;Aho&lt;/code&gt; (Ai Aho)&lt;br /&gt;&lt;code&gt;w&lt;/code&gt; : &lt;code&gt;Weinberger&lt;/code&gt; (Peter Weinberger)&lt;br /&gt;&lt;code&gt;k&lt;/code&gt; : &lt;code&gt;Kernighan&lt;/code&gt; (Brain Kernighan)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  grep&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;grep&lt;/code&gt;은 정말 자주 사용하는 명령어지요. 출력 내용 중 필요한 부분만 걸러서 본다거나 파일 중에 필요한 내용을 찾아내는데에도 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Global Regular Expression Print (전역 정규식 인쇄)&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 의미이기도 하고, &lt;code&gt;Unix&lt;/code&gt;의 텍스트 에디터인 &lt;code&gt;ed&lt;/code&gt;의 검색 기능을 사용하기 위한 명령어에서 유래 되었다고 합니다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;g/re/p&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  cat&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;cat&lt;/code&gt; 명령어는 파일을 읽어들여서 화면에 뿌려주기만 하는 명령어로 알고 있었는데, 다실은 다른 기능을 위한 명령어였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Catenate (연결)&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여려개의 파일을 이어서 보여주는 파일이었던 거지요..&lt;br /&gt;즉 &lt;code&gt;cat&lt;/code&gt; 명령어의 사용 목적은 다음과 같은 방식이었습니다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;cat file1 file2 file3 &amp;gt; file&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 솔직히 왜 &lt;code&gt;dog&lt;/code&gt; 는 없는 걸까 하고 생각했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  tee&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;tee&lt;/code&gt; 는 출력을 저장하면서 동시에 그 출력을 보고 싶을 때 사용하는 명령어입니다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 로그를 보고 싶을 때
./myprogram

# 로그를 저장 하고 싶을 때
./myprogram &amp;gt; logfile

# 로그를 보면서 저장하고 싶을 때
./myprogram | tee logfile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 방식으로 사용할 수 있는 거지요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 &lt;code&gt;tee&lt;/code&gt;의 기능은 발음 그대로 &lt;code&gt;T&lt;/code&gt; 자형 파이프 관에서 따온 이름입니다. 한쪽으로 들어온 입력이 두 갈래로 나가는 모습을 &lt;code&gt;T&lt;/code&gt;자형 파이프에 빗대어서 표현한 거였네요&lt;/p&gt;</description>
      <category>알아보기</category>
      <category>awk</category>
      <category>cat</category>
      <category>grep</category>
      <category>TEE</category>
      <category>리눅스</category>
      <category>명령어</category>
      <category>유닉스</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/35</guid>
      <comments>https://keepworking.tistory.com/35#entry35comment</comments>
      <pubDate>Fri, 22 Jul 2022 23:28:54 +0900</pubDate>
    </item>
    <item>
      <title>.rc 에서 rc의 의미 알아보기 ( .bashrc / init.rc / ... )</title>
      <link>https://keepworking.tistory.com/34</link>
      <description>&lt;h1&gt;개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스를 이용해서 개발을 하다 보면 &lt;code&gt;*.rc&lt;/code&gt; 키워드의 파일들을 자주 만나볼 수 있는데&lt;br /&gt;개발을 하다 보면 그냥 그런가 보다 하고 넘어가게 되는데, rc는 뭐의 약자일까 궁금했습니다.&lt;/p&gt;
&lt;h1&gt;결론&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;rc&lt;/code&gt; 는 &lt;code&gt;Run Commands&lt;/code&gt; 의 약자입니다. 정확히는 &lt;code&gt;runcom&lt;/code&gt;의 약자라 봐도 됩니다.&lt;br /&gt;또는 &lt;code&gt;Run Control&lt;/code&gt;의 약자이기도 합니다.&lt;br /&gt;다짜고짜 결론을 정리하는 이유는 이게 생각보다 재미있는 역사를 지니고 있어서 그렇습니다.&lt;br /&gt;그래서 이 아래는 &lt;code&gt;runcom&lt;/code&gt;의 역사? 를 정리하고자 합니다.&lt;/p&gt;
&lt;h1&gt;RUNCOM에 대해서&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;RUNCOM&lt;/code&gt;은 초기 운영 체제인 &lt;code&gt;CTSS (범용 시분할 시스템)&lt;/code&gt;의 스크립트 실행기입니다. 요즘 리눅스로 따지자면 쉘 스크립트랑 유사하지만, 당시의 &lt;code&gt;CTSS&lt;/code&gt;는 지금의 쉘 인터페이스와는 사용법이 달랐고 그 안의 다양한 명령어들을 한 번에 자동으로 실행하기 위한 매크로 스크립트이었던 것 같습니다.&lt;br /&gt;그래서 당시 RUNCOM 스크립트에는 조건 분기나 반복문과 같은 흐름 제어에 대한 기능이 있어 거의 프로그래밍 언어 정도로 이용이 가능하지 않았나 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이후에 나온 &lt;code&gt;unix&lt;/code&gt; 운영체제인 &lt;code&gt;Plan 9 from Bell Labs&lt;/code&gt; 의 쉘의 이름이 &lt;code&gt;rc&lt;/code&gt; 이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 나오는 &lt;code&gt;*.sh&lt;/code&gt; 는 쉘 스크립트이기 때문에 이름을 가졌듯이 &lt;code&gt;*.rc&lt;/code&gt; 파일들도 이러한 역사를 거치면서 나타나게 된 것이 아닌가 싶습니다.&lt;/p&gt;
&lt;h1&gt;Run Control에 대해서&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 몇몇 &lt;code&gt;*rc&lt;/code&gt; 파일들은 명령어를 실행하지 않고 그 명령어의 설정 등을 다루는 것들이 많습니다. &lt;code&gt;.vimrc&lt;/code&gt; &lt;code&gt;.bashrc&lt;/code&gt; 같은 것들이요.&lt;br /&gt;이러한 것들은 언제부터 이렇게 부르기 시작했는지의 오랜 역사는 모르지만, &lt;code&gt;Art of Unix Programming (Eric S. Raymond)&lt;/code&gt;도서에서는 이러한 &lt;code&gt;rc&lt;/code&gt;파일들을 실행 제어 파일이라고 언급되는 것을 알 수 있다고 합니다.&lt;/p&gt;
&lt;h1&gt;여담&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Plan 9 from Bell Labs&lt;/code&gt; 운영체제는 다음과 같은 귀여운 마스코트가 있는데 이 마스코드를 그린 화가는 &lt;code&gt;go lang&lt;/code&gt;의 마스코트를 그린 르네 프렌치입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;144&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Klo3/btrHTrh8H8c/JTlqcXag6iGGK48q2oYQh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Klo3/btrHTrh8H8c/JTlqcXag6iGGK48q2oYQh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Klo3/btrHTrh8H8c/JTlqcXag6iGGK48q2oYQh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Klo3%2FbtrHTrh8H8c%2FJTlqcXag6iGGK48q2oYQh0%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;144&quot; height=&quot;163&quot; data-origin-width=&quot;144&quot; data-origin-height=&quot;163&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;192&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C9ztN/btrHWG5EPyH/iZVQg8KQM7Ux1TPVNoDkTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C9ztN/btrHWG5EPyH/iZVQg8KQM7Ux1TPVNoDkTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C9ztN/btrHWG5EPyH/iZVQg8KQM7Ux1TPVNoDkTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC9ztN%2FbtrHWG5EPyH%2FiZVQg8KQM7Ux1TPVNoDkTk%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;192&quot; height=&quot;80&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;80&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>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/34</guid>
      <comments>https://keepworking.tistory.com/34#entry34comment</comments>
      <pubDate>Fri, 22 Jul 2022 00:09:51 +0900</pubDate>
    </item>
    <item>
      <title>Go 언어 프로젝트 생성하는 법 알아보기 (리눅스)</title>
      <link>https://keepworking.tistory.com/33</link>
      <description>&lt;h1&gt;개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 친구와 함께 간단한 프로젝트를 해보기로 했고 저는 해당하는 서버 언어로 Go 언어를 선택했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 잠깐 찔러보기만 해 보고 뭔가 구성을 해본 적이 없어서 어떻게 해야 하나 당황을 했는데요...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 설치가 되어있는 상태로 가정하고 내용을 진행 해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;145&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brnsXa/btrGQoNV4kM/Q0F1vPAoZljdfpkwGfAIGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brnsXa/btrGQoNV4kM/Q0F1vPAoZljdfpkwGfAIGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brnsXa/btrGQoNV4kM/Q0F1vPAoZljdfpkwGfAIGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrnsXa%2FbtrGQoNV4kM%2FQ0F1vPAoZljdfpkwGfAIGk%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;145&quot; height=&quot;125&quot; data-origin-width=&quot;145&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;프로젝트 폴더 만들기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 이전에 다른 언어의 개발 경험이 있었다면 대체로 아래와 같은 구조의 프로젝트 폴더 구조를 생각할 거 같습니다.&lt;br /&gt;저도 그렇구요.&lt;br /&gt;프로그램의 덩치는 커져만 가는데, 파일 안에 코드는 길어져만 가니 파일을 분리하고 이것들을 폴더로 묶어야 하는 것이지요.&lt;/p&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;myproject/
├── lib
│   ├── a.c
│   ├── a.h
│   ├── b.c
│   └── b.h
└── main.c&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 Go에서는 전반적으로 동일하지만 조금 어색한 원칙이 하나 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;GOPATH&lt;/code&gt;에 프로젝트를 만들어야 하는 것이지요&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ go env GOPATH
&amp;gt; /home/orange/go&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;go env&lt;/code&gt;명령어를 통해서 경로를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로 만든 프로젝트는 &lt;code&gt;$GOPATH/src/&amp;lt;깃주소&amp;gt;/&amp;lt;깃계정&amp;gt;/&amp;lt;깃레포&amp;gt;&lt;/code&gt; 의 경로에 만들어야 합니다. 안 그러면 위처럼 폴더로 묶는 구조를 만들 수가 없더라고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 좀 불편하지 않나... 싶기는 한데 이런 엄격한 구조가 golang의 장점이지 않나... 싶습니다.&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;$GOPATH/src/closed.src/orange/myproject
├── go.mod
├── main.go
└── mylib
    ├── a.go
    └── b.go&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Go언어 프로젝트는 이러한 구조로 비슷하게 구현이 가능합니다.&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;~/go/src/closed.src/orange/myproject$ go mod init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더를 생성한 뒤에는 &lt;code&gt;go mod init&lt;/code&gt;을 해주어야 합니다.&lt;/p&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;module closed.src/orange/myproject

go 1.18&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;go.mod파일의 내용은 위와 같습니다. 모듈의 경로가 정의되어 있지요.&lt;/p&gt;
&lt;h1&gt;go 소스 추가하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;main.go&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;erlang&quot;&gt;&lt;code&gt;package main

import (
        &quot;fmt&quot;

        &quot;closed.src/orange/myproject/mylib&quot;
)

func main() {
        fmt.Println(&quot;main func&quot;)

        mylib.Afunc()
        mylib.Bfunc()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;mylib/a.go&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;package mylib

import &quot;fmt&quot;

func Afunc() {
        fmt.Println(&quot;a func&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;mylib/b.go&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;package mylib

import &quot;fmt&quot;

func Bfunc() {
        fmt.Println(&quot;b func&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 나오는 &lt;code&gt;mylib/*.go&lt;/code&gt; 들은 &lt;code&gt;main.go&lt;/code&gt;에서 함께 넣지 않고 분리해서 구현하고자 하는 코드들을 이 안에 구현하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 되면 여기에 나오는 &lt;code&gt;mylib&lt;/code&gt;은 일종의 패키지가 되는 것이고 &lt;code&gt;main.go&lt;/code&gt;에서 그것을 로드해서 사용하게 됩니다.&lt;br /&gt;&lt;code&gt;main.go&lt;/code&gt; 코드를 다시 한번 보시면, &lt;code&gt;closed.src/orange/myproject/mylib&lt;/code&gt; 프로젝트 경로가 통째로 포함이 되어 있는 것을 확인할 수 있습니다.&lt;br /&gt;저는 이렇게 경로가 코드에 포함되어있는 게 낯설어서 이게 맞나... 싶었는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 좋아하는 go언어 오픈소스인 lazygit도 동일한 방식으로 하위 패키지가 포함된 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmdB7s/btrGSxv5dB5/xGapxpdduJstJWbefhkKIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmdB7s/btrGSxv5dB5/xGapxpdduJstJWbefhkKIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmdB7s/btrGSxv5dB5/xGapxpdduJstJWbefhkKIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmdB7s%2FbtrGSxv5dB5%2FxGapxpdduJstJWbefhkKIk%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;654&quot; height=&quot;636&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 이러한 방식의 파일 관리 기법은 코드의 모듈화와 재사용성을 늘리기 위함이 아닐까 싶습니다.&lt;br /&gt;패키지의 경로가 모두 나와 있어 다른 프로젝트의 부분 패키지를 사용할 수 있을 테니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;낯설지만 꽤 좋은 구조구나 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 go언어 프로젝트를 생성하는 방법을 알아보았습니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <category>Go</category>
      <category>go make new project</category>
      <category>go multifile manage</category>
      <category>go new project</category>
      <category>linux</category>
      <category>linux go new project</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/33</guid>
      <comments>https://keepworking.tistory.com/33#entry33comment</comments>
      <pubDate>Sat, 9 Jul 2022 23:10:46 +0900</pubDate>
    </item>
    <item>
      <title>C++ Pimpl 알아보기</title>
      <link>https://keepworking.tistory.com/32</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKSl9P/btrGgEPbekr/kVwLyEZtX81f74DqUK2WN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKSl9P/btrGgEPbekr/kVwLyEZtX81f74DqUK2WN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKSl9P/btrGgEPbekr/kVwLyEZtX81f74DqUK2WN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKSl9P%2FbtrGgEPbekr%2FkVwLyEZtX81f74DqUK2WN1%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;632&quot; height=&quot;580&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++를 이용해서 개발을 공부하거나 개발을 진행하다 보면 &lt;code&gt;Pimpl&lt;/code&gt;이라는 것을 마주하게 됩니다.&lt;br /&gt;이 것이 무었이고 또 왜 사용하는지 이번 기회에 알아봅시다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Pimpl 이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pimpl은 &lt;code&gt;Pointer to IMPLement의&lt;/code&gt; 약자로 C++에서 &lt;code&gt;구현된 객체&lt;/code&gt;를 동일한 형태의 &lt;code&gt;인터페이스용 객체&lt;/code&gt;에 포인터만 전달하여 실제 기능 구현을 사용자에게서 감추는 프로그래밍 기법입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2069&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5oRRM/btrGfo1JdxC/Zt6bBfHKOVsJy6xvb6Uj90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5oRRM/btrGfo1JdxC/Zt6bBfHKOVsJy6xvb6Uj90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5oRRM/btrGfo1JdxC/Zt6bBfHKOVsJy6xvb6Uj90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5oRRM%2FbtrGfo1JdxC%2FZt6bBfHKOVsJy6xvb6Uj90%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;2069&quot; height=&quot;762&quot; data-origin-width=&quot;2069&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 코드 예시&lt;/h2&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;.
├── libcar
│   ├── car.cpp
│   ├── car.h
│   ├── carimpl.cpp
│   ├── carimpl.h
│   └── CMakeLists.txt
└── user_dev
    ├── CMakeLists.txt
    ├── include
    │   ├── car.h
    │   └── libcar.a
    └── main.cpp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식의 코드 구성이 있다고 합시다.&lt;br /&gt;&lt;code&gt;libcar&lt;/code&gt; 은 저희가 만든 라이브러리이고, &lt;code&gt;user_dev&lt;/code&gt; 는 저희가 만든 라이브러리를 이용하는 사용자의 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;user_dev&lt;/code&gt; 하위에는 저희가 이미 빌드해서 재공 하는 &lt;code&gt;libcar.a&lt;/code&gt; 라이브러리와 &lt;code&gt;car.h&lt;/code&gt; 라는 라이브러리가 있습니다. 즉, &lt;code&gt;libcar&lt;/code&gt;의 빌드 결과물과 필요한 헤더만 공유한 것이지요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 각각의 코드를 살펴봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;libcar/car.h&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#ifndef CAR_H_
#define CAR_H_
#include &amp;lt;memory&amp;gt;

class CarImpl;
class Car {
  public:
    Car();
    ~Car();

    void ride();
  private:
    CarImpl *carImpl = nullptr;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;car.h&lt;/code&gt;는 기본적인 인터페이스 형태만 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;libcar/car.cpp&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;#include &quot;car.h&quot;
#include &quot;carimpl.h&quot;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;memory&amp;gt;


Car::Car()
{
  carImpl = new CarImpl();
}

Car::~Car()
{
  delete carImpl;
}

void
Car::ride()
{
  carImpl-&amp;gt;ride();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;car.cpp&lt;/code&gt; 에서는 &lt;code&gt;CarImpl&lt;/code&gt;에서 구현된 기능을 호출해서 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;libcar/carimpl.h&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;#ifndef CAR_IMPL_H_
#define CAR_IMPL_H_
#include &amp;lt;string&amp;gt;


class CarImpl {
  public:
    CarImpl() = default;
    ~CarImpl() = default;

    void ride();
  private:
    void playEngineSound();
    std::string engineSound = &quot;부와아아앙&quot;;
};



#endif // CAR_IMPL_H_&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;carimpl.h&lt;/code&gt;에서는 실제 코드 구현에 사용되는 프로퍼티들이 명시되어있습니다. 라이브러리 사용자에게 보여주고 싶지 않은 &lt;code&gt;부와아아앙&lt;/code&gt;같은 값이 들어있네요 제 라이브러리를 사용하는 고객이 &lt;code&gt;부와아아앙&lt;/code&gt;같은 핵심 기술을 혹시라도 훔쳐갈까 걱정이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;libcar/carimpl.cpp&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &quot;carimpl.h&quot;
#include &amp;lt;iostream&amp;gt;
void
CarImpl::ride()
{
  playEngineSound();
}

void
CarImpl::playEngineSound()
{
  std::cout &amp;lt;&amp;lt; this-&amp;gt;engineSound &amp;lt;&amp;lt; std::endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;carimpl.cpp&lt;/code&gt; 에서는 코드가 동작하는 기능이 구현되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;libcar/CMakeLists.txt&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;project (libcar)

add_library(car car.cpp carimpl.cpp)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 make를 잘 못써서 cmake로 빌드되도록 작성했습니다.&lt;br /&gt;이걸 빌드하면 &lt;code&gt;libcar.a&lt;/code&gt;파일이 만들어지는 거지요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;user_dev/main.cpp&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &quot;include/car.h&quot;

int main()
{

  Car car;

  car.ride();

  return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;main.cpp&lt;/code&gt; 는 고객이 제가 제공한 라이브러리를 이용해서 코드를 구현한 내용입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;user_dev/CMakeLists.txt&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;project (user_dev_car)


add_executable(pimpl_user_dev_test main.cpp)
target_link_libraries(pimpl_user_dev_test ${CMAKE_SOURCE_DIR}/include/libcar.a)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 cmake로 빌드를 하게 되면 &lt;code&gt;pimpl_user_dev_test&lt;/code&gt; 라는 바이너리가 나옵니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행 결과&lt;/h2&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;orange@32thread-server:~/project/pimpl/user_dev/build$ cmake ..
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/orange/project/pimpl/user_dev/build
orange@32thread-server:~/project/pimpl/user_dev/build$ make
Scanning dependencies of target pimpl_user_dev_test
[ 50%] Building CXX object CMakeFiles/pimpl_user_dev_test.dir/main.cpp.o
[100%] Linking CXX executable pimpl_user_dev_test
[100%] Built target pimpl_user_dev_test
orange@32thread-server:~/project/pimpl/user_dev/build$ ./pimpl_user_dev_test 
부와아아앙&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;user_dev&lt;/code&gt; 의 코드 속 내용을 보면 알 수 있듯이 인터페이스용 객체의 헤더 파일만 공유하게 되면 저희가 구현한 기능들을 사용할 수 있게 됩니다.&lt;br /&gt;이때 사용자는 저희가 구현한 객체가 가진 내부 변수 같은 것들을 알고 싶어도 &lt;code&gt;car.h&lt;/code&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;여기까지 c++의 pimpl에 대해 알아보았습니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;추가로...&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로&amp;nbsp;공부하다보니&amp;nbsp;Pimple의&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;예를&amp;nbsp;들어서&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702263979475&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyWorks {
public:
	int func();
private:
	int secret1(); // \
	int secret2(); //  | 자주 변경 될 수 있음.
	int secret3(); // /
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;로&amp;nbsp;되에있는&amp;nbsp;인터페이스가&amp;nbsp;있고.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;인터페이스의&amp;nbsp;헤더파일을&amp;nbsp;바탕으로&amp;nbsp;만들어진&amp;nbsp;프로젝트가&amp;nbsp;10개&amp;nbsp;씩이나&amp;nbsp;있다면.&lt;br /&gt;&lt;br /&gt;실제&amp;nbsp;사용하는&amp;nbsp;프로젝트에서&amp;nbsp;사용하는&amp;nbsp;func()&amp;nbsp;의&amp;nbsp;사용법은&amp;nbsp;변하지&amp;nbsp;않은&amp;nbsp;상황에서,&amp;nbsp;내부&amp;nbsp;구현의&amp;nbsp;최적하등의&amp;nbsp;과정으로&amp;nbsp;private&amp;nbsp;영역의&amp;nbsp;함수들이&amp;nbsp;서너개&amp;nbsp;더&amp;nbsp;추가가&amp;nbsp;되었다면&lt;br /&gt;&lt;br /&gt;10개의&amp;nbsp;프로젝트들은&amp;nbsp;새로운&amp;nbsp;헤더&amp;nbsp;파일을&amp;nbsp;기반으로&amp;nbsp;새로&amp;nbsp;빌드를&amp;nbsp;해야&amp;nbsp;&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;pimple을&amp;nbsp;통해서&amp;nbsp;정말&amp;nbsp;필요한&amp;nbsp;인터페이스만&amp;nbsp;남기게&amp;nbsp;되었다면,&amp;nbsp;헤더&amp;nbsp;파일을&amp;nbsp;업데이트&amp;nbsp;하지&amp;nbsp;않고,&amp;nbsp;DLL이나&amp;nbsp;so&amp;nbsp;파일만&amp;nbsp;업데이트&amp;nbsp;하면&amp;nbsp;충분히&amp;nbsp;업데이트가&amp;nbsp;되게&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pimple이 사용되는 데에는 다양한 이유들이 있었네요.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/32</guid>
      <comments>https://keepworking.tistory.com/32#entry32comment</comments>
      <pubDate>Fri, 1 Jul 2022 19:17:44 +0900</pubDate>
    </item>
    <item>
      <title>eMMC vs UFS 둘중 어느게 좋은지 알아보기</title>
      <link>https://keepworking.tistory.com/31</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX2WWz/btrGfy95Ael/CIkhV8DgOQDSpSHaMTLWx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX2WWz/btrGfy95Ael/CIkhV8DgOQDSpSHaMTLWx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX2WWz/btrGfy95Ael/CIkhV8DgOQDSpSHaMTLWx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX2WWz%2FbtrGfy95Ael%2FCIkhV8DgOQDSpSHaMTLWx0%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;263&quot; height=&quot;301&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&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://prodigytechno.com/emmc-vs-ufs&quot;&gt;https://prodigytechno.com/emmc-vs-ufs&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이곳의 자료를 참고해서 작성했습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;eMMC 란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eMMC는 &lt;code&gt;Embedded MultiMedia Card&lt;/code&gt; 의 약자로 모바일용으로 사용되는 NAND 플레시 메모리 솔루션입니다. 주로 스마트폰이나 태블릿과 같은 임베디드 장치에서 주로 사용하게 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;eMMC 의 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저렴한 가격&lt;/li&gt;
&lt;li&gt;반이중 통신으로 읽고 쓰는 것을 동시에 진행 할 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;UFS 란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UFS는 &lt;code&gt;Universal Flash Memory&lt;/code&gt; 의 약자로 범용 플래시 메모리입니다. 나름 차세대 플레시 메모리 인듯 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UFS 의 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LVDS &lt;code&gt;Low Voltage Differential Signaling&lt;/code&gt; 인터페이스 제공&lt;/li&gt;
&lt;li&gt;전이중 통신으로 읽고 쓰는 것을 동시에 진행 할 수 있음&lt;/li&gt;
&lt;li&gt;eMMC 보다 빠름 근데 좀더 비쌈&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서로의 장점은?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;eMMC&lt;/code&gt;는 원가 절감에 유리&lt;br /&gt;&lt;code&gt;UFS&lt;/code&gt;는 고성능 디바이스 개발에 유리&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/31</guid>
      <comments>https://keepworking.tistory.com/31#entry31comment</comments>
      <pubDate>Fri, 1 Jul 2022 16:33:10 +0900</pubDate>
    </item>
    <item>
      <title>Tio Tmux, Byobu랑 사용하기 좋은 시리얼 모니터 프로그램 사용법 알아보기</title>
      <link>https://keepworking.tistory.com/30</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z2kMp/btrF8R23xTf/EY1nUki4d5KMbT8VnDVrLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z2kMp/btrF8R23xTf/EY1nUki4d5KMbT8VnDVrLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z2kMp/btrF8R23xTf/EY1nUki4d5KMbT8VnDVrLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ2kMp%2FbtrF8R23xTf%2FEY1nUki4d5KMbT8VnDVrLK%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;878&quot; height=&quot;754&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 기존에 리눅스에서 시리얼 커뮤니케이션을 하기 위한 프로그램으로 minicom이나 picocom 같은 프로그램을 많이들 사용했을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이러한 프로그램들은 byobu나 tmux에서 같이 사용하면 단축키를 정상적으로 사용할 수 없어 이용이 불편합니다. &lt;code&gt;ctrl+a&lt;/code&gt; 같은 명령어를 사용할 건데 이것들이 이미 기존 byobu나 tmux의 명령어와 충돌 되기 때문 이지요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 의미에서 Tio는 단축키가 충돌되지 않고 아주 편하게 사용할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설치 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Snap 을 이용한 설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;sudo snap install tio&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;apt 를 이용한 설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;sudo apt install tio&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용법&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;sudo tio -b 115200 /dev/ttyUSB0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;115200&lt;/code&gt; 은 원하는 Baudrate로 바꾸어서 사용하면 됩니다.&lt;br /&gt;&lt;code&gt;/dev/ttyUSB0&lt;/code&gt; 도 마찬가지로 실제 컴퓨터에 인식된 장치로 선택하면 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;간단한 명령어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tio의 명령어 들은 &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;t&lt;/code&gt; 를 이용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt; 표시 이후의 명령어는 이전 키를 때고 눌러 주시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종료 : &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;t&lt;/code&gt; -&amp;gt; &lt;code&gt;q&lt;/code&gt;&lt;br /&gt;화면 초기화 : &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;t&lt;/code&gt; -&amp;gt; &lt;code&gt;l&lt;/code&gt;&lt;br /&gt;단축키 설명 보기 : &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;t&lt;/code&gt; -&amp;gt; &lt;code&gt;?&lt;/code&gt;&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/30</guid>
      <comments>https://keepworking.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 30 Jun 2022 16:35:14 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 로컬 프로세스 간의 통신은 TCP통신과 UDS통신중 어느게 성능이 좋을까?</title>
      <link>https://keepworking.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 UDS가 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/14973942/tcp-loopback-connection-vs-unix-domain-socket-performance&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/14973942/tcp-loopback-connection-vs-unix-domain-socket-performance&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656059445901&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;TCP loopback connection vs Unix Domain Socket performance&quot; data-og-description=&quot;Working on an Android and iOS based application which require communication with a server running in the same device. Currently using TCP loopback connection for communicating with App and Server (...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/14973942/tcp-loopback-connection-vs-unix-domain-socket-performance&quot; data-og-url=&quot;https://stackoverflow.com/questions/14973942/tcp-loopback-connection-vs-unix-domain-socket-performance&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/l7kUV/hyOSGXJGO0/E3plGgs8YRiAlG3DFjwtKk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/bDWOr2/hyORLTTkFC/of3kqbUSOU428PtWAvfwX1/img.png?width=662&amp;amp;height=461&amp;amp;face=0_0_662_461&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/14973942/tcp-loopback-connection-vs-unix-domain-socket-performance&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/14973942/tcp-loopback-connection-vs-unix-domain-socket-performance&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/l7kUV/hyOSGXJGO0/E3plGgs8YRiAlG3DFjwtKk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/bDWOr2/hyORLTTkFC/of3kqbUSOU428PtWAvfwX1/img.png?width=662&amp;amp;height=461&amp;amp;face=0_0_662_461');&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;TCP loopback connection vs Unix Domain Socket performance&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Working on an Android and iOS based application which require communication with a server running in the same device. Currently using TCP loopback connection for communicating with App and Server (...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 처리량이 많지 않을때는 그 성능의 차이가 크게 유의미 하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br8KpY/btrFFnImg8m/o8ZQDyt0XOqFIKcaDN1U31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br8KpY/btrFFnImg8m/o8ZQDyt0XOqFIKcaDN1U31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br8KpY/btrFFnImg8m/o8ZQDyt0XOqFIKcaDN1U31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr8KpY%2FbtrFFnImg8m%2Fo8ZQDyt0XOqFIKcaDN1U31%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;669&quot; height=&quot;668&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택 오버 플로우 답글 내용에서 본 답변을 보면 UDS의 속도가 더 빠른것을 알 수 있다.&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;그러니 로컬 IPC통신을 할때는 TCP IP를 loopback으로 접속 하지 말고 UDS를 사용하는 것이 바람직하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GRPC도 기본적으로는 TCP/IP를 지원하지만 UDS또한 사용이 가능하니 이를 이용할 수 있다면 이용하도록 하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/29</guid>
      <comments>https://keepworking.tistory.com/29#entry29comment</comments>
      <pubDate>Fri, 24 Jun 2022 17:35:39 +0900</pubDate>
    </item>
    <item>
      <title>Html5 Webcam 간단한 예제로 사용법 알아보기</title>
      <link>https://keepworking.tistory.com/28</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdwPtp/btrESEEnqjJ/tXllANedYKG6l9HCtcSxj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdwPtp/btrESEEnqjJ/tXllANedYKG6l9HCtcSxj0/img.png&quot; data-alt=&quot;Webcam 표시 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdwPtp/btrESEEnqjJ/tXllANedYKG6l9HCtcSxj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdwPtp%2FbtrESEEnqjJ%2FtXllANedYKG6l9HCtcSxj0%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;845&quot; height=&quot;503&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Webcam 표시 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML5 가 나온 이후, 어쩌면 그 무렵 브라우저를 통해서 할 수 있는 일들이 많아졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 스카이프 같은 프로그램을 설치 하지 않고, 브라우저 상에서 화상 채팅이 가능해지기도 하고, 오피스 같은 프로그램조차도 브라우저를 통해서 접근할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그만큼 브라우저 엔진이 무거워 지기는 했지만, 반대로 무거운 브라우저 엔진 하나로 아주 많고 다양한 서비스를 별도로 설치된 프로그램 이상으로 이용하기 수월해진 것이지요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서론이 잡다하게 길었고 다음과 같이 따라하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 파일부터 보시죠&lt;/p&gt;
&lt;pre id=&quot;code_1655310936320&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;script src=&quot;./main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;title&amp;gt;Camera Test&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;video id=&quot;cameraview&quot; width=&quot;720&quot; height=&quot;480&quot;&amp;gt;&amp;lt;/video&amp;gt;
    &amp;lt;script&amp;gt;
        mainInit();
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라 영상을 표시해주는 핵심 태그는 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;&amp;lt;video/&amp;gt;&lt;/span&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 사용하던 해당 태그의 사용 방식과는 달리 src를 직접 입력해주지 않는데, 이는 js단에서 웹캠 stream 객체를 전달해주기 위함입니다.&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;JS 파일은 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1655311092640&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Init camera
function camInit(stream) {
    var cameraView = document.getElementById(&quot;cameraview&quot;);
    cameraView.srcObject = stream;
    cameraView.play();
}

function camInitFailed(error) {
    console.log(&quot;get camera permission failed : &quot;, error)
}

// Main init

function mainInit() {
    // Check navigator media device available
    if(!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia )
    {
        // Navigator mediaDevices not supported
        alert(&quot;Media Device not supported&quot;)
        return;
    }

    navigator.mediaDevices.getUserMedia({video:true})
        .then(camInit)
        .catch(camInitFailed);

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;cameraView.srcObject = stream&lt;/span&gt; 으로 넣는 부분이 보이실 건데 이부분이 HTML 코드에서 src 프로퍼티를 입력하지 않은 이유가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnKvm2/btrESmYgnuE/oOXh7ZMoAk5kadd7IqcDnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnKvm2/btrESmYgnuE/oOXh7ZMoAk5kadd7IqcDnk/img.png&quot; data-alt=&quot;카메라 사용 권한 요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnKvm2/btrESmYgnuE/oOXh7ZMoAk5kadd7IqcDnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnKvm2%2FbtrESmYgnuE%2FoOXh7ZMoAk5kadd7IqcDnk%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;324&quot; height=&quot;136&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;136&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 주의 깊게 보아야 하는 부분은 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;navigator.mediaDevices.getUserMedia({video:true})&lt;/span&gt; 인데, 이 코드가 브라우저에서 카메라의 사용 권한에 대한 요청및 그 결과에 대한 처리를 하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공 하게 된다면, &lt;span style=&quot;background-color: #f3c000;&quot;&gt;then()&lt;/span&gt; 에 등록된 함수가 실행이 되고, 실패를 하면 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;catch()&lt;/span&gt; 에 등록된 함수가 실행이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AO2JN/btrESkZ8luv/7k7Uf2aklUqltBiNkG4GKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AO2JN/btrESkZ8luv/7k7Uf2aklUqltBiNkG4GKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AO2JN/btrESkZ8luv/7k7Uf2aklUqltBiNkG4GKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAO2JN%2FbtrESkZ8luv%2F7k7Uf2aklUqltBiNkG4GKk%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;422&quot; height=&quot;93&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제를 따라 해보고싶다면 다음과 같은 파일 배치로 로컬에서 바로 로드해서 테스트 해볼 수 있습니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <category>html5</category>
      <category>javascript</category>
      <category>WebCam</category>
      <category>예제</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/28</guid>
      <comments>https://keepworking.tistory.com/28#entry28comment</comments>
      <pubDate>Thu, 16 Jun 2022 01:43:47 +0900</pubDate>
    </item>
    <item>
      <title>Caddy 알아보기 / http서버 / 리버스 프록시</title>
      <link>https://keepworking.tistory.com/26</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://keepworking.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://keepworking.tistory.com/43&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675770230186&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Caddy2 알아보기 / 자동 HTTPS / 리버스 프록시&quot; data-og-description=&quot;Caddy2 에 대해서 캐디 2는 사용하기 쉽고, 빠르고, 안전하도록 설계된 웹 서버 소프트웨어이자 강력한 HTTP/2 서버입니다. 아래와 같은 기능들을 가집니다. 자동 HTTPS: Caddy 2는 Let's Encrypt에서 SSL/TLS &quot; data-og-host=&quot;keepworking.tistory.com&quot; data-og-source-url=&quot;https://keepworking.tistory.com/43&quot; data-og-url=&quot;https://keepworking.tistory.com/43&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lqkkh/hyRx2xvKZb/nFz4Ym6cuLl4AQSV3RiIvK/img.jpg?width=379&amp;amp;height=114&amp;amp;face=0_0_379_114,https://scrap.kakaocdn.net/dn/lIX5X/hyRxSn8ki1/k0hKqx2fX5N0yBSRVZxCW1/img.jpg?width=379&amp;amp;height=114&amp;amp;face=0_0_379_114,https://scrap.kakaocdn.net/dn/EpQ7U/hyRxRisBhM/Mbi1wfDFPljTgkRoLDqZ11/img.jpg?width=290&amp;amp;height=290&amp;amp;face=0_0_290_290&quot;&gt;&lt;a href=&quot;https://keepworking.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://keepworking.tistory.com/43&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lqkkh/hyRx2xvKZb/nFz4Ym6cuLl4AQSV3RiIvK/img.jpg?width=379&amp;amp;height=114&amp;amp;face=0_0_379_114,https://scrap.kakaocdn.net/dn/lIX5X/hyRxSn8ki1/k0hKqx2fX5N0yBSRVZxCW1/img.jpg?width=379&amp;amp;height=114&amp;amp;face=0_0_379_114,https://scrap.kakaocdn.net/dn/EpQ7U/hyRxRisBhM/Mbi1wfDFPljTgkRoLDqZ11/img.jpg?width=290&amp;amp;height=290&amp;amp;face=0_0_290_290');&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;Caddy2 알아보기 / 자동 HTTPS / 리버스 프록시&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Caddy2 에 대해서 캐디 2는 사용하기 쉽고, 빠르고, 안전하도록 설계된 웹 서버 소프트웨어이자 강력한 HTTP/2 서버입니다. 아래와 같은 기능들을 가집니다. 자동 HTTPS: Caddy 2는 Let's Encrypt에서 SSL/TLS&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;keepworking.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텐츠를 많이 수정해서 새로 업로드 했으니 확인 부탁드려요&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beTAMr/btrzSzWfDCL/37k4J5B4FdBKKqWcUc5qZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beTAMr/btrzSzWfDCL/37k4J5B4FdBKKqWcUc5qZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beTAMr/btrzSzWfDCL/37k4J5B4FdBKKqWcUc5qZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeTAMr%2FbtrzSzWfDCL%2F37k4J5B4FdBKKqWcUc5qZ0%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;573&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://caddyserver.com/v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://caddyserver.com/v2&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1650440134864&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;Caddy 2 - The Ultimate Server with Automatic HTTPS&quot; data-og-description=&quot;Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go&quot; data-og-host=&quot;caddyserver.com&quot; data-og-source-url=&quot;https://caddyserver.com/v2&quot; data-og-url=&quot;https://caddyserver.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crPi3v/hyN6UXkmOK/ccEVNePC9ayCBCsM7Acsj0/img.jpg?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/bfn5kM/hyN6TjNRA4/lUtufJDGNmwSIs1dfLD74K/img.jpg?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://caddyserver.com/v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://caddyserver.com/v2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crPi3v/hyN6UXkmOK/ccEVNePC9ayCBCsM7Acsj0/img.jpg?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/bfn5kM/hyN6TjNRA4/lUtufJDGNmwSIs1dfLD74K/img.jpg?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&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;Caddy 2 - The Ultimate Server with Automatic HTTPS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;caddyserver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐디는 서버를 위한 확장 가능한 플랫폼이라 소개를 하는데 우리가 기존에 사용하던 nginx 또는 apache의 또 다른 대안이라 생각 할 수 있습니다.&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;특정 디렉토리를 기준으로 http 서버를 열 수 있고&amp;nbsp;정말 다양한 기능을 제공하는데 저는 기본적으로 리버스 프록시 용도로 사용하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;리버스 프록시란?&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQDV0U/btrzXZGbvgK/IH1BybE3Sy19MT8bXPH8QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQDV0U/btrzXZGbvgK/IH1BybE3Sy19MT8bXPH8QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQDV0U/btrzXZGbvgK/IH1BybE3Sy19MT8bXPH8QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQDV0U%2FbtrzXZGbvgK%2FIH1BybE3Sy19MT8bXPH8QK%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;381&quot; height=&quot;229&quot; data-origin-width=&quot;381&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위키백과의 설명은 짧고 간결하지만 저는 한번 풀어서 설명 해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 서버가 한 3대 정도 가지고 있다고 하고 각 서버마다 하나의 사이트를 가지고 있으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 외부에서 접속하고자 하면 포트포워딩을 해서 80번 포트는 서버1, 81번 포트는 서버2, 82번 포트는 서버3 에 연결하는 식으로 구성이 가능할 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 사용자 입장에서는 내도메인.com, 내도메인.com:81 내도메인.com:82 이런식으로 따로 접속을 해야 하는거지요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 포트를 여러개 뚫지 않고 하나의 포트로 여러 서버에 다양하게 접속하고 싶을 겁니다. 서버 하나 추가할때마다 포트포워딩을 새로 해주는 건 정말 번거로운 일이구요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 리버스 프록시는 하나의 포트로 들어오는 입력을 나누어 주는 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;80번 포트 -&amp;gt; 리버스 프록시 -&amp;gt; [서버1,서버2,서버3]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 구조로 구성이 되는 거지요&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;그럼 사용자는 어떤식으로 원하는 서버에 접속 하냐면 서버1.내도메인.com, 서버2.내도메인.com, 서버3.내도메인.com&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 arecord 같은걸 설정 할 수 도 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 내도메인.com/서버1 ... 같은 형식으로 url에서 구분이 되게 해서 접속이 가능합니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/26</guid>
      <comments>https://keepworking.tistory.com/26#entry26comment</comments>
      <pubDate>Wed, 20 Apr 2022 19:52:01 +0900</pubDate>
    </item>
    <item>
      <title>&amp;quot;eabi&amp;quot; 가 뭘까 / abi / eabi / gnueabi</title>
      <link>https://keepworking.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서 크로스 컴파일을 하기 위해 &quot;gcc-arm-linux-gnueabi&quot; 를 설치했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YqqTv/btryp4oFeyV/3SeVihieBJbkHeQ4m1Fvg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YqqTv/btryp4oFeyV/3SeVihieBJbkHeQ4m1Fvg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YqqTv/btryp4oFeyV/3SeVihieBJbkHeQ4m1Fvg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYqqTv%2Fbtryp4oFeyV%2F3SeVihieBJbkHeQ4m1Fvg0%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;1042&quot; height=&quot;232&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;232&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;gcc 는 컴파일러고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arm 은 아키텍쳐고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;linux 는 os고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gnueabi는 뭐지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나름대로 찾아본 결과로는&amp;nbsp;GNU + Embedded + ABI 의 약자였고 여기서 ABI는 Application Binary Interface의 약자이다.&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;API 소프트웨어간 통신에 대한 인터페이스라고 했을때, ABI는 소프트웨어가 실행 되는 환경에 대한 인터페이스 정도로 이해가 된다.&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;즉, 특정 아키텍쳐나 os같은 환경 기준으로 기계어가 동작하기위한 인터페이스 규칙&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/25</guid>
      <comments>https://keepworking.tistory.com/25#entry25comment</comments>
      <pubDate>Mon, 4 Apr 2022 17:06:19 +0900</pubDate>
    </item>
    <item>
      <title>playing Video on terminal with ffmpeg and libcaca</title>
      <link>https://keepworking.tistory.com/24</link>
      <description>&lt;h1&gt;Introduction&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The FFMPEG has several functions to convert videos and there is more special function what i want to show you&lt;/p&gt;
&lt;h1&gt;Libcaca&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://caca.zoy.org/wiki/libcaca&quot;&gt;http://caca.zoy.org/wiki/libcaca&lt;/a&gt;&lt;br /&gt;&lt;code&gt;libcaca&lt;/code&gt; is converting tool with Graphic to text&lt;/p&gt;
&lt;h1&gt;FFMPEG libcaca&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and also &lt;code&gt;FFMPEG&lt;/code&gt; has libcaca converter and if we use it we can play video on terminal&lt;br /&gt;even it not usefull&lt;/p&gt;
&lt;h1&gt;Let's try&lt;/h1&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;ffmpeg -i nyan-cat.mkv -c:v rawvideo -pix_fmt rgb24 -f caca -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;785&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KcMye/btrlLv6kS8T/lKM0P8U0kDzAwB6REwCnN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KcMye/btrlLv6kS8T/lKM0P8U0kDzAwB6REwCnN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KcMye/btrlLv6kS8T/lKM0P8U0kDzAwB6REwCnN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKcMye%2FbtrlLv6kS8T%2FlKM0P8U0kDzAwB6REwCnN1%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;1280&quot; height=&quot;785&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;785&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/424103896&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/biTq2X/hyMq1j8vEl/0827G39TOnzHYK9AYyzNw0/img.jpg?width=1360&amp;amp;height=834&amp;amp;face=0_0_1360_834&quot; data-video-width=&quot;860&quot; data-video-height=&quot;527&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;527&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-play-service=&quot;daum_tistory&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/424103896?service=daum_tistory&quot; width=&quot;860&quot; height=&quot;527&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;it works&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/24</guid>
      <comments>https://keepworking.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 22 Nov 2021 02:16:31 +0900</pubDate>
    </item>
    <item>
      <title>터미널에서 동영상 재생하기</title>
      <link>https://keepworking.tistory.com/23</link>
      <description>&lt;h1&gt;개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ffmpeg에는 영상을 다양하게 변환하는 기능이 있는데 좀 특별하고 재밌는 기능이 있어 소개해 드리고자 합니다.&lt;/p&gt;
&lt;h1&gt;Libcaca&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://caca.zoy.org/wiki/libcaca&quot;&gt;http://caca.zoy.org/wiki/libcaca&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래픽 영상이나 이미지를 터미널 등에서 뿌릴 수 있도록 텍스트로 변환해주는 기능을 제공하는 라이브러리입니다.&lt;/p&gt;
&lt;h1&gt;FFMPEG libcaca&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 FFMPEG에서도 libcaca를 사용한 모듈이 있는데 이것을 활용하면 shell에서 동영상을 재생할 수 있습니다.&lt;br /&gt;물론 뭐 의미는 없을지라도요&lt;/p&gt;
&lt;h1&gt;시도해보기&lt;/h1&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;ffmpeg -i nyan-cat.mkv -c:v rawvideo -pix_fmt rgb24 -f caca -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKUsWy/btrlDCeYUDj/MeWPdA3v0dEQeRCo8eHcn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKUsWy/btrlDCeYUDj/MeWPdA3v0dEQeRCo8eHcn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKUsWy/btrlDCeYUDj/MeWPdA3v0dEQeRCo8eHcn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKUsWy%2FbtrlDCeYUDj%2FMeWPdA3v0dEQeRCo8eHcn0%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;1362&quot; height=&quot;836&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;836&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;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/424103740&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cnBnhx/hyMq1xD0wl/Zy97SbZV5g80nPIEGzCRx0/img.jpg?width=1360&amp;amp;height=834&amp;amp;face=0_0_1360_834&quot; data-video-width=&quot;860&quot; data-video-height=&quot;527&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;527&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-play-service=&quot;daum_tistory&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/424103740?service=daum_tistory&quot; width=&quot;860&quot; height=&quot;527&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 영상이 보이게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;썩 좋지는 않지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무튼 보입니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/23</guid>
      <comments>https://keepworking.tistory.com/23#entry23comment</comments>
      <pubDate>Mon, 22 Nov 2021 01:58:27 +0900</pubDate>
    </item>
    <item>
      <title>How set MOTD per user</title>
      <link>https://keepworking.tistory.com/22</link>
      <description>&lt;h1&gt;Summary&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;few times ago I wrote post about motd&lt;br /&gt;&lt;a href=&quot;https://keepworking.tistory.com/8&quot;&gt;https://keepworking.tistory.com/8&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and AFAIK it showes for all user on this server&lt;br /&gt;but i did not want to show to another people, so i tried some way to fix it&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;actually it is not to normal way, but it works&lt;/p&gt;
&lt;h1&gt;Write profile.d script&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Let write script in to &lt;code&gt;/etc/profile.d/usermotd.sh&lt;/code&gt;&lt;br /&gt;you can use &lt;code&gt;vi&lt;/code&gt; or &lt;code&gt;nano&lt;/code&gt; like that &lt;code&gt;sudo vi /etc/profile.d/usermotd.sh&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;test -e /home/$USER/.motd &amp;amp;&amp;amp; cat /home/$USER/.motd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;explain&amp;nbsp;about this code &lt;code&gt;test -e $FILE&lt;/code&gt; will return success when that file exist&lt;br /&gt;so if that file exist will print &lt;code&gt;/home/$USER/.motd&lt;/code&gt; file&lt;/p&gt;
&lt;h1&gt;Let's try it&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Make file on &lt;code&gt;~/.motd&lt;/code&gt;&lt;br /&gt;you can put text what do you want&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;it is for example&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;                           ///////////////////////////                          
                     ///////////////////////////////////////                    
                 ///////////////////////////////////////////////                
              /////////////////////////////////////////////////////             
           ///////////////////////////////////////&amp;amp;@@@@@@(///////////           
         ////////////////////////////////////////@@@@@@@@@@/////////////        
       ////////////////////////////@@@@@@@@@@@///@@@@@@@@@@//////////////       
      /////////////////////////@@@@@@@@@@@@@@@@///@@@@@@@@/////////////////     
     ////////////////////@@@@///@@@@@@@@@@@@@@@@@%//////////////////////////    
   ////////////////////@@@@@@@///@@@////////(@@@@@@@@@@@@@///////////////////   
   //////////////////@@@@@@@@@@///////////////////@@@@@@@@@@//////////////////  
  //////////////////@@@@@@@@#///////////////////////@@@@@@@@@////////////////// 
 /////////////////(@@@@@@@@///////////////////////////@@@@@@@@//////////////////
 //////////&amp;amp;@@@(///@@@@@@@/////////////////////////////@@@@@@@@/////////////////
 ////////@@@@@@@@@//@@@@@///////////////////////////////@@@@@@@/////////////////
 ///////@@@@@@@@@@@//@@@@///////////////////////////////////////////////////////
 ////////@@@@@@@@@//@@@@@///////////////////////////////@@@@@@@/////////////////
 ///////////@@@////@@@@@@@/////////////////////////////@@@@@@@@/////////////////
 //////////////////@@@@@@@@///////////////////////////@@@@@@@@//////////////////
  //////////////////@@@@@@@@@///////////////////////@@@@@@@@@////////////////// 
   //////////////////@@@@@@@@@@//////////////////&amp;amp;@@@@@@@@@@//////////////////  
   (///////////////////@@@@@@@///@@@@///////@@@@@@@@@@@@@@///////////////////   
     ////////////////////%@@@///@@@@@@@@@@@@@@@@@///////////////////////////    
      ////////////////////////#@@@@@@@@@@@@@@@@///@@@@@@@@/////////////////     
        ///////////////////////////(@@@@@@@@@////@@@@@@@@@@//////////////       
         ////////////////////////////////////////@@@@@@@@@@////////////         
            ///////////////////////////////////////@@@@@@////////////           
              /////////////////////////////////////////////////////             
                 //////////////////////////////////////////////                 
                     //////////////////////////////////////                     
                           ///////////////////////////                          
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and try to login with ssh&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIks8i/btrlLvLQXDI/KjAnMG2NQimiF7jP8QPnP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIks8i/btrlLvLQXDI/KjAnMG2NQimiF7jP8QPnP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIks8i/btrlLvLQXDI/KjAnMG2NQimiF7jP8QPnP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIks8i%2FbtrlLvLQXDI%2FKjAnMG2NQimiF7jP8QPnP1%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;978&quot; height=&quot;734&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and another account will not show&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ0qCt/btrlGJREIq8/UMfP60BWTyQMXdfZpLkhrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ0qCt/btrlGJREIq8/UMfP60BWTyQMXdfZpLkhrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ0qCt/btrlGJREIq8/UMfP60BWTyQMXdfZpLkhrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ0qCt%2FbtrlGJREIq8%2FUMfP60BWTyQMXdfZpLkhrk%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;978&quot; height=&quot;581&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/22</guid>
      <comments>https://keepworking.tistory.com/22#entry22comment</comments>
      <pubDate>Sun, 21 Nov 2021 20:39:52 +0900</pubDate>
    </item>
    <item>
      <title>사용자 별로 MOTD 따로 두기</title>
      <link>https://keepworking.tistory.com/21</link>
      <description>&lt;h1&gt;개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 MOTD관련해서 글을 다룬적이 있다.&lt;br /&gt;&lt;a href=&quot;https://keepworking.tistory.com/8&quot;&gt;https://keepworking.tistory.com/8&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보면은 알겠지마는 이건 전체 유저에게 동일하게 적용이 되는데&lt;br /&gt;서버를 함께 공유하는 사용자에게 동일한 접속 화면을보이기는 좀 좋지 않으니 사용자 별로 별도의 화면을 둘 수 있는 방법을 좀 찾아서 이번에 공유 하게 되었다.&lt;br /&gt;정석인 방법은 아니고 실제로 MOTD가 나오는 타이밍과 다르지만 쓸만하다.&lt;/p&gt;
&lt;h1&gt;profile.d 스크립트 작성하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;/etc/profile.d/usermotd.sh&lt;/code&gt; 파일을 만들어서 수정해주자&lt;br /&gt;&lt;code&gt;sudo vi /etc/profile.d/usermotd.sh&lt;/code&gt; 명령으로 수정하거나 nano를 사용해도 된다.&lt;/p&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;test -e /home/$USER/.motd &amp;amp;&amp;amp; cat /home/$USER/.motd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에 대해 설명하자면 &lt;code&gt;test -e $FILE&lt;/code&gt;은 파일이 있는지 없는지를 검사해준다. 참고로 &lt;code&gt;[ -e $FILE]&lt;/code&gt; 도 똑같은 연산을 한다 그래서 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 이후에 결과가 참이 나오면 그다음에 오는 명령이 실행된다. &lt;code&gt;cat $FILE&lt;/code&gt;은 단순 파일을 실행해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;code&gt;/home/$USER/.motd&lt;/code&gt; 경로에 파일이 있으면 그파일을 화면에 표시하는게 목적이다.&lt;/p&gt;
&lt;h1&gt;실제로 적용해보기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;~/.motd&lt;/code&gt; 경로에 파일을 하나 만들어주자&lt;br /&gt;내용은 자유롭게 해도 된다.&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;
                           ///////////////////////////                          
                     ///////////////////////////////////////                    
                 ///////////////////////////////////////////////                
              /////////////////////////////////////////////////////             
           ///////////////////////////////////////&amp;amp;@@@@@@(///////////           
         ////////////////////////////////////////@@@@@@@@@@/////////////        
       ////////////////////////////@@@@@@@@@@@///@@@@@@@@@@//////////////       
      /////////////////////////@@@@@@@@@@@@@@@@///@@@@@@@@/////////////////     
     ////////////////////@@@@///@@@@@@@@@@@@@@@@@%//////////////////////////    
   ////////////////////@@@@@@@///@@@////////(@@@@@@@@@@@@@///////////////////   
   //////////////////@@@@@@@@@@///////////////////@@@@@@@@@@//////////////////  
  //////////////////@@@@@@@@#///////////////////////@@@@@@@@@////////////////// 
 /////////////////(@@@@@@@@///////////////////////////@@@@@@@@//////////////////
 //////////&amp;amp;@@@(///@@@@@@@/////////////////////////////@@@@@@@@/////////////////
 ////////@@@@@@@@@//@@@@@///////////////////////////////@@@@@@@/////////////////
 ///////@@@@@@@@@@@//@@@@///////////////////////////////////////////////////////
 ////////@@@@@@@@@//@@@@@///////////////////////////////@@@@@@@/////////////////
 ///////////@@@////@@@@@@@/////////////////////////////@@@@@@@@/////////////////
 //////////////////@@@@@@@@///////////////////////////@@@@@@@@//////////////////
  //////////////////@@@@@@@@@///////////////////////@@@@@@@@@////////////////// 
   //////////////////@@@@@@@@@@//////////////////&amp;amp;@@@@@@@@@@//////////////////  
   (///////////////////@@@@@@@///@@@@///////@@@@@@@@@@@@@@///////////////////   
     ////////////////////%@@@///@@@@@@@@@@@@@@@@@///////////////////////////    
      ////////////////////////#@@@@@@@@@@@@@@@@///@@@@@@@@/////////////////     
        ///////////////////////////(@@@@@@@@@////@@@@@@@@@@//////////////       
         ////////////////////////////////////////@@@@@@@@@@////////////         
            ///////////////////////////////////////@@@@@@////////////           
              /////////////////////////////////////////////////////             
                 //////////////////////////////////////////////                 
                     //////////////////////////////////////                     
                           ///////////////////////////                          
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 해당 계정으로 들어가보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Sp6O/btrlEtaGyk8/jtMaLp3xk7Zvucj9qc1fKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Sp6O/btrlEtaGyk8/jtMaLp3xk7Zvucj9qc1fKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Sp6O/btrlEtaGyk8/jtMaLp3xk7Zvucj9qc1fKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Sp6O%2FbtrlEtaGyk8%2FjtMaLp3xk7Zvucj9qc1fKk%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;978&quot; height=&quot;734&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H6QIQ/btrlFJj3FHI/NHe4tOmWkGRZfzZTKCzbv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H6QIQ/btrlFJj3FHI/NHe4tOmWkGRZfzZTKCzbv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H6QIQ/btrlFJj3FHI/NHe4tOmWkGRZfzZTKCzbv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH6QIQ%2FbtrlFJj3FHI%2FNHe4tOmWkGRZfzZTKCzbv1%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;978&quot; height=&quot;581&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 다른 계정으로 접속하면 안보인다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/21</guid>
      <comments>https://keepworking.tistory.com/21#entry21comment</comments>
      <pubDate>Sun, 21 Nov 2021 20:27:14 +0900</pubDate>
    </item>
    <item>
      <title>Byobu 뵤부 소개및 사용법</title>
      <link>https://keepworking.tistory.com/20</link>
      <description>&lt;h1&gt;개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Byobu는 정말 좋은 도구다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mzTnP/btrlhDeel0p/TGBNs6ZktOOKlkxAnpimEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mzTnP/btrlhDeel0p/TGBNs6ZktOOKlkxAnpimEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mzTnP/btrlhDeel0p/TGBNs6ZktOOKlkxAnpimEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmzTnP%2FbtrlhDeel0p%2FTGBNs6ZktOOKlkxAnpimEk%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;1110&quot; height=&quot;403&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병풍이라는 이름에서 따와서 영어로 byobu라 부르고 있는데&lt;br /&gt;이게 정말 물건이다. 뵤부나 TMUX가 없이 리눅스를 사용하게 된다면 아마 터미널 을 오가느라 터미널 창을 여러개를 띄워서 화면을 어지럽힐거다&lt;br /&gt;그리고 회사에서 실행 시켜놓고 간 빌드 의 진행상황을 집에서 확인이 불가능 할것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Byobu는 이모든걸 해결해준다.&lt;/p&gt;
&lt;h1&gt;장점&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;터미널 분할&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병풍이라는 이름에 걸맞게 Byobu는 터미널 화면 하나를 여러개의 격자와 탭으로 분리해서 사용할 수 있게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이건 TMUX에서 제공하는 기능이기는 하지만 Byobu 자체가 TMUX를 사용하기 편하게 해준 도구다보니 그냥 TMUX의 장점은 다 Byobu의 장점이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;1143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qn3vt/btrliMIK9Nx/QICsTKIAUXWyZ0KOt9Cqj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qn3vt/btrliMIK9Nx/QICsTKIAUXWyZ0KOt9Cqj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qn3vt/btrliMIK9Nx/QICsTKIAUXWyZ0KOt9Cqj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQn3vt%2FbtrliMIK9Nx%2FQICsTKIAUXWyZ0KOt9Cqj0%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;1909&quot; height=&quot;1143&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;1143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널을 여러게의 격자로 분할 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한쪽은 디버그 로그를 올리고, 다른한쪽은 빌드하고, 다른한쪽은 vi 같은걸로 코드 수정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런것들이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 vim은 나도 잘 안쓴다. 그냥 가끔 컴파일 했는데 오타 같은거 나면 vscode실행하는 것보다 vim으로 바로 켜서 수정하는게 빠르니 그럴때만 사용하는 것 같다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세션 유지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세션 유지는 정말 마법 같은 기능이다. 솔직이 이런 기능이 있는덕에 내가 집가서 일을 이어서하는데 전혀 불편함이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 말로 들어서는 뭔말인가 싶겠지만 아래 캡쳐 이미지를 보면 이해가 간다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3154&quot; data-origin-height=&quot;1284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1ix1d/btrlpWpv7oy/0pPYSmNZl91INIytKJAZM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1ix1d/btrlpWpv7oy/0pPYSmNZl91INIytKJAZM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1ix1d/btrlpWpv7oy/0pPYSmNZl91INIytKJAZM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1ix1d%2FbtrlpWpv7oy%2F0pPYSmNZl91INIytKJAZM0%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;3154&quot; height=&quot;1284&quot; data-origin-width=&quot;3154&quot; data-origin-height=&quot;1284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격에서 ssh를 접속하더라도 byobu에 들어가면 내가 회사에서 사용하던 작업 환경이 그대로 내 화면에 표시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널의 배치 심지어 실행중인 기능의 로그가 나오는 화면이 그대로 표시가 된다.&lt;br /&gt;ssh연결해서 처음부터 로그 보이게 adb같은거 연결하고 막 그럴 필요가 없이&lt;br /&gt;로그 보이던거 그냥 스크롤하고, 오른쪽에서 빌드 명령 날리는 것도 ⬆️키 눌러서 전에 실행했던 명령어들 긁어다 오면 그만이니 엄청 편하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 화면의 사이즈가 달라져도 그 사이즈에 맞추어 조절이 된다.&lt;br /&gt;물론 이건 가장 작은 화면 기준으로 맞추어지고 위에 캡쳐 이미지 처럼 큰 화면에서는 여백이 남는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 그렇다 하더라도 대체로 편하고 그 여백이 거슬리면&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;who
#orange   pts/10       2021-11-18 00:11 (#####)
#orange   pts/11       2021-11-18 00:12 (tmux(373026).%3)
#orange   pts/12       2021-11-18 00:11 (tmux(373026).%1)
#orange   pts/13       2021-11-18 00:12 (tmux(373026).%4)
#orange   pts/14       2021-11-18 00:21 (#####)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ps aux |grep pts/14
#orange    394071  0.0  0.0  13964  5908 ?        S    00:21   0:00 sshd: orange@pts/14
#orange    394072  0.0  0.0   8288  5212 pts/14   Ss   00:21   0:00 -bash
#orange    394153  0.0  0.0   7140  3532 pts/14   S+   00:21   0:00 tmux -u attach -t 1
#orange    413646  0.0  0.0   6440   672 pts/13   S+   00:29   0:00 grep --color=auto pts/14&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;kill -9 394071&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 과정으로 다른 세션을 죽여버리면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 세션이 방해되는 세션인지는 대략 접속한 시간으로 잡으면 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;편리한 단축키&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단축키가 편리하다 위의 것들이 tmux의 장점과 겹친다면 이건 byobu고유의 장점이다.&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;h2 data-ke-size=&quot;size26&quot;&gt;kernel menuconfig 가능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거는 좀 중요한 기능이다.&lt;br /&gt;커널 관련 작업을 한다면 원격 ssh프로그램에 따라서 menuconfig 가 안되는 경우가 있는데 byobu 통해서 하면 그런거 다 무시하고 그냥 된다.&lt;/p&gt;
&lt;h1&gt;설치하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu 사용자면 설치 안해도 된다.&lt;br /&gt;아마 &lt;code&gt;16.04&lt;/code&gt;는 직접 설치 했던거 같은데 &lt;code&gt;18.04&lt;/code&gt;, &lt;code&gt;20.04&lt;/code&gt; 는 설치 안해 도 된다.&lt;br /&gt;기본적으로 설치되어 있으니&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;byobu&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 실행해 주자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 사용자는 잘모르겠다. 홈페이지 링크에 아마 자료 있을듯.&lt;/p&gt;
&lt;h1&gt;사용법&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 주로 사용하는 기능 위주의 사용법이다.&lt;br /&gt;디테일한 기능들은 홈페이지 링크에서 찾아보도록 하자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;화면 분할&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;SHIFT&lt;/code&gt; + &lt;code&gt;F2&lt;/code&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;세로&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;CTRL&lt;/code&gt; + &lt;code&gt;F2&lt;/code&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;새탭&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;F2&lt;/code&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;새 세션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;CTRL&lt;/code&gt; + &lt;code&gt;SHIFT&lt;/code&gt; + &lt;code&gt;F2&lt;/code&gt;&lt;br /&gt;이건 잘안쓰는 데 별도의 새로운 세션이 생긴다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;칸 이동&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;SHIFT&lt;/code&gt; + ➡️⬅️⬆️⬇️&lt;br /&gt;상하좌우키로 생성된 칸을 이동할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;탭 이동&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ALT&lt;/code&gt; + ➡️⬅️&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세션 이동&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;ALT&lt;/code&gt; + ⬆️⬇️&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마우스 클릭 활성화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;나는 무조건 키보드만써&quot; 하는 분은 안써도 되고 탭이동이나 세션이동 안하고 마우스로 바로 선택 하기에는 정말 좋은 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거 없으면 브라우저로 뭐 검색하다가 바로 다른 세션에 입력하려고 할때 괜히 딴세션에 이상한 명령어 입력하게 되니 이기능은 키는게 좋다. 입력하고자 하는 칸을 클릭하면 바로 해당 세션으로 이동이 되고 마찬가지로 탭도 이동이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 우클릭으로 접근할 수 있는 설정들 도 있어서 도움이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 먼저 &lt;code&gt;ALT&lt;/code&gt; + &lt;code&gt;F12&lt;/code&gt; 를 두번 누르면 마우스 클릭이 활성화 된다.&lt;br /&gt;이후 &lt;code&gt;ALT&lt;/code&gt; + &lt;code&gt;F12&lt;/code&gt; 를 누르면 마우스 클릭 기능이 토글된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세션 끄기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뵤부 프로세스 종료 안하고 그냥 뵤부 창을 끄고 싶을때 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;F6&lt;/code&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;칸 닫기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뵤부를 전부 닫지 않고 만들어둔 칸을 닫을 때 쓴다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;exit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 그냥그 칸 터미널에 exit입력해도 되고&lt;br /&gt;&lt;code&gt;CTRL&lt;/code&gt; + &lt;code&gt;F6&lt;/code&gt; 누르면 닫친다.&lt;br /&gt;원래 실행중인게 있다면 종료되거나 하는데 백그라운드로 실행시켰으면 그건 ps로 찾아서 종료해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이정도만 쓸줄 알면 다 사용 할 수 있다고 보면 된다.&lt;/p&gt;
&lt;h1&gt;팁&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우즈 터미널을 사용한다면 아마 이것저것 키바인딩이 안먹힌다&lt;br /&gt;탭 전환이 안된다거나 등등등...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우즈 터미널은 다음과 같이 키바인딩 설정을 수정해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정에 &lt;code&gt;⚙️Json 파일 열기&lt;/code&gt; 를 누르면 수정이 가능하다.&lt;/p&gt;
&lt;pre class=&quot;clojure&quot;&gt;&lt;code&gt;
{
    &quot;$schema&quot;: &quot;https://aka.ms/terminal-profiles-schema&quot;,
    &quot;actions&quot;: 
    [
        {
            &quot;command&quot;: 
            {
                &quot;action&quot;: &quot;copy&quot;,
                &quot;singleLine&quot;: false
            },
            &quot;keys&quot;: &quot;ctrl+c&quot;
        },
        {
            &quot;command&quot;: &quot;unbound&quot;,
            &quot;keys&quot;: &quot;alt+up&quot;
        },
        {
            &quot;command&quot;: &quot;unbound&quot;,
            &quot;keys&quot;: &quot;alt+down&quot;
        },
        {
            &quot;command&quot;: &quot;unbound&quot;,
            &quot;keys&quot;: &quot;alt+right&quot;
        },
        {
            &quot;command&quot;: &quot;unbound&quot;,
            &quot;keys&quot;: &quot;alt+left&quot;
        },
        {
            &quot;command&quot;: &quot;unbound&quot;,
            &quot;keys&quot;: &quot;alt+f12&quot;
        },
        {
            &quot;command&quot;: &quot;find&quot;,
            &quot;keys&quot;: &quot;ctrl+shift+f&quot;
        },
        {
            &quot;command&quot;: &quot;paste&quot;,
            &quot;keys&quot;: &quot;ctrl+v&quot;
        }
    ],
    .....
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/20</guid>
      <comments>https://keepworking.tistory.com/20#entry20comment</comments>
      <pubDate>Thu, 18 Nov 2021 01:00:42 +0900</pubDate>
    </item>
    <item>
      <title>Sudo hint 숨기기</title>
      <link>https://keepworking.tistory.com/19</link>
      <description>&lt;h1&gt;개요&lt;/h1&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;To run a command as administrator (user &quot;root&quot;), use &quot;sudo &amp;lt;command&amp;gt;&quot;.
See &quot;man sudo_root&quot; for details.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투에 새로 사용자를 추가하면 이렇게 로그가 나온다&lt;br /&gt;이럴때는 다음 명령으로 sudo hint를 없앨 수 있다.&lt;/p&gt;
&lt;pre class=&quot;irpf90&quot;&gt;&lt;code&gt;touch ~/.sudo_as_admin_successful&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/19</guid>
      <comments>https://keepworking.tistory.com/19#entry19comment</comments>
      <pubDate>Thu, 18 Nov 2021 00:16:32 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 20.04 Docker 설치하기</title>
      <link>https://keepworking.tistory.com/18</link>
      <description>&lt;h1&gt;개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투 서버에 도커를 설치하는 법을 알아보자&lt;br /&gt;예전에는 설치 과정이 워낙 복잡하고, 우분투 패키지에서 제공하는 방식또한 마찬가지로 구버전만 제공을 하다보니 설치가 많이 어려웠는데 도커 공식 홈페이지에서 편리한 방법이 소개되어 여기다 옮긴다.&lt;/p&gt;
&lt;h1&gt;설치하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 홈페이지 에서 제공하는 인스톨 스크립트이다. root 나 sudo 권한을 필요로 한다.&lt;/p&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;curl -fsSL https://get.docker.com -o get-docker.sh
DRY_RUN=1 sh ./get-docker.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것만 설치하면 끝이다.&lt;/p&gt;
&lt;h1&gt;도커 권한 추가하기&lt;/h1&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;sudo usermod -aG docker $USER&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자에게 도커 권한을 안주면 매번 &lt;code&gt;sudo docker ....&lt;/code&gt; 처럼 앞에 &lt;code&gt;sudo&lt;/code&gt; 를 붙여야 하니 위 명령어를 실행해서 현재 계정에 docker접근 권한을 주는것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;usermod&lt;/code&gt; 를 했음에도 바로 실행이 안된다면 재부팅 한번 해보자.&lt;/p&gt;
&lt;h1&gt;도커 우분투 이미지 다운로드 및 사용&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도커 이미지 검색&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;docker search&lt;/code&gt; 명령을 통해서 검색이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;docker search ubuntu&lt;/code&gt; 를 실행하면 ubuntu 키워드가 들어간 이미지 목록이 나오는데 여기사 스타 수가 가장 많은것만 보면 된다.&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;
NAME                                                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys&amp;hellip;   13130     [OK]
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface &amp;hellip;   587                  [OK]
websphere-liberty                                         WebSphere Liberty multi-architecture images &amp;hellip;   282       [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi&amp;hellip;   256                  [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with &quot;headless&quot; VNC session&amp;hellip;   242                  [OK]
ubuntu-upstart                                            DEPRECATED, as is Upstart (find other proces&amp;hellip;   113       [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          50                   [OK]
ubuntu-debootstrap                                        DEPRECATED; use &quot;ubuntu&quot; instead                45        [OK]
i386/ubuntu                                               Ubuntu is a Debian-based Linux operating sys&amp;hellip;   26
solita/ubuntu-systemd                                     Ubuntu + systemd                                24                   [OK]
nuagebec/ubuntu                                           Simple always updated Ubuntu docker images w&amp;hellip;   24                   [OK]
1and1internet/ubuntu-16-apache-php-5.6                    ubuntu-16-apache-php-5.6                        14                   [OK]
1and1internet/ubuntu-16-apache-php-7.0                    ubuntu-16-apache-php-7.0                        13                   [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mariadb-10   ubuntu-16-nginx-php-phpmyadmin-mariadb-10       11                   [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4         ubuntu-16-nginx-php-5.6-wordpress-4             9                    [OK]
1and1internet/ubuntu-16-nginx-php-5.6                     ubuntu-16-nginx-php-5.6                         8                    [OK]
1and1internet/ubuntu-16-apache-php-7.1                    ubuntu-16-apache-php-7.1                        7                    [OK]
darksheer/ubuntu                                          Base Ubuntu Image -- Updated hourly             5                    [OK]
1and1internet/ubuntu-16-nginx-php-7.0                     ubuntu-16-nginx-php-7.0                         4                    [OK]
1and1internet/ubuntu-16-nginx-php-7.1-wordpress-4         ubuntu-16-nginx-php-7.1-wordpress-4             3                    [OK]
owncloud/ubuntu                                           ownCloud Ubuntu base image                      3
1and1internet/ubuntu-16-php-7.1                           ubuntu-16-php-7.1                               1                    [OK]
smartentry/ubuntu                                         ubuntu with smartentry                          1                    [OK]
1and1internet/ubuntu-16-sshd                              ubuntu-16-sshd                                  1                    [OK]
1and1internet/ubuntu-16-rspec                             ubuntu-16-rspec                                 0                    [OK]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제일 위에 있는 스타수가 만단위인 이미지를 받으면 된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도커 이미지 다운로드&lt;/h2&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;docker pull ubuntu:16.04 # 뒤에 원하는 버전을 수정해서 넣으면 된다.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도커 이미지 바로 실행&lt;/h2&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;docker run -it --rm ubuntu:16.04
# -it 는 tty 인터페이스가 필요할때 추가한 다 이거 없으면 터미널 접근을 못한다.
# --rm 프로세스가 종료되면 컨테이너를 바로 삭제한다. 
# 당장 지금은 해당 컨테이너를 테스트로 만드는 것이니 그냥 삭제하자.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도커 컨테이너 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에있는 도커 이미지 실행 과는 다르게 생성 실행 연결 단계를 나눈다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;docker create -it --name=&quot;mycontainer&quot; ubuntu:16.04&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 컨테이너는 아래와 같이 검색 할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;docker container ls&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS              PORTS     NAMES
0e1fa52c340b   ubuntu:16.04   &quot;/bin/bash&quot;   2 minutes ago   Up About a minute             mycontainer&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도커 컨테이너 실행&lt;/h2&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;docker start mycontainer&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도커 컨테이너 접속&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;docker attach mycontainer&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;root@0e1fa52c340b:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@0e1fa52c340b:/#&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도커 컨테이너 삭제&lt;/h2&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;docker container rm mycontainer&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 도커 이미지를 빌드하고, 그걸 또 다시 사용하는 건 다음 기회로 하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 설정 하는 방법이나, 등등의 것이 할게 좀 많은거 같다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/18</guid>
      <comments>https://keepworking.tistory.com/18#entry18comment</comments>
      <pubDate>Sun, 14 Nov 2021 23:33:01 +0900</pubDate>
    </item>
    <item>
      <title>Cockpit Project 로 리눅스 서버 관리하기</title>
      <link>https://keepworking.tistory.com/17</link>
      <description>&lt;h1&gt;개요&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cockpit-project 는 웹화면에서 서버를 관리할 수 있는 프로젝트이다. 간단히 설치가 가능하며, 원하는 다양한 기능을 추가할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함께하는 사용자의 추가나 스토리지의 관리또한 자유롭게 할 수 있다.&lt;/p&gt;
&lt;h1&gt;콕핏 홈페이지&lt;/h1&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://cockpit-project.org/&quot;&gt;https://cockpit-project.org/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;설치하기&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IXMPB/btrkIQrzkRK/rQDUZTjiuAi1ll9t2jsAM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IXMPB/btrkIQrzkRK/rQDUZTjiuAi1ll9t2jsAM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IXMPB/btrkIQrzkRK/rQDUZTjiuAi1ll9t2jsAM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIXMPB%2FbtrkIQrzkRK%2FrQDUZTjiuAi1ll9t2jsAM0%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;1042&quot; height=&quot;848&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치를 지원하는 다양한 운영체제가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 나는 Ubuntu 20.04를 기준으로 설명한다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;. /etc/os-release
sudo apt install -t ${VERSION_CODENAME}-backports cockpit&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 방식이 아닌 그냥 &lt;code&gt;apt install cockpit&lt;/code&gt; 을 사용하면 구버전 cockpit이 설치되니 주의하자.&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;code&gt;https://serverhost:9090&lt;/code&gt; 에 접속 하면 다음과 같은 로그인 화면을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bed1t8/btrkOkkRo2R/13wjZq0ORB0Q1AHxL1VyY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bed1t8/btrkOkkRo2R/13wjZq0ORB0Q1AHxL1VyY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bed1t8/btrkOkkRo2R/13wjZq0ORB0Q1AHxL1VyY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbed1t8%2FbtrkOkkRo2R%2F13wjZq0ORB0Q1AHxL1VyY0%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;1700&quot; height=&quot;1293&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스토리지 정보 등도 조회 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ssE0z/btrk1P4R31Y/2W0Ta7eSaM68G68936jhO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ssE0z/btrk1P4R31Y/2W0Ta7eSaM68G68936jhO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ssE0z/btrk1P4R31Y/2W0Ta7eSaM68G68936jhO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FssE0z%2Fbtrk1P4R31Y%2F2W0Ta7eSaM68G68936jhO0%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;1067&quot; height=&quot;974&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;974&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지를 설치하기에 따라서 가상 머신을 관리하는 기능도 있으며, 다양한 기능이 함께 제공이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 제공하는 기능만으로 사용자를 추가하거나 하는 기능을 모두 사용할 수 있으니 이를 이용하는것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cockpit-project.org/applications.html&quot;&gt;https://cockpit-project.org/applications.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/17</guid>
      <comments>https://keepworking.tistory.com/17#entry17comment</comments>
      <pubDate>Sun, 14 Nov 2021 23:09:36 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu 에서 Flutter 설치하기 / Ubuntu 20.04</title>
      <link>https://keepworking.tistory.com/16</link>
      <description>&lt;h1&gt;플러터 설치&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히도 패키지로 한방에 설치가 된다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;sudo snap install flutter --classic&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;데스크탑 앱 개발하기&lt;/h1&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://flutter.dev/desktop&quot;&gt;https://flutter.dev/desktop&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거 참고 해야할듯.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;flutter config --enable-windows-desktop
flutter config --enable-macos-desktop
flutter config --enable-linux-desktop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 타겟을 인에이블 해줘야 하는듯하다.&lt;br /&gt;타깃 운영체제를 여러개를 활성화 해주면 동시에 빌드가 되나 싶다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;flutter build windows
#&quot;build windows&quot; only supported on Windows hosts.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 좀 별론데 크로스 플랫폼 빌드가 윈도우만 안된다고?&lt;/p&gt;
&lt;h1&gt;웹기반으로 앱 개발하기&lt;/h1&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;flutter config --enable-web

flutter build web&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 web 기능 활성화 해주고&lt;br /&gt;web 을 빌드해주면&lt;br /&gt;&lt;code&gt;build/web&lt;/code&gt; 경로 에 소스코드가 모아져 있다. 이걸 http 호스트만 해주면 됨&lt;/p&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;python3 -m http.server
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음에 &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt; 주소로 들어가면, 아래처럼 이미지가 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;1051&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXi26V/btrkJmX3plN/igk3wYCXF23xF9CYkk2CC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXi26V/btrkJmX3plN/igk3wYCXF23xF9CYkk2CC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXi26V/btrkJmX3plN/igk3wYCXF23xF9CYkk2CC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXi26V%2FbtrkJmX3plN%2Figk3wYCXF23xF9CYkk2CC0%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;521&quot; height=&quot;647&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;1051&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 로직이 구성이 된듯 하니 내부 코드를 읽어보고 동작 하는 방법을 알아보면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 이렇게 웹으로는 바로 랜더링이 되서 다행이다.&lt;br /&gt;사용법만 조금 숙련하면 될걸로 보임.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/16</guid>
      <comments>https://keepworking.tistory.com/16#entry16comment</comments>
      <pubDate>Sun, 14 Nov 2021 22:56:43 +0900</pubDate>
    </item>
    <item>
      <title>git push/pull 할때 로그인정보 저장하기</title>
      <link>https://keepworking.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;git pull/push 를 할때마다 로그인하기가 번거롭다면 git의 다음 기능을 참고하면 도움이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1631154040473&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config --global credential.helper store&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 최초에 한번 로그인하면 앞으로는 로그인 안해도 됩니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/14</guid>
      <comments>https://keepworking.tistory.com/14#entry14comment</comments>
      <pubDate>Thu, 9 Sep 2021 11:21:06 +0900</pubDate>
    </item>
    <item>
      <title>Lazygit이 어째선지 깨진다면</title>
      <link>https://keepworking.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 글쓰는데 컴퓨터에 우분투를 최신버전으로 다시 까니 어째선지 lazygit이 깨지더라구요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1313&quot; data-origin-height=&quot;750&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzRid8/btrexdknQj8/U728leyf5t5uDR1JdRRJMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzRid8/btrexdknQj8/U728leyf5t5uDR1JdRRJMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzRid8/btrexdknQj8/U728leyf5t5uDR1JdRRJMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzRid8%2FbtrexdknQj8%2FU728leyf5t5uDR1JdRRJMK%2Fimg.png&quot; data-origin-width=&quot;1313&quot; data-origin-height=&quot;750&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 뭔가 옆줄도 깨지고 글자도 한두개씩 사라지고 이러길래 이유가 뭔가 했더니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1631117134196&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export LANG=en_US.UTF8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 하고, 다시 출력을 하니, 정상적으로 표시되는걸 확인했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 GO CUI 라이브러리가 유니코드 지원관련해서 작업을 한다고 ko_KR과 같은 다른 로케일에 대해 예외처리를 한듯한데 그것이 원인이 된듯하네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1631117291259&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo 'LANG=&quot;en_US.UTF-8&quot;' &amp;gt;&amp;gt; ~/.bashrc &amp;amp;&amp;amp; source ~/.bashrc&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;일단 위 명령어를 입력해서 bashrc에 등록해주고 현재 터미널을 한번 초기화 해줍시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/13</guid>
      <comments>https://keepworking.tistory.com/13#entry13comment</comments>
      <pubDate>Thu, 9 Sep 2021 01:08:56 +0900</pubDate>
    </item>
    <item>
      <title>벨로다인 라이다 / 라이다 동작원리</title>
      <link>https://keepworking.tistory.com/12</link>
      <description>&lt;p&gt;안녕하세요 일처리 못하는 놈입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;특별한건 아니고 이번에 벨로다인이 상장을 한다해서 제가 생각하는걸 끄적이고 여기에 글을 씁니다.&lt;/p&gt;
&lt;p&gt;저번에 한번사서 손해를 크게 봤습니다. 손절을 했는데 이번에 다시 오르길래 또 샀습니다. 자꾸 어께에서 사고 무릎에서 팔고있는데 아무래도 저는 안될놈인가 봅니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;벨로다인의 핵심 상품인 라이다를 설명하려고 하는데 이부분을 진행해보고자 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TOF ( Time Of Flight )&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선 라이다 센서의 동작원리를 알기위해서는 tof에 대한 지식이 약간 필요합니다. 물체의 거리를 측정하는데 사용하는 방법론중의 한가지입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;빛, 소리 등이 반사되어 자신에게 돌아오는데 걸리는 시간을 측정해서 거리를 측정합니다. 소리는 습도나 기압에 따라 이동속도가 달라지는 증상이 있지만 빛은 거의 그렇지 않지요, 초음파 센서도 원리만 따지면 tof센서지만 보통 tof센서라 부르면 다음과 같이 생겼습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTqpa5/btqHBR8cAtB/GTVDBaNBO3ksNoFrb5Dll0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTqpa5/btqHBR8cAtB/GTVDBaNBO3ksNoFrb5Dll0/img.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;395&quot; height=&quot;NaN&quot; style=&quot;width: 55.4344%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTqpa5/btqHBR8cAtB/GTVDBaNBO3ksNoFrb5Dll0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTqpa5%2FbtqHBR8cAtB%2FGTVDBaNBO3ksNoFrb5Dll0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esWfdZ/btqHAnfroV0/asfCLq3HX76NwZOKWPqgA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esWfdZ/btqHAnfroV0/asfCLq3HX76NwZOKWPqgA1/img.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; style=&quot;width: 43.4028%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esWfdZ/btqHAnfroV0/asfCLq3HX76NwZOKWPqgA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesWfdZ%2FbtqHAnfroV0%2FasfCLq3HX76NwZOKWPqgA1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;tof sensor&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;우선 외관을 보면 수광부와 발광부 이렇게 쏘고 받는 구조로 되어있습니다. 오른쪽은 아예 칩으로 되어있는 제품이라 수광부 발광부가 잘안보이지만 자세히 보면 구멍같은게 뚤려 있습니다. 이런것들은 핸드폰같은데 들어가거나 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다만, 이것들의 측정할 수 있는 대상의 거리는 점입니다. 하나의 점의 거리만 알 수 있는거지요,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;라이다 센서&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 바로 라이다 센서를 봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;438&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pMsN6/btqHwhAvp3S/k78GKQdpvE6yXdqC0K5jW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pMsN6/btqHwhAvp3S/k78GKQdpvE6yXdqC0K5jW0/img.jpg&quot; data-alt=&quot;sweep lidar sensor&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pMsN6/btqHwhAvp3S/k78GKQdpvE6yXdqC0K5jW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpMsN6%2FbtqHwhAvp3S%2Fk78GKQdpvE6yXdqC0K5jW0%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;438&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;sweep lidar sensor&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;참고로 올렸는대 생각보다 귀엽네요 ㅎㅎ, 이거는 벨로다인의 라이다 센서는 아니고 또 다른 라이다 센서입니다.&lt;/p&gt;
&lt;p&gt;방금 이야기했던 tof 센서를 뱅그르르 돌려가지고 공간에 대한 정보를 얻어 냅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb2NgH/btqHq2w7MeY/HhP3qnxcMTpIfMVsHFK3w1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb2NgH/btqHq2w7MeY/HhP3qnxcMTpIfMVsHFK3w1/img.gif&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; style=&quot;width: 51.1702%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb2NgH/btqHq2w7MeY/HhP3qnxcMTpIfMVsHFK3w1/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb2NgH%2FbtqHq2w7MeY%2FHhP3qnxcMTpIfMVsHFK3w1%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H0H0W/btqHA40Z9hk/qkFaLzIi3o710EiXpbNlD1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H0H0W/btqHA40Z9hk/qkFaLzIi3o710EiXpbNlD1/img.gif&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; style=&quot;width: 47.6671%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H0H0W/btqHA40Z9hk/qkFaLzIi3o710EiXpbNlD1/img.gif&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH0H0W%2FbtqHA40Z9hk%2FqkFaLzIi3o710EiXpbNlD1%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;0&quot; height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;출처 dfrobot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;적절한 사진이 있어서 가져왔습니다. tof 는 점밖에 인식을 못하니 이걸 돌려서 360도 모두 인식하겠다~~ 이런 느낌입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;벨로다인 라이다&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오른쪽의 이미지를 보면 2d로만 보여서 생각하고 있던 벨로다인의 라이다와 조금 다르다고 생각 할 수 있지만&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HwuZ4/btqHEfub1mv/bkScY78jMu1KkbpIAjEQVK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HwuZ4/btqHEfub1mv/bkScY78jMu1KkbpIAjEQVK/img.jpg&quot; data-alt=&quot;출처 벨로다인 유튜브&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HwuZ4/btqHEfub1mv/bkScY78jMu1KkbpIAjEQVK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHwuZ4%2FbtqHEfub1mv%2FbkScY78jMu1KkbpIAjEQVK%2Fimg.jpg&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;출처 벨로다인 유튜브&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&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/Y7LAv/btqHAmOmXaU/PMQkeyLuwW5zxkf7wZkbfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y7LAv/btqHAmOmXaU/PMQkeyLuwW5zxkf7wZkbfk/img.png&quot; data-alt=&quot;벨로다인 티어다운 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y7LAv/btqHAmOmXaU/PMQkeyLuwW5zxkf7wZkbfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY7LAv%2FbtqHAmOmXaU%2FPMQkeyLuwW5zxkf7wZkbfk%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;벨로다인 티어다운 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;실제로 티어다운 영상을 보게되면 제가 화살표 표시를 한 부분이 수광부, 발광부의 역할을 하게됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모든 라이다가 모터를 달고 뱅글뱅글 돌지는 않습니다. 다른방법도 몇가지가 있습니다. 전체적으로 계속 돌지 않고 특정 각도만 측정을 하는 솔리드 스테이트 라이다 라는 제품이 있습니다.&lt;/p&gt;
&lt;p&gt;이제품 같은 경우에는 안에 거울을 두어 거울을 흔들면서 특정 각도를 바꾸어가면서 동작을 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;수명의 관점에서는 360도 회전하는 라이다보다는 좋을것으로 예상합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/12</guid>
      <comments>https://keepworking.tistory.com/12#entry12comment</comments>
      <pubDate>Tue, 1 Sep 2020 23:07:02 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 터미널에서 작업관리하기 / jobs / bg / fg</title>
      <link>https://keepworking.tistory.com/11</link>
      <description>&lt;p&gt;안녕하세요? 일처리 못하는 놈입니다.&lt;/p&gt;
&lt;p&gt;리눅스 터미널에서 여러개의 작업을 실행해야할때 보통은 새로운 터미널을 띄우거나 byobu 같은 것들을 사용해서 작업을 진행합니다.&lt;/p&gt;
&lt;p&gt;그러나 간혹가다가 USB UART 같은 것들을 통해 타겟 장비의 터미널을 이용할때는 그렇게 작업하지 못하는 경우가 생깁니다.&lt;/p&gt;
&lt;p&gt;이때는 다음 3개의 명령어만 사용하면 큰 어려움 없이 작업을 진행 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1598405495203&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;jobs # 실행 중인 커맨드들을 관리합니다.

bg # 특정 커맨드를 백그라운드에서 실행합니다.

fg # 특정 커맨드를 포그라운드로 가져옵니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예시를 들어보면 좋겠지요?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;장치의 디버깅을 위해 journalctl 을 실행하고, 서버 데몬을 실행해서 테스트를 해본다고 가정합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1598405698628&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;qemux86-64:~# journalctl -f 
-- Logs begin at Mon 2020-08-24 05:55:34 UTC. --
^Z # ctrl + z 입력
[1]+  Stopped(SIGTSTP)        journalctl -f
qemux86-64:~# ./server 
^Z
[2]+  Stopped(SIGTSTP)        ./server
qemux86-64:~# jobs
[1]-  Stopped(SIGTSTP)        journalctl -f
[2]+  Stopped(SIGTSTP)        ./server
qemux86-64:~# bg 1
[1] journalctl -f &amp;amp;
qemux86-64:~# bg 2
[2] ./server &amp;amp;
qemux86-64:~# fg 1
journalctl -f
^C
qemux86-64:~# 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위와같이 사용할 수 있습니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/11</guid>
      <comments>https://keepworking.tistory.com/11#entry11comment</comments>
      <pubDate>Wed, 26 Aug 2020 22:35:33 +0900</pubDate>
    </item>
    <item>
      <title>vala 알아보기</title>
      <link>https://keepworking.tistory.com/10</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;안녕하세요?&lt;/p&gt;
&lt;p&gt;일처리 못하는 놈입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;vala 는 조금 특별한 언어로 빌드를 하게되면 c언어를 생성한다는 특징이 있습니다.&lt;/p&gt;
&lt;p&gt;물론 생성되는 소스코드가 순수 c로 생성 되지는 않고, glib의 GObject를 사용해서 구성되는 코드가 만들어집니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;리눅스에서 개발을 할때는 glib라이브러리를 많이 사용하게 되는데 좀더 편한 방법을 찾다가 알게되었습니다.&lt;/p&gt;
&lt;p&gt;아직 실무에서 사용은 해보지 못했다면 어느정도 공부해 본다면 나중에 도움이 많이 될듯 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.gnome.org/Projects/Vala/Tutorial&quot;&gt;https://wiki.gnome.org/Projects/Vala/Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1597238322298&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Projects/Vala/Tutorial - GNOME Wiki!&quot; data-og-description=&quot;&quot; data-og-host=&quot;wiki.gnome.org&quot; data-og-source-url=&quot;https://wiki.gnome.org/Projects/Vala/Tutorial&quot; data-og-url=&quot;https://wiki.gnome.org/Projects/Vala/Tutorial&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://wiki.gnome.org/Projects/Vala/Tutorial&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wiki.gnome.org/Projects/Vala/Tutorial&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Projects/Vala/Tutorial - GNOME Wiki!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;wiki.gnome.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;공식 튜토리얼 문서는 위에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서는 아주 간단한 예제를 한번 실행해 보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1597238382008&quot; class=&quot;python&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install valac # vala 설치&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;hello.vala&amp;nbsp; 파일을 만들어 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1597238425765&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void main(string[] args) {
  print(&quot;Hello, world!\n&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1597238509545&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;valac hello.vala # 컴파일
./hello # 실행결과 &amp;gt; Hello, world!&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1597238546320&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;valac hello.vala -C # c언어 소스코드 생성 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게 해서 생성된 hello.c파일을 열어보면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1597238566097&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* hello.c generated by valac 0.48.6, the Vala compiler
 * generated from hello.vala, do not modify */

#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;glib.h&amp;gt;

void _vala_main (gchar** args,
                 gint args_length1);

void
_vala_main (gchar** args,
            gint args_length1)
{
        g_print (&quot;Hello, world!\n&quot;);
}

int
main (int argc,
      char ** argv)
{
        _vala_main (argv, argc);
        return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 c언어 소스코드가 생성되는 것을 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이걸 gcc로 빌드를 해볼까요?&lt;/p&gt;
&lt;pre id=&quot;code_1597238709498&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gcc hello.c `pkg-config --cflags --libs glib-2.0` -o hello_from_c
./hello_from_c # 실행 결과 &amp;gt; Hello, world!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;별 문제 없이 빌드가 되고 실행도 되는걸 확인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;사용하기 따라서 c언어에 사용할 수 있는 라이브러리를 만들 수 도 있다고 하니 활용성이 다양할거 같은데 더 많은 부분은 직접 공부해보고 새로 포스트를 남기도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;감사합니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/10</guid>
      <comments>https://keepworking.tistory.com/10#entry10comment</comments>
      <pubDate>Wed, 12 Aug 2020 22:29:45 +0900</pubDate>
    </item>
    <item>
      <title>더 나은 man : tldr 알아보기</title>
      <link>https://keepworking.tistory.com/9</link>
      <description>&lt;p&gt;안녕하세요 일처리 못하는 놈입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;저는 tar명령어를 잘 외우지 못하는 편이라 압축을 풀거나 할 일이 생기면 매번 man명령어로 검색해보거나 구글에 검색을 하는 일이 더러 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;man 명령어는 자세하게 써있는 반면 난독증이 있는 제가 읽기에는 좋은 환경은 아니라 잘 사용하지는 못합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그래서 좋은 도구가 없을까 찾아보던중 마음에 드는 패키지가 있어서 소개 드리고자 합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tldr.sh/&quot;&gt;https://tldr.sh/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1595432294969&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;tldr pages&quot; data-og-description=&quot;tldr pages Simplified and community-driven man pages The tldr pages are a community effort to simplify the beloved man pages with practical examples. Try the live demo below, have a look at the PDF version, or follow the installation instructions. &amp;sect; Insta&quot; data-og-host=&quot;tldr.sh&quot; data-og-source-url=&quot;https://tldr.sh/&quot; data-og-url=&quot;https://tldr.sh/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZEsgs/hyGQJjccWx/Lr6TPuKivKKMFp0xrRaVmK/img.png?width=840&amp;amp;height=624&amp;amp;face=0_0_840_624&quot;&gt;&lt;a href=&quot;https://tldr.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tldr.sh/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZEsgs/hyGQJjccWx/Lr6TPuKivKKMFp0xrRaVmK/img.png?width=840&amp;amp;height=624&amp;amp;face=0_0_840_624');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;tldr pages&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;tldr pages Simplified and community-driven man pages The tldr pages are a community effort to simplify the beloved man pages with practical examples. Try the live demo below, have a look at the PDF version, or follow the installation instructions. &amp;sect; Insta&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;tldr.sh&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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/EgsgN/btqFT8kVudd/QwZh1nYD6SA47MlfOwxK8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EgsgN/btqFT8kVudd/QwZh1nYD6SA47MlfOwxK8K/img.png&quot; data-alt=&quot;이런 의미가 있었네요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EgsgN/btqFT8kVudd/QwZh1nYD6SA47MlfOwxK8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEgsgN%2FbtqFT8kVudd%2FQwZh1nYD6SA47MlfOwxK8K%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;이런 의미가 있었네요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;man만큼 자세하게 나와있지는 않지만 실제 사용 사례를 위주로 메뉴얼이 나와 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1595432372795&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install tldr&lt;/code&gt;&lt;/pre&gt;
&lt;p&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/Z3kOs/btqFUAn0IqV/jbxKcLBxQ1gyxUQvhy554K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z3kOs/btqFUAn0IqV/jbxKcLBxQ1gyxUQvhy554K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z3kOs/btqFUAn0IqV/jbxKcLBxQ1gyxUQvhy554K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ3kOs%2FbtqFUAn0IqV%2FjbxKcLBxQ1gyxUQvhy554K%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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;감사합니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <category>MAN</category>
      <category>tldr</category>
      <category>리눅스</category>
      <category>명령어</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/9</guid>
      <comments>https://keepworking.tistory.com/9#entry9comment</comments>
      <pubDate>Thu, 23 Jul 2020 00:49:10 +0900</pubDate>
    </item>
    <item>
      <title>unix/linux motd : message of the day - 로그인 메세지 추가하기</title>
      <link>https://keepworking.tistory.com/8</link>
      <description>&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/BXFtV/btqFnOGwaF4/yTr8fFdTwkKmhkWrmjHRb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BXFtV/btqFnOGwaF4/yTr8fFdTwkKmhkWrmjHRb1/img.png&quot; data-alt=&quot;몬스터 좋다...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BXFtV/btqFnOGwaF4/yTr8fFdTwkKmhkWrmjHRb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBXFtV%2FbtqFnOGwaF4%2FyTr8fFdTwkKmhkWrmjHRb1%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;몬스터 좋다...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;가끔 로그인할때마다 멋진 로고가 뜨는걸 본적이 있었는데 제 PC에서도 어떻게 설정할 수 없을까 해서 검색을 조금 했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;구글에 로그인 메세지~ 등등으로 검색을 해보니 자료가 나오네요&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1593856336968&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;hello!&quot; &amp;gt; /etc/motd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런식으로 하면 로그인할때 특정 문구가 나오게 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manytools.org/hacker-tools/convert-images-to-ascii-art/&quot;&gt;https://manytools.org/hacker-tools/convert-images-to-ascii-art/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1593858129155&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ASCII art generator for geeks! - Convert images/pictures to ASCII art online! (HTML/text)&quot; data-og-description=&quot;Convert images/pictures to ASCII art online! (HTML/text)&quot; data-og-host=&quot;manytools.org&quot; data-og-source-url=&quot;https://manytools.org/hacker-tools/convert-images-to-ascii-art/&quot; data-og-url=&quot;https://manytools.org/hacker-tools/convert-images-to-ascii-art/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cRGpsn/hyGEjXWJR4/flERTC4lFnAvx58jQlwqKK/img.png?width=437&amp;amp;height=454&amp;amp;face=0_0_437_454&quot;&gt;&lt;a href=&quot;https://manytools.org/hacker-tools/convert-images-to-ascii-art/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://manytools.org/hacker-tools/convert-images-to-ascii-art/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cRGpsn/hyGEjXWJR4/flERTC4lFnAvx58jQlwqKK/img.png?width=437&amp;amp;height=454&amp;amp;face=0_0_437_454');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;ASCII art generator for geeks! - Convert images/pictures to ASCII art online! (HTML/text)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Convert images/pictures to ASCII art online! (HTML/text)&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;manytools.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;이미지를 아스키 아트로 바꿀 수 있는 사이트가 있어서 거기서 몬스터 에너지 로고를 가져다가 만들어서 사용해봤습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알아보기</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/8</guid>
      <comments>https://keepworking.tistory.com/8#entry8comment</comments>
      <pubDate>Sat, 4 Jul 2020 19:24:07 +0900</pubDate>
    </item>
    <item>
      <title>SU, SUDO 약자가 뭐지? su의 숨겨진 비밀 super user, substitute user, 리눅스</title>
      <link>https://keepworking.tistory.com/7</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cz01t/btqFaTHXViP/HZBB2fSJvHPbhOnA1UhlMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cz01t/btqFaTHXViP/HZBB2fSJvHPbhOnA1UhlMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cz01t/btqFaTHXViP/HZBB2fSJvHPbhOnA1UhlMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCz01t%2FbtqFaTHXViP%2FHZBB2fSJvHPbhOnA1UhlMk%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; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카톡방에서 채팅을 하다가 나온 주제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo와 su 리눅스를 하다보면 자주쓰기도 하고 su는 언젠가는 써보게 되는 그런 명령어 들입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3mqpT/btqFafLIjjT/nev3nkXaSgJaRKYj5ftg7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3mqpT/btqFafLIjjT/nev3nkXaSgJaRKYj5ftg7K/img.png&quot; data-alt=&quot;구글에 물어보면?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3mqpT/btqFafLIjjT/nev3nkXaSgJaRKYj5ftg7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3mqpT%2FbtqFafLIjjT%2Fnev3nkXaSgJaRKYj5ftg7K%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; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;그런데 sudo의 어원은 여러곳에서 다 다르게 이야기가 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://endjin.com/blog/2013/07/what-does-sudo-mean&quot;&gt;https://endjin.com/blog/2013/07/what-does-sudo-mean&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1593192968988&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;What does sudo mean? | endjin&quot; data-og-description=&quot;I've always wondered what sudo means when I use it to run a command in a terminal.&quot; data-og-host=&quot;endjin.com&quot; data-og-source-url=&quot;https://endjin.com/blog/2013/07/what-does-sudo-mean&quot; data-og-url=&quot;https://endjin.com/blog/2013/07/what-does-sudo-mean.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://endjin.com/blog/2013/07/what-does-sudo-mean&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://endjin.com/blog/2013/07/what-does-sudo-mean&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What does sudo mean? | endjin&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I've always wondered what sudo means when I use it to run a command in a terminal.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;endjin.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 링크에서는 sudo &amp;lt;- &lt;b&gt;S&lt;/b&gt;uper &lt;b&gt;U&lt;/b&gt;ser &lt;b&gt;DO&lt;/b&gt; 의 약자로 소개가 되었구요,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;S&lt;/b&gt;witch &lt;b&gt;U&lt;/b&gt;ser &lt;b&gt;DO&lt;/b&gt; 로 소개가 된곳도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약자도 얼추 맞는거 같고, 어느게 정말 맞는걸까요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 우선 sudo의 앞의 su는 su와 서로 동일하다고 가정하고 su의 의미를 알아보기로 했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1593194110269&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SU(1)                                               User Commands                                               SU(1)

NAME
       su - run a command with substitute user and group ID

SYNOPSIS
       su [options] [-] [user [argument...]]

DESCRIPTION
       su allows to run commands with a substitute user and group ID.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;man su&lt;/b&gt; 를 입력하면 나오는 내용입니다. 여기서는 &lt;b&gt;s&lt;/b&gt;ubstitute &lt;b&gt;u&lt;/b&gt;ser 라고 되어 있네요 저는 우분투 배포판에서 실행한 명령이기 때문에 혹시 최초 개발된 UNIX에서는 다른 의미가 아닐까 의문이 들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://web.cuzuco.com/~cuzuco/v7/v7vol1.pdf&quot;&gt;http://web.cuzuco.com/~cuzuco/v7/v7vol1.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgPfaG/btqE9vIfTDr/SVfQ6jff2yyCz6ouI1t1Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgPfaG/btqE9vIfTDr/SVfQ6jff2yyCz6ouI1t1Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgPfaG/btqE9vIfTDr/SVfQ6jff2yyCz6ouI1t1Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgPfaG%2FbtqE9vIfTDr%2FSVfQ6jff2yyCz6ouI1t1Q0%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; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVmkR2/btqFbBzOQEa/DyH1GKisWksJYSA23xYk61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVmkR2/btqFbBzOQEa/DyH1GKisWksJYSA23xYk61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVmkR2/btqFbBzOQEa/DyH1GKisWksJYSA23xYk61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVmkR2%2FbtqFbBzOQEa%2FDyH1GKisWksJYSA23xYk61%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; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 pdf파일에서 UNIX시절의 su 의 의미를 찾아 보았을때는 동일하게 substitute user의 약자였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z1huU/btqFblcUgad/gCFDHW4XdA6RSlp9PeK0p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z1huU/btqFblcUgad/gCFDHW4XdA6RSlp9PeK0p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z1huU/btqFblcUgad/gCFDHW4XdA6RSlp9PeK0p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ1huU%2FbtqFblcUgad%2FgCFDHW4XdA6RSlp9PeK0p1%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; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1979년의 UNIX문서에서도 su가 substitute user의 약자 인듯 하네요 이쯤되면 sudo 는 Substitute User DO 의 약자가 맞다고 생각해도 될 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만.....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;너무 섣부른 결론이 었던거 같습니다. 애런 토폰스의 2009년도 글인&amp;nbsp; &quot;The meaning of su&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;I&amp;nbsp;found&amp;nbsp;some&amp;nbsp;old&amp;nbsp;Unix&amp;nbsp;source&amp;nbsp;code,&amp;nbsp;&lt;b&gt;where&amp;nbsp;su.c&amp;nbsp;was&amp;nbsp;available&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FdHMB/btqFbUlCrlK/pmYEL1nXSLliNVNdspVkL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FdHMB/btqFbUlCrlK/pmYEL1nXSLliNVNdspVkL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FdHMB/btqFbUlCrlK/pmYEL1nXSLliNVNdspVkL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFdHMB%2FbtqFbUlCrlK%2FpmYEL1nXSLliNVNdspVkL0%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; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오래된 유닉스의 su.c 소스코드에는 su 에 대한 주석이 한줄 적혀 있는데 su -- become super-user 라는 내용입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, su를 처음 개발 시 데니스 리치와 캔 톰슨은 su를 super user 계정으로 변경하는 기능을 목적으로 한듯합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RfnKi/btqFbBGBiKo/Sgk2iJG7CcgIMSf2bmKM61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RfnKi/btqFbBGBiKo/Sgk2iJG7CcgIMSf2bmKM61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RfnKi/btqFbBGBiKo/Sgk2iJG7CcgIMSf2bmKM61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRfnKi%2FbtqFbBGBiKo%2FSgk2iJG7CcgIMSf2bmKM61%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; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 소스코드에서 setuid의 id 값이 0으로 하드코딩 되어 있는 것도 이때문 이겠지요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 unix의 기능의 개발이 진행이 되면서, su 의 기능은 단순히 super user로의 전환이 아니라, 다양한 유저로의 전환으로 바뀌게 되며 의미를 바꾸게 되었다고 생각합니다.&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;결론은 su 의 최초 개발 시에는 Super User 이었다가, 개발이 진행이 되면서 기능이 확장이 되고 그 의미를 표현하기 위해 Substitute User 로 바뀌게 된것입니다.&lt;/b&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;공식적으로는 Substitute User가 맞을 수도 있지만 원래의 의도를 고려한다면 Super User도 틀린것은 아닙니다.&lt;/b&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;솔직히 저는 Substitute User 보다는 Super User를 지지하고 싶습니다. 서브스티튜트 발음보다는 슈퍼가 더 낫죠...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뜻만 통하면 되죠...&amp;nbsp;&lt;/p&gt;</description>
      <category>알아보기</category>
      <category>linux</category>
      <category>su</category>
      <category>sudo</category>
      <category>UNIX</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/7</guid>
      <comments>https://keepworking.tistory.com/7#entry7comment</comments>
      <pubDate>Sat, 27 Jun 2020 03:38:13 +0900</pubDate>
    </item>
    <item>
      <title>자율주행 연구용 오픈소스 시뮬레이터 CARLA (칼라?)</title>
      <link>https://keepworking.tistory.com/5</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;545&quot; height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eiWnPn/btqDaVIUn3E/vNjd1Mt2v8mkLvJVsTCI50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eiWnPn/btqDaVIUn3E/vNjd1Mt2v8mkLvJVsTCI50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eiWnPn/btqDaVIUn3E/vNjd1Mt2v8mkLvJVsTCI50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeiWnPn%2FbtqDaVIUn3E%2FvNjd1Mt2v8mkLvJVsTCI50%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;545&quot; height=&quot;485&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://carla.org/&quot;&gt;http://carla.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1586094765538&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CARLA&quot; data-og-description=&quot;Open-source simulator for autonomous driving research.&quot; data-og-host=&quot;carla.org&quot; data-og-source-url=&quot;http://carla.org/&quot; data-og-url=&quot;http://carla.org//&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lvGlr/hyFykRiMvq/wAUl6TvqbKWpMeZlf0wh00/img.jpg?width=512&amp;amp;height=384&amp;amp;face=0_0_512_384,https://scrap.kakaocdn.net/dn/qM9Tu/hyFyyPxDmo/lLvKZU3y8W8tYfyDvPCgyk/img.jpg?width=512&amp;amp;height=384&amp;amp;face=0_0_512_384,https://scrap.kakaocdn.net/dn/56RKl/hyFyqDYXHb/nk3cOIW0nCdvz9cGKSxOeK/img.png?width=400&amp;amp;height=200&amp;amp;face=0_0_400_200&quot;&gt;&lt;a href=&quot;http://carla.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://carla.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lvGlr/hyFykRiMvq/wAUl6TvqbKWpMeZlf0wh00/img.jpg?width=512&amp;amp;height=384&amp;amp;face=0_0_512_384,https://scrap.kakaocdn.net/dn/qM9Tu/hyFyyPxDmo/lLvKZU3y8W8tYfyDvPCgyk/img.jpg?width=512&amp;amp;height=384&amp;amp;face=0_0_512_384,https://scrap.kakaocdn.net/dn/56RKl/hyFyqDYXHb/nk3cOIW0nCdvz9cGKSxOeK/img.png?width=400&amp;amp;height=200&amp;amp;face=0_0_400_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;CARLA&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Open-source simulator for autonomous driving research.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;carla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/08Ea8Bm2Dow&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/08Ea8Bm2Dow&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=08Ea8Bm2Dow&amp;amp;feature=youtu.be&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/b6nFFJ/hyFyvFgISp/J9NgvE6GSjeV4xDW61cJbK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/08Ea8Bm2Dow&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3&gt;강조된 기능&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;서버 다중 클라이언트 아키텍처를 통한 확장 성&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 동일하거나 다른 노드의 여러 클라이언트가 다른 행위자를 제어 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유연한 API&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: CARLA는 사용자가 교통 생성, 보행자 행동, 날씨, 센서 등 시뮬레이션과 관련된 모든 측면을 제어 할 수있는 강력한 API를 제공합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자율 주행 센서 제품군&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 사용자는 LIDAR, 다중 카메라, 깊이 센서 및 GPS를 포함한 다양한 센서 제품군을 구성 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;계획 및 제어를위한 빠른 시뮬레이션&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:이 모드는 렌더링을 비활성화하여 그래픽이 필요하지 않은 교통 시뮬레이션 및 도로 동작을 빠르게 실행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지도 생성&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 사용자는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.vectorzero.io/&quot;&gt;RoadRunner&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;와 같은 도구를 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.opendrive.org/&quot;&gt;OpenDrive&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;표준에&lt;span&gt;&amp;nbsp;&lt;/span&gt;따라 자신의지도를 쉽게 만들 수 있습니다&lt;span&gt;&amp;nbsp;&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;교통 시나리오 시뮬레이션&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 당사의 엔진&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/carla-simulator/scenario_runner&quot;&gt;ScenarioRunner를&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;통해 사용자는 모듈 식 동작을 기반으로 다양한 교통 상황을 정의하고 실행할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ROS 통합&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: CARLA는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/carla-simulator/ros-bridge&quot;&gt;ROS 브리지&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.ros.org/&quot;&gt;ROS&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;와 통합되어 제공됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자율 주행 기준&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/carla-simulator/carla-autoware&quot;&gt;AutoWare&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에이전트 및&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/felipecode/coiltraine&quot;&gt;조건부 모방 학습&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;에이전트를&lt;span&gt;&amp;nbsp;&lt;/span&gt;포함하여 CARLA에서 실행 가능한 에이전트로서 자율 주행 기준을 제공&lt;span&gt;&amp;nbsp;&lt;/span&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;센서 같은것도 테스트할 수 있게 제공이 된다고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일단 알아두면 도움이 될것 같네요&lt;/p&gt;</description>
      <category>알아보기</category>
      <category>carla</category>
      <category>연구</category>
      <category>오픈소스</category>
      <category>자율주행</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/5</guid>
      <comments>https://keepworking.tistory.com/5#entry5comment</comments>
      <pubDate>Sun, 5 Apr 2020 22:57:31 +0900</pubDate>
    </item>
    <item>
      <title>SSH 원격 접속 시 비밀번호 없이 간편하게 접속하기 / ssh-keygen / ssh-copy-id / ssh without password</title>
      <link>https://keepworking.tistory.com/4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oHDqV/btqC5pIGvzD/KlXCjCITWhyqsyjL1x9yY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oHDqV/btqC5pIGvzD/KlXCjCITWhyqsyjL1x9yY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oHDqV/btqC5pIGvzD/KlXCjCITWhyqsyjL1x9yY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoHDqV%2FbtqC5pIGvzD%2FKlXCjCITWhyqsyjL1x9yY0%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;1688&quot; height=&quot;1125&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;안녕하세요? 일처리 못하는 놈입니다.&lt;/p&gt;
&lt;p&gt;이번 코로나 바이러스로 사회적 거리두기를 권장하게 되는 요즘, 매일같이 사무실의 가구처럼 철야에 야근만 하는 개발자들도 자택 근무는 피해 갈 수 없습니다.&lt;/p&gt;
&lt;p&gt;원격지에서 사무실의 데스크톱에 ssh로 접속을 해야할 때, 네트워크가 끊기거나 세션이 만료되어서 ssh를 매번 비밀번호를 입력해서 연결하는 것은 생각보다 많은 고충입니다.&lt;/p&gt;
&lt;p&gt;이전에 도 ssh를 비밀번호 없이 연결하는 방법을 찾아보다가 내용이 너무 길어서 하다가 금방 포기했었는데 제가 사용하는 Ubuntu 환경에서는 생각보다 간단하게 사용이 가능한 듯합니다.&lt;/p&gt;
&lt;p&gt;다음과 같이 따라 해 주시면 됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen
# 이것저것 입력하라는 내용이 많이 나오지만 enter 연속으로 눌러주시면 됩니다.
# rsa 키를 저장할 위치를 직접 설정하고 싶다면 설정하여 사용하셔도 괜찮습니다.

ssh-copy-id -p 22 badworker@my.awesomeoffice.com
# 저장한 ssh-key를 원격지 서버에 복사합니다.
# 해당 데스크톱을 원격지에 서버에 등록한다 생각하시면 편합니다.
# 이때 yes/no 로 동의를 구하는 부분에서는 yes로 동의를 구해주시고,
# 마지막으로 연결을 위한 서버 비밀 번호를 입력해 주시면 됩니다.


ssh -p 22 badworker@my.awesomeoffice.com
# 이제 비밀번호 없이 원격 서버에 접근하면 됩니다!&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;윈도우에는 &lt;code&gt;ssh-copy-id&lt;/code&gt; 가 없으니 아래의 명령어를 이용해서 ssh-key를 전달하면 됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type $env:USERPROFILE\.ssh\id_rsa.pub | ssh {IP-ADDRESS-OR-FQDN} &amp;quot;cat &amp;gt;&amp;gt; .ssh/authorized_keys&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;물론 이러한 설정을 공용 PC에서 하시면 안 되겠지요?&lt;/p&gt;
&lt;p&gt;이렇게 단 두 번의 설정만으로 아주 편하게 비밀번호 없이 연결을 할 수 있도록 설정할 수 있습니다.&lt;/p&gt;
&lt;p&gt;혹시나 다른 환경에서는 위와 같은 방식으로 되지 않았다면 덧글로 알려주시면 따로 알아보고 내용을 추가하도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;읽어주셔서 감사하고. 편안한 개발되시기 바랍니다.&lt;/p&gt;</description>
      <category>알아보기</category>
      <category>linux</category>
      <category>ssh</category>
      <category>ssh-copy-id</category>
      <category>ssh-keygen</category>
      <category>개발자</category>
      <category>사회적거리두기</category>
      <category>자택근무</category>
      <category>코로나바이러스</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/4</guid>
      <comments>https://keepworking.tistory.com/4#entry4comment</comments>
      <pubDate>Tue, 31 Mar 2020 01:48:14 +0900</pubDate>
    </item>
    <item>
      <title>PIPEWIRE 프로젝트</title>
      <link>https://keepworking.tistory.com/3</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;bg-eceba9a2.png&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WjoaJ/btqC21utpmx/R5iBe7E4YCJnEQOS6guSrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WjoaJ/btqC21utpmx/R5iBe7E4YCJnEQOS6guSrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WjoaJ/btqC21utpmx/R5iBe7E4YCJnEQOS6guSrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWjoaJ%2FbtqC21utpmx%2FR5iBe7E4YCJnEQOS6guSrk%2Fimg.png&quot; data-filename=&quot;bg-eceba9a2.png&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;904&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;이 글은 pipewire 공식 홈페이지의 내용을 가져와서 파파고와 함께 열심히 번역한 내용입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출처: &amp;lt;&lt;a href=&quot;https://pipewire.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pipewire.org/&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;PIPEWIRE 소개&lt;/h2&gt;
&lt;p&gt;PipeWire는 Linux에서 오디오 및 비디오 처리를 크게 향상하는 것을 목표로 하는 프로젝트입니다. &lt;br /&gt;PulseAudio와 Jack이 현재 처리하는 사용 사례를 지원하는 동시에 비디오 입력 및 출력에 대해 동일한 수준의 강력한 처리를 제공합니다. &lt;br /&gt;또한 Flatpak 애플리케이션을 기본 목표로 지원하면서 컨테이너화 된 애플리케이션의 오디오 및 비디오 장치와 쉽게 상호 작용할 수 있는 보안 모델을 소개합니다. &lt;br /&gt;Wayland 및 Flatpak과 함께 PipeWire는 향후 Linux 응용 프로그램 개발을위한 핵심 빌딩 블록을 제공할 것으로 기대합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;특징은 다음과 같습니다.&lt;/h2&gt;
&lt;p&gt;최소한의 대기 시간으로 오디오 및 비디오를 캡처하고 재생합니다. &lt;br /&gt;오디오 및 비디오에서 실시간 멀티미디어 처리. &lt;br /&gt;애플리케이션이 멀티미디어 컨텐츠를 공유할 수 있는 멀티 프로세스 아키텍처. &lt;br /&gt;현재 애플리케이션에서 쉽게 사용하고 통합 할 수 있는 GStreamer 플러그인. &lt;br /&gt;샌드 박스 응용 프로그램 지원 자세한 내용은 Flatpak을 참조하십시오.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;#flatpak 알아보기&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://flatpak.org/&quot;&gt;https://flatpak.org/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585419859788&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Flatpak&amp;mdash;the future of application distribution&quot; data-og-description=&quot;An independent project Flatpak is developed by an independent community, with no lock-in to a single vendor.&quot; data-og-host=&quot;flatpak.org&quot; data-og-source-url=&quot;https://flatpak.org/&quot; data-og-url=&quot;https://flatpak.org/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://flatpak.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://flatpak.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Flatpak&amp;mdash;the future of application distribution&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;An independent project Flatpak is developed by an independent community, with no lock-in to a single vendor.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;flatpak.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/jDVCITRWGgs&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Flatpak은 Linux에서 데스크탑 응용 프로그램을 구축 및 배포하기 위한 차세대 기술입니다. &lt;br /&gt;Flatpak의 유일한 기술 요구 사항은 데스크탑 통합을 가능하게 하기 위해 응용 프로그램이 소수의 Freedesktop 표준을 준수해야 한다는 것입니다 (요구 사항 및 규칙 참조).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;설정&lt;/h2&gt;
&lt;p&gt;PipeWire는 Meson 빌드 시스템을 사용하고 있으며 PipeWire 구축은 매우 간단합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1585419463569&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./autogen.sh --prefix=$PREFIX
make
make install&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;$PREFIX&lt;/b&gt;는 일반적으로 /usr 또는 /usr/local로 설정됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행&lt;/h2&gt;
&lt;p&gt;다음을 사용하여 소스 디렉토리에서 PipeWire 서버를 테스트할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1585419557517&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;make run&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span&gt;소스&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;디렉토리에서&lt;/span&gt;&lt;span&gt; SDL&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;/span&gt;&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;span&gt;표시를&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;/span&gt;&lt;span&gt; 시도하십시오j.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1585419582586&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SPA_PLUGIN_DIR=build/spa/plugins PIPEWIRE_MODULE_DIR=build  build/src/examples/export-sink&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다른 예제들과 함께 실행할 수도 있습니다. 위와 같이 올바른 환경 변수를 설정하는 것을 잊지 마십시오. 그렇지 않으면 플러그인과 모듈을 찾을 수 없습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문서&lt;/h2&gt;
&lt;p&gt;유용한 페이지 모음은 PipeWire 위키에서 찾을 수 있습니다. &lt;br /&gt;&lt;a href=&quot;https://github.com/PipeWire/pipewire/wiki&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/PipeWire/pipewire/wiki&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585419770444&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;PipeWire/pipewire&quot; data-og-description=&quot;Mirror of the PipeWire repository (see https://gitlab.freedesktop.org/pipewire/pipewire/) - PipeWire/pipewire&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/PipeWire/pipewire/wiki&quot; data-og-url=&quot;https://github.com/PipeWire/pipewire&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cNQigG/hyFrZNONZm/Jh6VkqKs2s8HRXFD1kQ2EK/img.png?width=152&amp;amp;height=152&amp;amp;face=0_0_152_152&quot;&gt;&lt;a href=&quot;https://github.com/PipeWire/pipewire/wiki&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/PipeWire/pipewire/wiki&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cNQigG/hyFrZNONZm/Jh6VkqKs2s8HRXFD1kQ2EK/img.png?width=152&amp;amp;height=152&amp;amp;face=0_0_152_152');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;PipeWire/pipewire&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Mirror of the PipeWire repository (see https://gitlab.freedesktop.org/pipewire/pipewire/) - PipeWire/pipewire&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;개발자는 PipeWire API 설명서를 확인할 수 있습니다.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://gitlab.freedesktop.org/pipewire/pipewire/&quot;&gt;https://gitlab.freedesktop.org/pipewire/pipewire/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585419759617&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;PipeWire / pipewire&quot; data-og-description=&quot;Multimedia processing graphs&quot; data-og-host=&quot;gitlab.freedesktop.org&quot; data-og-source-url=&quot;https://gitlab.freedesktop.org/pipewire/pipewire/&quot; data-og-url=&quot;https://gitlab.freedesktop.org/pipewire/pipewire&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mIiXy/hyFr9JFBUS/HHvfsZWL0nQimxVkQxmJTk/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128,https://scrap.kakaocdn.net/dn/degyaF/hyFr9JFB8b/Jkx34lZlzOoxYWoivasJdK/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128&quot;&gt;&lt;a href=&quot;https://gitlab.freedesktop.org/pipewire/pipewire/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gitlab.freedesktop.org/pipewire/pipewire/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mIiXy/hyFr9JFBUS/HHvfsZWL0nQimxVkQxmJTk/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128,https://scrap.kakaocdn.net/dn/degyaF/hyFr9JFB8b/Jkx34lZlzOoxYWoivasJdK/img.png?width=128&amp;amp;height=128&amp;amp;face=0_0_128_128');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;PipeWire / pipewire&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Multimedia processing graphs&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;gitlab.freedesktop.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;*지금은 문서를 보려고 해도 뭔가 없는 거 같네요 나중에 찾게 된다면 덧글을 추가하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참여하기&lt;/h2&gt;
&lt;p&gt;PipeWire는 자유 소프트웨어이며 공개적으로 개발되었습니다. Wim Taymans, Red Hat의 수석 엔지니어이자 GStreamer multimedia 프레임 워크 공동 작성자가 작성했습니다. 코드는 GitHub에서 찾을 수 있습니다. &lt;br /&gt;&lt;br /&gt;Freenode의 #pipewire에서 IRC에 참여하십시오. &lt;br /&gt;&lt;a href=&quot;https://freenode.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://freenode.net/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585419731089&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;freenode&quot; data-og-description=&quot;During the Easter weekend (April 12th to 15th) we will be purging the freenode services database. We periodically prune the database to remove expired accounts, nicknames and channels. Just like previous database purges we will be removing any accounts and&quot; data-og-host=&quot;freenode.net&quot; data-og-source-url=&quot;https://freenode.net/&quot; data-og-url=&quot;https://freenode.net/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://freenode.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://freenode.net/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;freenode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;During the Easter weekend (April 12th to 15th) we will be purging the freenode services database. We periodically prune the database to remove expired accounts, nicknames and channels. Just like previous database purges we will be removing any accounts and&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;freenode.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문제는 GitHub 문제에서 추적됩니다.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/PipeWire/pipewire/issues&quot;&gt;https://github.com/PipeWire/pipewire/issues&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585419744094&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;PipeWire/pipewire&quot; data-og-description=&quot;Mirror of the PipeWire repository (see https://gitlab.freedesktop.org/pipewire/pipewire/) - PipeWire/pipewire&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/PipeWire/pipewire/issues&quot; data-og-url=&quot;https://github.com/PipeWire/pipewire&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vfDuX/hyFsbnaxLj/YGLJWaQCZu8H8pWBlg90t1/img.png?width=152&amp;amp;height=152&amp;amp;face=0_0_152_152&quot;&gt;&lt;a href=&quot;https://github.com/PipeWire/pipewire/issues&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/PipeWire/pipewire/issues&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vfDuX/hyFsbnaxLj/YGLJWaQCZu8H8pWBlg90t1/img.png?width=152&amp;amp;height=152&amp;amp;face=0_0_152_152');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;PipeWire/pipewire&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Mirror of the PipeWire repository (see https://gitlab.freedesktop.org/pipewire/pipewire/) - PipeWire/pipewire&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알아보기</category>
      <category>리눅스 멀티미디어</category>
      <category>파이프 와이어</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/3</guid>
      <comments>https://keepworking.tistory.com/3#entry3comment</comments>
      <pubDate>Sun, 29 Mar 2020 03:29:47 +0900</pubDate>
    </item>
    <item>
      <title>바코드에 대해서 알아봅니다. CODE 128</title>
      <link>https://keepworking.tistory.com/2</link>
      <description>&lt;p&gt;비교적&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;있었습니다. &lt;br /&gt;&lt;br /&gt;​당연히&amp;nbsp;웹으로&amp;nbsp;개발&amp;nbsp;안&amp;nbsp;하고,&amp;nbsp;Qt/Qml&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;jsbarcode&amp;nbsp;라이브러리를&amp;nbsp;가져다&amp;nbsp;쓰면&amp;nbsp;쉬웠으니까요 &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/lindell/JsBarcode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/lindell/JsBarcode&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;근데&amp;nbsp;막상&amp;nbsp;qml&amp;nbsp;전용&amp;nbsp;컴포넌트도&amp;nbsp;없고&amp;nbsp;qml&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;싶었습니다. &lt;br /&gt;&lt;br /&gt;전&amp;nbsp;직장에서&amp;nbsp;바코드를&amp;nbsp;다루어본&amp;nbsp;경험이&amp;nbsp;있으니&amp;nbsp;(아예&amp;nbsp;업무에&amp;nbsp;도입하려고&amp;nbsp;허튼짓도&amp;nbsp;했었습니다.)&amp;nbsp;어떤&amp;nbsp;걸&amp;nbsp;알아볼지&amp;nbsp;명확했습니다. &lt;br /&gt;code&amp;nbsp;128이라는&amp;nbsp;인코딩&amp;nbsp;형식(?)&amp;nbsp;이&amp;nbsp;비교적&amp;nbsp;많이&amp;nbsp;쓰이고&amp;nbsp;있어서&amp;nbsp;이걸&amp;nbsp;제가&amp;nbsp;개발하는&amp;nbsp;파트에&amp;nbsp;적용하려고&amp;nbsp;관련해서&amp;nbsp;자료를&amp;nbsp;찾아보았습니다. &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Code_128&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/Code_128&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;영문&amp;nbsp;위키피디아지만&amp;nbsp;열심히&amp;nbsp;구글&amp;nbsp;번역기로&amp;nbsp;읽었습니다.&amp;nbsp;항상&amp;nbsp;느끼는&amp;nbsp;거지만&amp;nbsp;영어는&amp;nbsp;중요합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;#&amp;nbsp;바코드&amp;nbsp;리더&amp;nbsp;원리&amp;nbsp;알아보기&lt;/h2&gt;
&lt;p&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;넘어가&amp;nbsp;보겠습니다. &lt;br /&gt;&lt;br /&gt;적절한&amp;nbsp;사진을&amp;nbsp;올리고&amp;nbsp;싶은데&amp;nbsp;구하는&amp;nbsp;게&amp;nbsp;쉽지가&amp;nbsp;않네요 &lt;br /&gt;&lt;br /&gt;그래도&amp;nbsp;머릿속에&amp;nbsp;딱하고&amp;nbsp;떠오르는&amp;nbsp;(一)&amp;nbsp;자형&amp;nbsp;레이저는&amp;nbsp;기억할&amp;nbsp;것입니다.&amp;nbsp;요즘&amp;nbsp;것은&amp;nbsp;정말로&amp;nbsp;1자형&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;middot;&amp;nbsp;)&amp;nbsp;형입니다.&amp;nbsp;그걸&amp;nbsp;거울에&amp;nbsp;반사시키고&amp;nbsp;그&amp;nbsp;거울을&amp;nbsp;조금씩&amp;nbsp;비틀어&amp;nbsp;흔들어&amp;nbsp;주면&amp;nbsp;저희&amp;nbsp;눈에는&amp;nbsp;(一)처럼&amp;nbsp;보이게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;기계의&amp;nbsp;입장에서는의&amp;nbsp;점의&amp;nbsp;이동이&amp;nbsp;시간에&amp;nbsp;따라&amp;nbsp;순차적으로&amp;nbsp;변하는&amp;nbsp;것을&amp;nbsp;감지하게&amp;nbsp;되는데&amp;nbsp;이때&amp;nbsp;검은색&amp;nbsp;부분에는&amp;nbsp;반사량이&amp;nbsp;적고,&amp;nbsp;흰색은&amp;nbsp;반사량이&amp;nbsp;많아&amp;nbsp;수광부에&amp;nbsp;바코드의&amp;nbsp;데이터가&amp;nbsp;순차적으로&amp;nbsp;읽히게&amp;nbsp;됩니다.&amp;nbsp;어두운 색이&amp;nbsp;길게&amp;nbsp;흰색은&amp;nbsp;짧게&amp;nbsp;등을&amp;nbsp;순서대로&amp;nbsp;읽어 들일&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;것이지요. &lt;br /&gt;&lt;br /&gt;물론&amp;nbsp;요즘은&amp;nbsp;선형&amp;nbsp;이미지&amp;nbsp;센서나&amp;nbsp;아예&amp;nbsp;카메라를&amp;nbsp;달고&amp;nbsp;영상처리로&amp;nbsp;읽습니다. &lt;br /&gt;&lt;br /&gt;그리고&amp;nbsp;결국에는&amp;nbsp;바코드는&amp;nbsp;하나의&amp;nbsp;통으로&amp;nbsp;된&amp;nbsp;이미지라기보다는&amp;nbsp;순차적으로&amp;nbsp;전달되는&amp;nbsp;시리얼&amp;nbsp;한&amp;nbsp;데이터라고&amp;nbsp;생각해&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;#&amp;nbsp;CODE&amp;nbsp;128&amp;nbsp;바코드&amp;nbsp;구조&amp;nbsp;알아보기&lt;/h2&gt;
&lt;p&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;제외하고) &lt;br /&gt;그리고&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;구조를&amp;nbsp;가지고&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;[스타트&amp;nbsp;코드]&amp;nbsp;+&amp;nbsp;[본문]&amp;nbsp;+&amp;nbsp;[체크&amp;nbsp;섬]&amp;nbsp;+&amp;nbsp;[엔드&amp;nbsp;코드] &lt;br /&gt;&lt;br /&gt;물론&amp;nbsp;실제로&amp;nbsp;더&amp;nbsp;긴&amp;nbsp;문자나&amp;nbsp;복잡한&amp;nbsp;글자를&amp;nbsp;표현하기&amp;nbsp;위해서&amp;nbsp;더&amp;nbsp;복잡한&amp;nbsp;구조를&amp;nbsp;사용하기도&amp;nbsp;하는데&amp;nbsp;여기서&amp;nbsp;알아보지는&amp;nbsp;않을&amp;nbsp;겁니다. &lt;br /&gt;&lt;br /&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;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bstIne/btqCZ0Xx4aH/Fk45KsSkL5BEsJp1RI2RZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bstIne/btqCZ0Xx4aH/Fk45KsSkL5BEsJp1RI2RZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bstIne/btqCZ0Xx4aH/Fk45KsSkL5BEsJp1RI2RZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbstIne%2FbtqCZ0Xx4aH%2FFk45KsSkL5BEsJp1RI2RZk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;br /&gt;&lt;br /&gt;위키피디아에&amp;nbsp;나와있는&amp;nbsp;구조로&amp;nbsp;바코드&amp;nbsp;위에&amp;nbsp;영역별로&amp;nbsp;표시한&amp;nbsp;구간이&amp;nbsp;방금&amp;nbsp;말했던&amp;nbsp;구조에&amp;nbsp;해당합니다. &lt;br /&gt;(1)에&amp;nbsp;해당하는&amp;nbsp;부분은&amp;nbsp;공백&amp;nbsp;영역으로&amp;nbsp;과자&amp;nbsp;봉투처럼&amp;nbsp;항상&amp;nbsp;표시할&amp;nbsp;곳이&amp;nbsp;모두&amp;nbsp;하얗지&amp;nbsp;않기&amp;nbsp;때문에&amp;nbsp;바코드를&amp;nbsp;표시하기&amp;nbsp;위해&amp;nbsp;필요한&amp;nbsp;최소한의&amp;nbsp;여백이라고&amp;nbsp;생각할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;(2)는&amp;nbsp;스타트&amp;nbsp;코드이고&amp;nbsp;(3가지&amp;nbsp;종류의&amp;nbsp;스타트&amp;nbsp;코드가&amp;nbsp;있습니다.) &lt;br /&gt;(3)에&amp;nbsp;해당하는&amp;nbsp;구간은&amp;nbsp;저희가&amp;nbsp;표시하고자&amp;nbsp;하는&amp;nbsp;본문입니다.&amp;nbsp;&amp;nbsp;Wikipedia&amp;nbsp;출처답게&amp;nbsp;Wikipedia라고&amp;nbsp;출처가&amp;nbsp;잘&amp;nbsp;적혀있네요. &lt;br /&gt;(4)는&amp;nbsp;바코드&amp;nbsp;스캐너가&amp;nbsp;실수로&amp;nbsp;잘못&amp;nbsp;읽었거나&amp;nbsp;하지&amp;nbsp;않도록&amp;nbsp;오차를&amp;nbsp;확인하는&amp;nbsp;코드입니다.&amp;nbsp;마지막&amp;nbsp;(5)는&amp;nbsp;바코드의&amp;nbsp;끝을&amp;nbsp;알리는&amp;nbsp;코드입니다.&amp;nbsp;다른&amp;nbsp;막대&amp;nbsp;묶음과&amp;nbsp;다르게&amp;nbsp;이&amp;nbsp;친구만&amp;nbsp;홀수&amp;nbsp;개의&amp;nbsp;막대를&amp;nbsp;가지고&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctuNwj/btqCZZ5szgl/iOEmlw6Ai9rcSJcYq1HoK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctuNwj/btqCZZ5szgl/iOEmlw6Ai9rcSJcYq1HoK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctuNwj/btqCZZ5szgl/iOEmlw6Ai9rcSJcYq1HoK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctuNwj%2FbtqCZZ5szgl%2FiOEmlw6Ai9rcSJcYq1HoK0%2Fimg.png&quot; data-filename=&quot;image.png&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;806&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;br /&gt;&lt;br /&gt;각각의&amp;nbsp;ascii&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;좋습니다. &lt;br /&gt;예를&amp;nbsp;들자면&amp;nbsp;'0'[문자]&amp;nbsp;-&amp;gt;&amp;nbsp;48[아스키&amp;nbsp;값]&amp;nbsp;-&amp;gt;&amp;nbsp;16 [CODE128 값]&amp;nbsp;-&amp;gt;&amp;nbsp;10011101100&amp;nbsp;(검&amp;nbsp;1&amp;nbsp;흰&amp;nbsp;2검&amp;nbsp;3&amp;nbsp;흰&amp;nbsp;1검&amp;nbsp;2&amp;nbsp;흰&amp;nbsp;2)[바코드] &lt;br /&gt;위와&amp;nbsp;같은&amp;nbsp;순서로&amp;nbsp;변환이&amp;nbsp;되는&amp;nbsp;겁니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVcx8I/btqC3qt0tQW/VZmM5TDn0RtasXrDyXWSm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVcx8I/btqC3qt0tQW/VZmM5TDn0RtasXrDyXWSm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVcx8I/btqC3qt0tQW/VZmM5TDn0RtasXrDyXWSm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVcx8I%2FbtqC3qt0tQW%2FVZmM5TDn0RtasXrDyXWSm0%2Fimg.png&quot; data-filename=&quot;image (1).png&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;238&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;br /&gt;&lt;br /&gt;위에&amp;nbsp;있던&amp;nbsp;구조를&amp;nbsp;지키기&amp;nbsp;위해서는&amp;nbsp;위의&amp;nbsp;Start&amp;nbsp;Code&amp;nbsp;도&amp;nbsp;필요합니다. &lt;br /&gt;어느&amp;nbsp;스타트&amp;nbsp;코드를&amp;nbsp;쓰냐에&amp;nbsp;따라&amp;nbsp;CODE&amp;nbsp;128&amp;nbsp;A,&amp;nbsp;CODE&amp;nbsp;128&amp;nbsp;B,&amp;nbsp;CODE&amp;nbsp;128&amp;nbsp;C&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;1100011101011&amp;nbsp; &lt;br /&gt;마지막으로&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;HELLO라는&amp;nbsp;글자를&amp;nbsp;표시하고&amp;nbsp;싶다면 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tihqX/btqC4uCIFrT/C885qR28vQBj9jhWnLpZkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tihqX/btqC4uCIFrT/C885qR28vQBj9jhWnLpZkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tihqX/btqC4uCIFrT/C885qR28vQBj9jhWnLpZkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtihqX%2FbtqC4uCIFrT%2FC885qR28vQBj9jhWnLpZkk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.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;br /&gt;위와&amp;nbsp;같은&amp;nbsp;이&amp;nbsp;계산이&amp;nbsp;됩니다.&amp;nbsp; &lt;br /&gt;즉,&amp;nbsp;(STARTCODE&amp;nbsp;+&amp;nbsp;(글자&amp;nbsp;*&amp;nbsp;자릿수))&amp;nbsp;%&amp;nbsp;103을&amp;nbsp;계산한&amp;nbsp;값이&amp;nbsp;CHECK&amp;nbsp;SUM&amp;nbsp;값이&amp;nbsp;됩니다. &lt;br /&gt;그렇게&amp;nbsp;해서&amp;nbsp;나온&amp;nbsp;결과&amp;nbsp;값으로&amp;nbsp;검은색&amp;nbsp;네모&amp;nbsp;2칸&amp;nbsp;흰색&amp;nbsp;네모&amp;nbsp;1칸&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;올리지를&amp;nbsp;못하네요&amp;nbsp; &lt;br /&gt;아무튼&amp;nbsp;만들고&amp;nbsp;나서&amp;nbsp;나름&amp;nbsp;뿌듯해하면서&amp;nbsp;퇴근했습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>원리가 뭐지</category>
      <category>barcode</category>
      <category>CODE128</category>
      <author>일처리</author>
      <guid isPermaLink="true">https://keepworking.tistory.com/2</guid>
      <comments>https://keepworking.tistory.com/2#entry2comment</comments>
      <pubDate>Sun, 29 Mar 2020 02:39:52 +0900</pubDate>
    </item>
  </channel>
</rss>