<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>팽이돌리기</title>
    <link>https://gre-eny.tistory.com/</link>
    <description>휙 -- 휙</description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 04:29:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>팡우송</managingEditor>
    <image>
      <title>팽이돌리기</title>
      <url>https://tistory1.daumcdn.net/tistory/4207080/attach/63a4255587ca4024aab19faeb9ff8d2d</url>
      <link>https://gre-eny.tistory.com</link>
    </image>
    <item>
      <title>[Jenkins on Docker] 계정 재생성 (계정 정보 확인, 비밀번호 변경)</title>
      <link>https://gre-eny.tistory.com/352</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인은 &lt;code&gt;AWS&lt;/code&gt;의 &lt;code&gt;Amazon Linux2&lt;/code&gt; &lt;code&gt;EC2&lt;/code&gt; 서버에 &lt;code&gt;Docker&lt;/code&gt;를 실행시키고 &lt;code&gt;Jenkins&lt;/code&gt; 컨테이너를 올려서 사용하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 문제는 Jenkins 로그인을 할 때 아이디 비밀번호를 잊어버린 것이 시작이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Docker 컨테이너에 접속하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;EC2&lt;/code&gt; 에 접속하여 터미널 창에 아래 명령어를 이용하여 Docker Container에 접속할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;# 실행 중인 docker container 확인
$ docker ps

# 특정 container에 접속
$ docker exec -it [컨테이너ID or 컨테이너Name] /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;config.xml 수정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;/var/jenkins_home/&lt;/b&gt; 을 확인해보면 &lt;code&gt;config.xml&lt;/code&gt; 파일이 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/128864589-50b65bd9-479b-459c-ad05-27cffad675b3.PNG&quot; alt=&quot;docker-jenkins-계정재생성-0&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;vim&lt;/code&gt;명령어를 활용하여 아래 &lt;code&gt;&amp;lt;useSecurity&amp;gt;true&amp;lt;/useSecurity&lt;/code&gt; 부분을 &lt;code&gt;false&lt;/code&gt;로 변경해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 로그인 부분을 없앤다는 뜻이다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;$ vim config.xml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/128864594-869c1758-c4ef-4bfa-9145-00a2ce701b15.PNG&quot; alt=&quot;docker-jenkins-계정재생성-1&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정하고 난 뒤, 컨테이너를 재시작하고 브라우저로 재접속을 해보면, 로그인 창 없이 바로 Jenkins 대시보드가 보일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;# 특정 컨테이너 재시작
$ docker restart [컨테이너ID or 컨테이너Name]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/128864595-518423be-f523-4c3a-9f18-bd49a81555a3.PNG&quot; alt=&quot;docker-jenkins-계정재생성-2&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;code&gt;vi: command not found&lt;/code&gt; 와 같은 오류가 발생한다면 아래 포스팅을 참고하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gre-eny.tistory.com/349&quot;&gt;https://gre-eny.tistory.com/349&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1628597740674&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;[Docker] Docker Container 위에서 vi command not found&quot; data-og-description=&quot;본인은 AWS EC2 의 Amazon Linux 2 에 Docker 위에 Jenkins 컨테이너를 띄우고 있다. 문제 Jenkins 비밀번호를 까먹어서 config.xml 파일을 수정할 일이 생겼는데, vi 를 사용하니 아래와 같은 에러가 발생했다...&quot; data-og-host=&quot;gre-eny.tistory.com&quot; data-og-source-url=&quot;https://gre-eny.tistory.com/349&quot; data-og-url=&quot;https://gre-eny.tistory.com/349&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/p6p1I/hyLbcuCpRr/DM3srI7gW9GgsMbsR535uK/img.png?width=620&amp;amp;height=184&amp;amp;face=0_0_620_184,https://scrap.kakaocdn.net/dn/cw6woI/hyLa8ThB7W/hCdpNPSkdWrv9dgUPTUvVk/img.png?width=620&amp;amp;height=184&amp;amp;face=0_0_620_184,https://scrap.kakaocdn.net/dn/bG6eTX/hyLcoAcYZj/dkJivJXkjkSk2QLyttefw0/img.png?width=845&amp;amp;height=659&amp;amp;face=0_0_845_659&quot;&gt;&lt;a href=&quot;https://gre-eny.tistory.com/349&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gre-eny.tistory.com/349&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/p6p1I/hyLbcuCpRr/DM3srI7gW9GgsMbsR535uK/img.png?width=620&amp;amp;height=184&amp;amp;face=0_0_620_184,https://scrap.kakaocdn.net/dn/cw6woI/hyLa8ThB7W/hCdpNPSkdWrv9dgUPTUvVk/img.png?width=620&amp;amp;height=184&amp;amp;face=0_0_620_184,https://scrap.kakaocdn.net/dn/bG6eTX/hyLcoAcYZj/dkJivJXkjkSk2QLyttefw0/img.png?width=845&amp;amp;height=659&amp;amp;face=0_0_845_659');&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;[Docker] Docker Container 위에서 vi command not found&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;본인은 AWS EC2 의 Amazon Linux 2 에 Docker 위에 Jenkins 컨테이너를 띄우고 있다. 문제 Jenkins 비밀번호를 까먹어서 config.xml 파일을 수정할 일이 생겼는데, vi 를 사용하니 아래와 같은 에러가 발생했다...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gre-eny.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;h2 data-ke-size=&quot;size26&quot;&gt;Jenkins 계정 정보 확인하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 메뉴에 &lt;code&gt;Jenkins 관리&lt;/code&gt; - &lt;code&gt;Security&lt;/code&gt; - &lt;code&gt;Manage Users&lt;/code&gt; 를 보면 생성된 계정 정보들을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 계정명을 잊어버렸다면 이 방법으로 유저ID를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/128864597-766978d9-73f0-42cc-a0f0-cee94a6d3f87.PNG&quot; alt=&quot;docker-jenkins-계정재생성-3&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;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;다른 계정 생성&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Jenkins security 설정 수정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 계정의 ID를 지정하고, 직접 권한을 부여하는 방식으로 진행할 것이다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/128864599-1b6c30e0-33a6-475c-b212-2ff3f5977cb2.PNG&quot; alt=&quot;docker-jenkins-계정재생성-4&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진처럼 &lt;code&gt;Security Realm&lt;/code&gt;에 &lt;code&gt;Jenkins' own user database&lt;/code&gt;와 &lt;code&gt;사용자의 가입 허용&lt;/code&gt;을 체크한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;Authoriation&lt;/code&gt;에 &lt;code&gt;Matrix-based security&lt;/code&gt;를 선택하고, &lt;code&gt;Add user or group&lt;/code&gt;을 선택하여 &lt;code&gt;새로 만들 계정의 ID&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;save&lt;/code&gt;를 하고, 브라우저로 Jenkins에 재접속을 하면 아래와 같은 화면을 볼 수 있을 것이다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/128864600-e9f1f2e4-6cba-48f3-9862-874a1006d603.PNG&quot; alt=&quot;docker-jenkins-계정재생성-5&quot; /&gt;&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;새 계정 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;계정 생성&lt;/code&gt;을 클릭하여 앞선 과정에서 추가했던 &lt;code&gt;유저ID&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;config.xml&lt;/code&gt;의 &lt;code&gt;&amp;lt;useSecurity&amp;gt;&lt;/code&gt; 부분은 위 과정을 수행하면서 다시 &lt;code&gt;true&lt;/code&gt;로 변경되어, 별도로 수정하지 않아도 앞으로도 로그인 과정을 스킵하지 않는다.&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;마무리&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 data-ke-size=&quot;size16&quot;&gt;이 포스팅에서는 간단히 유저ID 확인과 새로 ID를 생성하여 권한을 부여하는 방식 두가지만 다루었다.&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;Refer to&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@sdanerib/getting-started-with-jenkins-docker-part-iii-reset-jenkins-admin-password-when-you-have-a-ff81ffa6774f&quot;&gt;https://medium.com/@sdanerib/getting-started-with-jenkins-docker-part-iii-reset-jenkins-admin-password-when-you-have-a-ff81ffa6774f&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1628597768105&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;Getting started with Jenkins &amp;amp; Docker: Part III: Reset Jenkins Admin Password (when you have a&amp;hellip;&quot; data-og-description=&quot;If you forgot the password you set to your admin user in Jenkins, then it&amp;rsquo;s probable you find out is possible to changing it by modifying&amp;hellip;&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@sdanerib/getting-started-with-jenkins-docker-part-iii-reset-jenkins-admin-password-when-you-have-a-ff81ffa6774f&quot; data-og-url=&quot;https://medium.com/@sdanerib/getting-started-with-jenkins-docker-part-iii-reset-jenkins-admin-password-when-you-have-a-ff81ffa6774f&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bwQND9/hyLcs3GhB7/kFHzvMkn4lkWDx8WSyGPc1/img.png?width=1200&amp;amp;height=824&amp;amp;face=0_0_1200_824,https://scrap.kakaocdn.net/dn/dvSUZv/hyLcyW7e4d/HyF1ecZtM9YpUJ9VEM0Qk0/img.png?width=60&amp;amp;height=41&amp;amp;face=0_0_60_41&quot;&gt;&lt;a href=&quot;https://medium.com/@sdanerib/getting-started-with-jenkins-docker-part-iii-reset-jenkins-admin-password-when-you-have-a-ff81ffa6774f&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@sdanerib/getting-started-with-jenkins-docker-part-iii-reset-jenkins-admin-password-when-you-have-a-ff81ffa6774f&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bwQND9/hyLcs3GhB7/kFHzvMkn4lkWDx8WSyGPc1/img.png?width=1200&amp;amp;height=824&amp;amp;face=0_0_1200_824,https://scrap.kakaocdn.net/dn/dvSUZv/hyLcyW7e4d/HyF1ecZtM9YpUJ9VEM0Qk0/img.png?width=60&amp;amp;height=41&amp;amp;face=0_0_60_41');&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;Getting started with Jenkins &amp;amp; Docker: Part III: Reset Jenkins Admin Password (when you have a&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;If you forgot the password you set to your admin user in Jenkins, then it&amp;rsquo;s probable you find out is possible to changing it by modifying&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Cloud/AWS</category>
      <category>AWS</category>
      <category>docker</category>
      <category>jenkins</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/352</guid>
      <comments>https://gre-eny.tistory.com/352#entry352comment</comments>
      <pubDate>Tue, 10 Aug 2021 21:14:37 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 프로그래머스 (거리두기 확인하기) Level 2</title>
      <link>https://gre-eny.tistory.com/351</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Problem : &lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/81302&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/81302&lt;/a&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1628520299912&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;코딩테스트 연습 - 거리두기 확인하기&quot; data-og-description=&quot;[[&amp;quot;POOOP&amp;quot;, &amp;quot;OXXOX&amp;quot;, &amp;quot;OPXPX&amp;quot;, &amp;quot;OOXOX&amp;quot;, &amp;quot;POXXP&amp;quot;], [&amp;quot;POOPX&amp;quot;, &amp;quot;OXPXP&amp;quot;, &amp;quot;PXXXO&amp;quot;, &amp;quot;OXXXO&amp;quot;, &amp;quot;OOOPP&amp;quot;], [&amp;quot;PXOPX&amp;quot;, &amp;quot;OXOXP&amp;quot;, &amp;quot;OXPOX&amp;quot;, &amp;quot;OXXOP&amp;quot;, &amp;quot;PXPOX&amp;quot;], [&amp;quot;OOOXX&amp;quot;, &amp;quot;XOOOX&amp;quot;, &amp;quot;OOOXX&amp;quot;, &amp;quot;OXOOX&amp;quot;, &amp;quot;OOOOO&amp;quot;], [&amp;quot;PXPXP&amp;quot;, &amp;quot;XPXPX&amp;quot;, &amp;quot;PXPXP&amp;quot;, &amp;quot;XPXPX&amp;quot;, &amp;quot;PXPXP&amp;quot;]] [1, 0, 1, 1, 1]&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/81302&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/81302&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Jgion/hyLbfc7ZYl/TdfVneZp6xWsr622bOXDOk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/048uP/hyLbbV7pBR/FnViNHc2O5ijjpunzsZDhk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/bUoOcw/hyLaZuCkmw/Z8JT09ce27y9H7F37dnae0/img.png?width=242&amp;amp;height=242&amp;amp;face=0_0_242_242&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/81302&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/81302&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Jgion/hyLbfc7ZYl/TdfVneZp6xWsr622bOXDOk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/048uP/hyLbbV7pBR/FnViNHc2O5ijjpunzsZDhk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/bUoOcw/hyLaZuCkmw/Z8JT09ce27y9H7F37dnae0/img.png?width=242&amp;amp;height=242&amp;amp;face=0_0_242_242');&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;코딩테스트 연습 - 거리두기 확인하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[[&quot;POOOP&quot;, &quot;OXXOX&quot;, &quot;OPXPX&quot;, &quot;OOXOX&quot;, &quot;POXXP&quot;], [&quot;POOPX&quot;, &quot;OXPXP&quot;, &quot;PXXXO&quot;, &quot;OXXXO&quot;, &quot;OOOPP&quot;], [&quot;PXOPX&quot;, &quot;OXOXP&quot;, &quot;OXPOX&quot;, &quot;OXXOP&quot;, &quot;PXPOX&quot;], [&quot;OOOXX&quot;, &quot;XOOOX&quot;, &quot;OOOXX&quot;, &quot;OXOOX&quot;, &quot;OOOOO&quot;], [&quot;PXPXP&quot;, &quot;XPXPX&quot;, &quot;PXPXP&quot;, &quot;XPXPX&quot;, &quot;PXPXP&quot;]] [1, 0, 1, 1, 1]&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Approach&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Greedy 한 BFS 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2021 카카오 채용연계형 인턴십 문제이다.&lt;/p&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;문제에서 언급하는 &lt;code&gt;맨해튼 거리&lt;/code&gt;는 자기 자신 기준 거리가 &lt;code&gt;2&lt;/code&gt;인 &lt;code&gt;마름모&lt;/code&gt; 꼴만 검사하면 된다. 나머지 부분은 볼 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;code&gt;P&lt;/code&gt;인 부분들을 기준으로 &lt;code&gt;거리가 2인 마름모&lt;/code&gt; 꼴을 검사하여, 그 범위 안에 또다른 &lt;code&gt;P&lt;/code&gt;가 존재하는지 찾으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인은 (i, j) 기준 상하좌우 점을 모두 검사하여 &lt;code&gt;P&lt;/code&gt;일 경우 그대로 flag 를 true로 만들면서 종료하였고, &lt;code&gt;O(빈 테이블)&lt;/code&gt;일 경우 Queue에 추가하여 한번더 상하좌우 점을 검사하였다.&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;Code&lt;/h2&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.ArrayDeque;
import java.util.Queue;

public class CheckDistancing {
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static String[][] places;
    static char[][] map;
    static boolean flag;

    public int[] solution(String[][] places) {
        int[] ans = new int[5];
        map = new char[5][5];
        for (int i = 0; i &amp;lt; places.length; i++) {
            for (int j = 0; j &amp;lt; 5; j++) {
                map[j] = places[i][j].toCharArray();
            }

            flag = false;

            for (int j = 0; j &amp;lt; 5; j++) {
                for (int k = 0; k &amp;lt; 5; k++) {
                    if (!flag &amp;amp;&amp;amp; map[j][k] == 'P') {
                        bfs(j, k);
                    }
                }
            }
            ans[i] = flag ? 0 : 1;
        }
        return ans;
    }

    static void bfs(int sx, int sy) {
        Queue&amp;lt;Point&amp;gt; q = new ArrayDeque&amp;lt;&amp;gt;();

        for (int i = 0; i &amp;lt; 4; i++) {
            int nx = sx + dx[i];
            int ny = sy + dy[i];

            if (inRange(nx, ny)) {
                if (map[nx][ny] == 'P') {
                    flag = true;
                    return;
                }

                if (map[nx][ny] != 'X') {
                    q.offer(new Point(nx, ny));
                }
            }
        }

        while (!q.isEmpty()) {
            Point p = q.poll();
            for (int i = 0; i &amp;lt; 4; i++) {
                int nx = p.x + dx[i];
                int ny = p.y + dy[i];

                if (nx == sx &amp;amp;&amp;amp; ny == sy) {
                    continue;
                }

                if (inRange(nx, ny)) {
                    if (map[nx][ny] == 'P') {
                        flag = true;
                        break;
                    }
                }
            }
        }
    }

    static boolean inRange(int x, int y) {
        if (x &amp;gt;= 0 &amp;amp;&amp;amp; x &amp;lt; 5 &amp;amp;&amp;amp; y &amp;gt;= 0 &amp;amp;&amp;amp; y &amp;lt; 5) {
            return true;
        }
        return false;
    }

    static class Point{
        int x, y;

        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    @Test
    void test() {
        Assertions.assertArrayEquals(new int[]{1, 0, 1, 1, 1}
                , solution(new String[][]{{&quot;POOOP&quot;, &quot;OXXOX&quot;, &quot;OPXPX&quot;, &quot;OOXOX&quot;, &quot;POXXP&quot;}
                        , {&quot;POOPX&quot;, &quot;OXPXP&quot;, &quot;PXXXO&quot;, &quot;OXXXO&quot;, &quot;OOOPP&quot;}
                        , {&quot;PXOPX&quot;, &quot;OXOXP&quot;, &quot;OXPOX&quot;, &quot;OXXOP&quot;, &quot;PXPOX&quot;}
                        , {&quot;OOOXX&quot;, &quot;XOOOX&quot;, &quot;OOOXX&quot;, &quot;OXOOX&quot;, &quot;OOOOO&quot;}
                        , {&quot;PXPXP&quot;, &quot;XPXPX&quot;, &quot;PXPXP&quot;, &quot;XPXPX&quot;, &quot;PXPXP&quot;}}));
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Programmers</category>
      <category>BFS</category>
      <category>programmers</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/351</guid>
      <comments>https://gre-eny.tistory.com/351#entry351comment</comments>
      <pubDate>Mon, 9 Aug 2021 23:44:52 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 프로그래머스 (게임 맵 최단거리) Level 2</title>
      <link>https://gre-eny.tistory.com/350</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Problem : &lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/1844&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/1844&lt;/a&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1628520250515&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;코딩테스트 연습 - 게임 맵 최단거리&quot; data-og-description=&quot;[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/1844&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/1844&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jtSNm/hyLa1sqFmO/8FCkhjtXaykZu5ef2uESRk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/dDhZbQ/hyLbbaJ9bN/2KW9XxnogZm2faA2hN0FIK/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/1844&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/1844&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jtSNm/hyLa1sqFmO/8FCkhjtXaykZu5ef2uESRk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/dDhZbQ/hyLbbaJ9bN/2KW9XxnogZm2faA2hN0FIK/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&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;코딩테스트 연습 - 게임 맵 최단거리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Approach&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 기본적인 BFS 문제이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;BFS&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Code&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.ArrayDeque;
import java.util.Queue;

public class GameMapShortestDistance {
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static int row, col;

    public int solution(int[][] maps) {
        row = maps.length;
        col = maps[0].length;
        return bfs(maps);
    }

    static int bfs(int[][] maps) {
        Queue&amp;lt;Point&amp;gt; q = new ArrayDeque&amp;lt;&amp;gt;();
        boolean[][] visited = new boolean[row][col];

        visited[0][0] = true;
        q.offer(new Point(0, 0, 1));

        while (!q.isEmpty()) {
            Point cur = q.poll();

            if (cur.x == row - 1 &amp;amp;&amp;amp; cur.y == col - 1) {
                return cur.cnt;
            }

            for (int i = 0; i &amp;lt; 4; i++) {
                int nx = cur.x + dx[i];
                int ny = cur.y + dy[i];

                if (inRange(nx, ny) &amp;amp;&amp;amp; maps[nx][ny] == 1 &amp;amp;&amp;amp; !visited[nx][ny]) {
                    q.offer(new Point(nx, ny, cur.cnt + 1));
                    visited[nx][ny] = true;
                }
            }
        }

        return -1;
    }

    static boolean inRange(int x, int y) {
        return x &amp;gt;= 0 &amp;amp;&amp;amp; x &amp;lt; row &amp;amp;&amp;amp; y &amp;gt;= 0 &amp;amp;&amp;amp; y &amp;lt; col;
    }

    static class Point{
        int x, y, cnt;

        Point(int x, int y, int cnt) {
            this.x = x;
            this.y = y;
            this.cnt = cnt;
        }
    }

    @Test
    void test() {
        Assertions.assertEquals(11, solution(new int[][]{{1, 0, 1, 1, 1}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 1}, {1, 1, 1, 0, 1}, {0, 0, 0, 0, 1}}));
        Assertions.assertEquals(-1, solution(new int[][]{{1, 0, 1, 1, 1}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 1}, {1, 1, 1, 0, 0}, {0, 0, 0, 0, 1}}));
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Programmers</category>
      <category>BFS</category>
      <category>programmers</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/350</guid>
      <comments>https://gre-eny.tistory.com/350#entry350comment</comments>
      <pubDate>Mon, 9 Aug 2021 23:43:56 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] Docker Container 위에서 vi command not found</title>
      <link>https://gre-eny.tistory.com/349</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인은 &lt;code&gt;AWS EC2&lt;/code&gt; 의 &lt;code&gt;Amazon Linux 2&lt;/code&gt; 에 &lt;code&gt;Docker&lt;/code&gt; 위에 &lt;code&gt;Jenkins&lt;/code&gt; 컨테이너를 띄우고 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jenkins 비밀번호를 까먹어서 &lt;code&gt;config.xml&lt;/code&gt; 파일을 수정할 일이 생겼는데, &lt;code&gt;vi&lt;/code&gt;를 사용하니 아래와 같은 에러가 발생했다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/128721203-3ea4a7bd-f55c-4403-ae23-930979032322.PNG&quot; alt=&quot;docker_vi_command_not_found_0&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 Docker에 국한된 문제는 아니지만, 없으면 설치하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/128721212-af5b2e6b-4f4b-41a6-be8b-fe097665960d.PNG&quot; alt=&quot;docker_vi_command_not_found_1&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Debian 계열의 리눅스라면 &lt;code&gt;apt-get&lt;/code&gt;을 사용하여 &lt;code&gt;vim&lt;/code&gt;을 설치하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 사용하여 먼저 &lt;code&gt;apt-get&lt;/code&gt; 을 최신 버전으로 업데이트 한 뒤에 vim을 깔자.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;$ sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ sudo apt-get install vim&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://oingdaddy.tistory.com/92&quot;&gt;https://oingdaddy.tistory.com/92&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1628518767171&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;Docker 에서 &amp;quot;vi : command not found&amp;quot; 오류 해결&quot; data-og-description=&quot;꼭 docker에 국한된건 아니고 vim 이 설치가 되지 않은 OS에서 설치하고 실행하는 방법을 가이드한다. 뭐 이런 오류가 난다. 이유는 간단하다. vim 이 설치되지 않았기 때문이다. 설치하면 된다. 설치&quot; data-og-host=&quot;oingdaddy.tistory.com&quot; data-og-source-url=&quot;https://oingdaddy.tistory.com/92&quot; data-og-url=&quot;https://oingdaddy.tistory.com/92&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/czya55/hyLbapkj4j/NNhudatCumm3jgGkpBbdjk/img.png?width=236&amp;amp;height=32&amp;amp;face=0_0_236_32,https://scrap.kakaocdn.net/dn/Bdmpm/hyLa4WYcgc/GakxKdiYh72MKq0MklLdk0/img.png?width=236&amp;amp;height=32&amp;amp;face=0_0_236_32,https://scrap.kakaocdn.net/dn/bq3MTH/hyLa9jDYVd/2tINrAWtHnuwkNc4RWEza1/img.png?width=710&amp;amp;height=301&amp;amp;face=0_0_710_301&quot;&gt;&lt;a href=&quot;https://oingdaddy.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://oingdaddy.tistory.com/92&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/czya55/hyLbapkj4j/NNhudatCumm3jgGkpBbdjk/img.png?width=236&amp;amp;height=32&amp;amp;face=0_0_236_32,https://scrap.kakaocdn.net/dn/Bdmpm/hyLa4WYcgc/GakxKdiYh72MKq0MklLdk0/img.png?width=236&amp;amp;height=32&amp;amp;face=0_0_236_32,https://scrap.kakaocdn.net/dn/bq3MTH/hyLa9jDYVd/2tINrAWtHnuwkNc4RWEza1/img.png?width=710&amp;amp;height=301&amp;amp;face=0_0_710_301');&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;Docker 에서 &quot;vi : command not found&quot; 오류 해결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;꼭 docker에 국한된건 아니고 vim 이 설치가 되지 않은 OS에서 설치하고 실행하는 방법을 가이드한다. 뭐 이런 오류가 난다. 이유는 간단하다. vim 이 설치되지 않았기 때문이다. 설치하면 된다. 설치&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;oingdaddy.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;</description>
      <category>TroubleShooting</category>
      <category>container</category>
      <category>docker</category>
      <category>vim</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/349</guid>
      <comments>https://gre-eny.tistory.com/349#entry349comment</comments>
      <pubDate>Mon, 9 Aug 2021 23:18:23 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 프로그래머스 (다단계 칫솔 판매) Dev-Matching 3</title>
      <link>https://gre-eny.tistory.com/348</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Problem : &lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/77486&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/77486&lt;/a&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1627714871461&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;코딩테스트 연습 - 다단계 칫솔 판매&quot; data-og-description=&quot;민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후, &quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77486&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77486&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/r5vf7/hyK3KScyfX/L59gG2n4xUL8Y7kEow9Th1/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/ciEkRZ/hyK3MvIA8l/EyVwg5LsKdkUxOhb4Q1Po0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/dV7cr6/hyK4PEmmVf/1ka3Uit3XCFDPNPT7AECUk/img.png?width=1414&amp;amp;height=783&amp;amp;face=0_0_1414_783&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/77486&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77486&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/r5vf7/hyK3KScyfX/L59gG2n4xUL8Y7kEow9Th1/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/ciEkRZ/hyK3MvIA8l/EyVwg5LsKdkUxOhb4Q1Po0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/dV7cr6/hyK4PEmmVf/1ka3Uit3XCFDPNPT7AECUk/img.png?width=1414&amp;amp;height=783&amp;amp;face=0_0_1414_783');&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;코딩테스트 연습 - 다단계 칫솔 판매&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Approach&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;트리&lt;/code&gt; 를 구성할 수 있는지, &lt;code&gt;특정 노드를 시작으로 부모 노드들을 순회할 수 있는지&lt;/code&gt;가 핵심인 문제이다.&lt;/p&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;문제 풀이의 주요 로직은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;트리&lt;/code&gt;를 구성하는 전처리 과정이 필요하다.&lt;br /&gt;이 과정에서 트리를 구성함은 물론, 현재 노드 &lt;code&gt;i&lt;/code&gt;에 대하여 부모 노드가 무엇인지도 저장해주어야 한다.&lt;/li&gt;
&lt;li&gt;각 &lt;code&gt;seller&lt;/code&gt;에 대하여 반복문을 돌린다.&lt;br /&gt;이 과정에서 &lt;code&gt;amount&lt;/code&gt;를 참조하여 &lt;code&gt;판매수익&lt;/code&gt;을 계산하고, 본인을 포함하여 추천인들에게 수익을 분배한다.&lt;/li&gt;
&lt;/ul&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;Code&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.HashMap;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;

public class MultiStepToothbrushSales {
    static HashMap&amp;lt;String, Integer&amp;gt; map;
    static int[] parent, res;
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        init(enroll, referral);
        res = new int[enroll.length];

        for (int i = 0; i &amp;lt; seller.length; i++) {
            calculateSell(seller[i], amount[i] * 100);
        }

        return res;
    }

    // 판매이익 배분
    static void calculateSell(String seller, int amount) {
        int sellerIdx = map.get(seller);

        while (sellerIdx != -1) {
            int tenPercent = amount / 10;
            if (tenPercent &amp;lt; 1) {
                res[sellerIdx] += amount;
                break;
            } else {
                res[sellerIdx] += (amount - tenPercent);
                amount = tenPercent;
                sellerIdx = parent[sellerIdx];
            }
        }
    }

    // 구조도 초기화
    static void init(String[] enroll, String[] referral) {
        map = new HashMap&amp;lt;&amp;gt;();
        int idx = 0;
        parent = new int[enroll.length];
        Arrays.fill(parent, -1);

        // &amp;lt;판매자, 번호&amp;gt; 인덱싱
        for (int i = 0; i &amp;lt; enroll.length; i++) {
            map.put(enroll[i], idx++);
        }

        // 판매자 i를 추천해준 사람을 저장
        for (int i = 0; i &amp;lt; referral.length; i++) {
            if (referral[i].equals(&quot;-&quot;)) {
                continue;
            }
            parent[i] = map.get(referral[i]);
        }
    }

    @Test
    void test() {
        assertArrayEquals(new int[]{360, 958, 108, 0, 450, 18, 180, 1080},
                solution(new String[]{&quot;john&quot;, &quot;mary&quot;, &quot;edward&quot;, &quot;sam&quot;, &quot;emily&quot;, &quot;jaimie&quot;, &quot;tod&quot;, &quot;young&quot;}
                        , new String[]{&quot;-&quot;, &quot;-&quot;, &quot;mary&quot;, &quot;edward&quot;, &quot;mary&quot;, &quot;mary&quot;, &quot;jaimie&quot;, &quot;edward&quot;}
                        , new String[]{&quot;young&quot;, &quot;john&quot;, &quot;tod&quot;, &quot;emily&quot;, &quot;mary&quot;}
                        , new int[]{12, 4, 2, 5, 10}));
        assertArrayEquals(new int[]{0, 110, 378, 180, 270, 450, 0, 0},
                solution(new String[]{&quot;john&quot;, &quot;mary&quot;, &quot;edward&quot;, &quot;sam&quot;, &quot;emily&quot;, &quot;jaimie&quot;, &quot;tod&quot;, &quot;young&quot;}
                        , new String[]{&quot;-&quot;, &quot;-&quot;, &quot;mary&quot;, &quot;edward&quot;, &quot;mary&quot;, &quot;mary&quot;, &quot;jaimie&quot;, &quot;edward&quot;}
                        , new String[]{&quot;sam&quot;, &quot;emily&quot;, &quot;jaimie&quot;, &quot;edward&quot;}
                        , new int[]{2, 3, 5, 4}));
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Programmers</category>
      <category>Dev-Matching</category>
      <category>programmers</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/348</guid>
      <comments>https://gre-eny.tistory.com/348#entry348comment</comments>
      <pubDate>Sat, 31 Jul 2021 16:01:00 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 프로그래머스 (행렬 테두리 회전하기) Dev-Matching 2</title>
      <link>https://gre-eny.tistory.com/347</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Problem : &lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/77485&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/77485&lt;/a&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1627714796734&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;코딩테스트 연습 - 행렬 테두리 회전하기&quot; data-og-description=&quot;6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77485&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77485&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ORfW9/hyK3QdNI13/kLx9X7gOzk1bWokElNLkM1/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/NBIid/hyK4Iys0Gk/w3dKOzpReokV4eyYF8FdvK/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/xmbqV/hyK3QSoOGh/EufgJw4SViUOeEimxI207k/img.png?width=672&amp;amp;height=680&amp;amp;face=0_0_672_680&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/77485&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77485&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ORfW9/hyK3QdNI13/kLx9X7gOzk1bWokElNLkM1/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/NBIid/hyK4Iys0Gk/w3dKOzpReokV4eyYF8FdvK/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/xmbqV/hyK3QSoOGh/EufgJw4SViUOeEimxI207k/img.png?width=672&amp;amp;height=680&amp;amp;face=0_0_672_680');&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;코딩테스트 연습 - 행렬 테두리 회전하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Approach&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;행렬의 특정 부분을 회전시킴과 동시에, 그 영역에 있는 최솟값을 찾는 문제이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;행렬 회전&lt;/code&gt;을 구현할 수 있어야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;좌상단&lt;/code&gt;과 &lt;code&gt;우하단&lt;/code&gt;의 위치를 찾고, 그 영역의 &lt;code&gt;테두리&lt;/code&gt; 부분을 &lt;code&gt;시계방향 90도&lt;/code&gt; 회전 시킨다.&lt;/li&gt;
&lt;li&gt;회전시킴과 동시에 그 테두리 영역에서의 최솟값을 찾는다.&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;h2 data-ke-size=&quot;size26&quot;&gt;Code&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;

public class MatrixEdgeRotate {
    static int[][] arr;
    public int[] solution(int rows, int columns, int[][] queries) {
        arr = new int[rows][columns];
        for (int i = 0; i &amp;lt; rows; i++) {
            for (int j = 0; j &amp;lt; columns; j++) {
                arr[i][j] = columns * i + j + 1;
            }
        }

        int[] ans = new int[queries.length];
        for (int i = 0; i &amp;lt; queries.length; i++) {
            ans[i] = rotate(queries[i][0], queries[i][1], queries[i][2], queries[i][3]);
        }

        return ans;
    }

    static int rotate(int r1, int c1, int r2, int c2) {
        r1--;
        c1--;
        r2--;
        c2--;

        int tmp = arr[r1][c1];
        int min = tmp;

        // 왼쪽 변 아래-&amp;gt;위
        for (int i = r1; i &amp;lt; r2; i++) {
            arr[i][c1] = arr[i + 1][c1];
            min = Math.min(min, arr[i][c1]);
        }
        // 아랫변 오른-&amp;gt;왼
        for (int i = c1; i &amp;lt; c2; i++) {
            arr[r2][i] = arr[r2][i + 1];
            min = Math.min(min, arr[r2][i]);

        }
        // 오른변 위-&amp;gt;아래
        for (int i = r2; i &amp;gt; r1; i--) {
            arr[i][c2] = arr[i - 1][c2];
            min = Math.min(min, arr[i][c2]);

        }
        // 윗변 왼-&amp;gt;오른
        for (int i = c2; i &amp;gt; c1; i--) {
            arr[r1][i] = arr[r1][i - 1];
            min = Math.min(min, arr[r1][i]);
        }
        arr[r1][c1 + 1] = tmp;

        return min;
    }

    @Test
    void test() {
        assertArrayEquals(new int[]{8, 10, 25}, solution(6, 6, new int[][]{{2, 2, 5, 4}, {3, 3, 6, 6}, {5, 1, 6, 3}}));
        assertArrayEquals(new int[]{1, 1, 5, 3}, solution(3, 3, new int[][]{{1, 1, 2, 2}, {1, 2, 2, 3}, {2, 1, 3, 2}, {2, 2, 3, 3}}));
        assertArrayEquals(new int[]{1}, solution(100, 97, new int[][]{{1, 1, 100, 97}}));
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Programmers</category>
      <category>Dev-Matching</category>
      <category>programmers</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/347</guid>
      <comments>https://gre-eny.tistory.com/347#entry347comment</comments>
      <pubDate>Sat, 31 Jul 2021 15:59:46 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 프로그래머스 (로또의 최고 순위와 최저 순위) Dev-Matching 1</title>
      <link>https://gre-eny.tistory.com/346</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Problem : &lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/77484&lt;/a&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1627714745180&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;코딩테스트 연습 - 로또의 최고 순위와 최저 순위&quot; data-og-description=&quot;로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fiwOl/hyK3RcAXgn/n5FJzHTpmB581UafHiMJqk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/bXapjU/hyK4RWkAwX/Lmr6th0YIrciu9o7kGWbrK/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fiwOl/hyK3RcAXgn/n5FJzHTpmB581UafHiMJqk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/bXapjU/hyK4RWkAwX/Lmr6th0YIrciu9o7kGWbrK/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&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;코딩테스트 연습 - 로또의 최고 순위와 최저 순위&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Approach&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 주어진 입력에서 &lt;code&gt;0&lt;/code&gt;의 개수를 센다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;최고 순위&lt;/code&gt;는 &lt;code&gt;0&lt;/code&gt;이 모두 당첨번호와 같다는 것을 가정하여 계산하고, &lt;code&gt;최저 순위&lt;/code&gt;는 &lt;code&gt;0&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Code&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;

public class HighestAndLowestRankingInLotto {
    public int[] solution(int[] lottos, int[] win_nums) {
        int same = 0;
        int zero = 0;
        for (int i = 0; i &amp;lt; 6; i++) {
            if (lottos[i] == 0) {
                zero++;
                continue;
            }

            for (int j = 0; j &amp;lt; 6; j++) {
                if (lottos[i] == win_nums[j]) {
                    same++;
                    break;
                }
            }
        }

        int highRating = same + zero &amp;gt;= 2 ? 7 - (same + zero) : 6;
        int lowRating = same &amp;gt;= 2 ? 7 - same : 6;
        return new int[]{highRating, lowRating};
    }

    @Test
    void test() {
        assertArrayEquals(new int[]{3, 5}, solution(new int[]{44, 1, 0, 0, 31, 25}, new int[]{31, 10, 45, 1, 6, 19}));
        assertArrayEquals(new int[]{1, 6}, solution(new int[]{0, 0, 0, 0, 0, 0}, new int[]{38, 19, 20, 40, 15, 25}));
        assertArrayEquals(new int[]{1, 1}, solution(new int[]{45, 4, 35, 20, 3, 9}, new int[]{20, 9, 3, 45, 4, 35}));
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Programmers</category>
      <category>Dev-Matching</category>
      <category>programmers</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/346</guid>
      <comments>https://gre-eny.tistory.com/346#entry346comment</comments>
      <pubDate>Sat, 31 Jul 2021 15:58:47 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] EC2의 Docker 위에 Jenkins Container 올리기</title>
      <link>https://gre-eny.tistory.com/345</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;AWS EC2 Instance (Amazon Linux2) 에서 Docker로 Jenkins 이미지를 다운받아서 Container로 띄우는 것이 목표이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ec2 인스턴스가 있다고 가정하고, Java나 Docker나 모두 설치되어 있다고 가정을 하고 시작한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;EC2 Instance 접속하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 &lt;code&gt;Jenkins&lt;/code&gt;를 설치할 ec2 instance 에 접속한다. (putty, mobaXterm, vscode remote-ssh 등을 이용하여)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;Docker&lt;/code&gt;를 실행하고, 간단한 설정을 진행한다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;# Docker 실행
$ sudo systemctl start docker&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;code&gt;루트 사용자&lt;/code&gt;가 아닌 &lt;code&gt;일반 사용자&lt;/code&gt;가 docker 명령어를 사용하려고 하면, &lt;code&gt;Permission Denied&lt;/code&gt; 에러를 뱉는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;code&gt;sudo&lt;/code&gt;의 번거로움을 덜기 위하여 아래와 같이 &lt;code&gt;Docker group&lt;/code&gt;에 &lt;code&gt;현재 사용자 이름&lt;/code&gt;을 등록한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 현재 사용자 이름 확인
$ echo $USER

# docker group에 사용자 추가
$ sudo usermod -aG docker $USER

# docker 재실행
$ sudo service docker restart&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Jenkins image 다운로드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;도커 이미지명&lt;/code&gt; 같은 경우 보통 &lt;code&gt;[image name]:[image tag]&lt;/code&gt; 식의 네이밍 규칙을 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;컨테이너&lt;/code&gt;로 올릴 이미지가 로컬에 존재하지 않는다면, &lt;code&gt;Docker Hub&lt;/code&gt;에서 서치하여 &lt;code&gt;pull&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;a href=&quot;https://hub.docker.com/_/jenkins?tab=description&amp;amp;page=1&amp;amp;ordering=last_updated&quot;&gt;https://hub.docker.com/_/jenkins?tab=description&amp;amp;page=1&amp;amp;ordering=last_updated&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627124282599&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;Jenkins - Official Image | Docker Hub&quot; data-og-description=&quot;Get more out of Docker with a free Docker ID Sign up for a Docker ID to gain access to all the free features Docker has to offer, including unlimited public repositories, increased container image requests, automated builds, and much more. Sign Up ✕&quot; data-og-host=&quot;hub.docker.com&quot; data-og-source-url=&quot;https://hub.docker.com/_/jenkins?tab=description&amp;amp;page=1&amp;amp;ordering=last_updated&quot; data-og-url=&quot;https://hub.docker.com/_/jenkins?tab=description&amp;amp;page=1&amp;amp;ordering=last_updated&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://hub.docker.com/_/jenkins?tab=description&amp;amp;page=1&amp;amp;ordering=last_updated&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hub.docker.com/_/jenkins?tab=description&amp;amp;page=1&amp;amp;ordering=last_updated&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;Jenkins - Official Image | Docker Hub&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Get more out of Docker with a free Docker ID Sign up for a Docker ID to gain access to all the free features Docker has to offer, including unlimited public repositories, increased container image requests, automated builds, and much more. Sign Up ✕&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hub.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사이트를 참고하여 jenkins의 도커이미지 이름을 알 수 있다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;# jenkins image download
$ docker pull jenkins/jenkins:lts

# 로컬에 존재하는 docker images 확인
$ docker images
# 출력 예시
REPOSITORY        TAG         IMAGE ID       CREATED       SIZE
jenkins/jenkins   lts         22bfa28ae34c   3 weeks ago   572MB &lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Docker image를 Container로 띄우기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어를 통하여 다운로드 받은 image를 container로 띄울 수 있다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# docker 컨테이너로 등록 후 실행
$ docker run -d -p 9090:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:lts&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt;: detached mode 이다. &lt;code&gt;백그라운드&lt;/code&gt;로 실행할 수 있게 해준다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt;: host(앞)와 container(뒤)의 포트를 연결해준다.(port forwarding) -&amp;gt; &lt;code&gt;로컬Port:컨테이너Port&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v&lt;/code&gt;: host(앞)와 container(뒤)의 디렉토리를 연결해준다.(mount) -&amp;gt; &lt;code&gt;로컬Directory:컨테이너Directory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-u&lt;/code&gt;: 실행할 사용자 이름을 지정한다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--name&lt;/code&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 class=&quot;angelscript&quot;&gt;&lt;code&gt;# 실행되고 있는 컨테이너 목록
$ docker ps

# 실행되고 있지 않는 컨테이너도 포함한 목록
$ docker ps -a

# 출력 예시
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                               NAMES
6b493370af1f   jenkins/jenkins:lts   &quot;/sbin/tini -- /usr/&amp;hellip;&quot;   13 seconds ago   Up 12 seconds   50000/tcp, 0.0.0.0:9090-&amp;gt;8080/tcp   jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우, 로컬(ec2 인스턴스)의 &lt;code&gt;9090&lt;/code&gt;포트로 들어오는 요청들을 도커 컨테이너(jenkins)의 &lt;code&gt;8080&lt;/code&gt;포트로 &lt;code&gt;포트포워딩&lt;/code&gt; 시켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 ec2 인스턴스의 &lt;code&gt;보안 그룹&lt;/code&gt;의 &lt;code&gt;인바운드 정책&lt;/code&gt;을 수정할 필요가 있다.&lt;br /&gt;(&lt;code&gt;9090&lt;/code&gt;포트로 들어오는 요청을 허용해야한다. 이 부분은 여기서 다루진 않겠다.)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Jenkins 접속하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ec2 인스턴스의 &lt;code&gt;퍼블릭 IPv4 주소:9090&lt;/code&gt; 혹은 &lt;code&gt;퍼블릭 IPv4 DNS:9090&lt;/code&gt;로 접속이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의할 점은 당연한 얘기지만 ec2 환경에서 &lt;code&gt;8080&lt;/code&gt; 포트를 사용하고 있지 않아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;8080&lt;/code&gt;포트를 이미 사용하고 있어도 지금까지 위에서 진행된 내용들은 정상적으로 진행이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;code&gt;9090&lt;/code&gt;포트로 접속하려고 시도하면 &lt;code&gt;8080&lt;/code&gt;포트로 포트포워딩이 정상적으로 진행되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;netstat -ntlp | grep :80&lt;/code&gt; 명령어를 활용하여 &lt;code&gt;8080&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;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126866296-4ff3f4a2-20dc-49bd-a537-d263eab191ac.PNG&quot; alt=&quot;docker+jenkins-1&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 요구하는 패스워드는 &lt;code&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;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;# docker의 jenkins 컨테이너로 접속하여 /var/jenkins_home/secrets/initialAdminPassword 읽기
$ docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;docker exec&lt;/code&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;code&gt;도커 컨테이너 내부로 접속&lt;/code&gt;하고 싶다면 다음 명령어를 사용하면 된다.&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ docker exec -it [컨테이너 ID 혹은 컨테이너 Name] /bin/bash&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;exit&lt;/code&gt;을 활용해 접속을 종료하고 외부로 빠져나올 수 있다.&lt;/li&gt;
&lt;li&gt;도커 컨테이너 내부에서 &lt;code&gt;cat /var/jenkins_home/secrets/initialAdminPassword&lt;/code&gt;을 활용하여 패스워드를 알아낼 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126866298-6beb5719-4afd-48cf-a592-dbf06df6c850.PNG&quot; alt=&quot;docker+jenkins-2&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진 처럼&lt;code&gt;Install suggested plugins&lt;/code&gt;를 선택하여 플러그인을 설치하고 나면 아래 사진과 같이 &lt;code&gt;Admin&lt;/code&gt; 계정을 만드는 화면을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126866299-4b10e1e9-8070-4f2b-873e-30144c53479b.PNG&quot; alt=&quot;docker+jenkins-3&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Admin&lt;/code&gt; 계정을 만들고 나면 &lt;code&gt;Instance Configuration&lt;/code&gt;이 나올텐데 &lt;code&gt;Jenkins URL&lt;/code&gt;이 ec2 인스턴스의 &lt;code&gt;퍼블릭 IPv4 DNS:port number&lt;/code&gt;와 동일한지 확인 한 뒤 &lt;code&gt;Save and Finish&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;아래 사진처럼 Jenkins에 접속했다면 성공한 것이다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126866301-26bcf19b-daf3-4a70-aa9a-13a6847b3732.PNG&quot; alt=&quot;docker+jenkins-4&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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 ps -a&lt;/code&gt; 명령어로 보유하고 있는 &lt;code&gt;도커 컨테이너 목록&lt;/code&gt;을 확인할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고: &lt;code&gt;docker images&lt;/code&gt;로는 보유하고 있는 &lt;code&gt;도커 이미지 목록&lt;/code&gt;을 확인할 수 있다.&lt;/li&gt;
&lt;/ul&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;pre class=&quot;sql&quot;&gt;&lt;code&gt;$ docker start [컨테이너ID or 컨테이너Name]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;컨테이너 중지하기&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;$ docker stop [컨테이너ID or 컨테이너Name]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;컨테이너 삭제하기&lt;/h4&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;$ docker rm [컨테이너ID or 컨테이너Name]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Refer to&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html&quot;&gt;https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1627124332200&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;초보를 위한 도커 안내서 - 설치하고 컨테이너 실행하기&quot; data-og-description=&quot;초보를 위한 도커 안내서 2번째 글입니다. 도커의 기본적인 내용을 이야기 했던 첫번째 글에 이어 실제로 도커를 설치하고 컨테이너를 실행하면서 도커 명령어를 알아봅니다. 도커를 처음 접하&quot; data-og-host=&quot;subicura.com&quot; data-og-source-url=&quot;https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html&quot; data-og-url=&quot;https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d79lSG/hyKZ7d8n1w/bsnbOIu9agNcFxVdtyrsLk/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/c4Uo7A/hyKZezcb1S/bxUpR1huawNVdN6dHxrKd1/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/IiCRN/hyKZdUAGfX/KHVxEH6lpKjvKa8IbBvq4K/img.png?width=2452&amp;amp;height=1694&amp;amp;face=0_0_2452_1694&quot;&gt;&lt;a href=&quot;https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d79lSG/hyKZ7d8n1w/bsnbOIu9agNcFxVdtyrsLk/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/c4Uo7A/hyKZezcb1S/bxUpR1huawNVdN6dHxrKd1/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/IiCRN/hyKZdUAGfX/KHVxEH6lpKjvKa8IbBvq4K/img.png?width=2452&amp;amp;height=1694&amp;amp;face=0_0_2452_1694');&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;초보를 위한 도커 안내서 - 설치하고 컨테이너 실행하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;초보를 위한 도커 안내서 2번째 글입니다. 도커의 기본적인 내용을 이야기 했던 첫번째 글에 이어 실제로 도커를 설치하고 컨테이너를 실행하면서 도커 명령어를 알아봅니다. 도커를 처음 접하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;subicura.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;</description>
      <category>Cloud/AWS</category>
      <category>AWS</category>
      <category>docker</category>
      <category>EC2</category>
      <category>jenkins</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/345</guid>
      <comments>https://gre-eny.tistory.com/345#entry345comment</comments>
      <pubDate>Sat, 24 Jul 2021 19:57:06 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] VSCode에서 AWS EC2 instance 원격 접속하기(Remote)</title>
      <link>https://gre-eny.tistory.com/344</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Windows 환경의&lt;/span&gt; VSCode에서 AWS EC2에 원격접속을 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 포스팅은 &lt;code&gt;EC2&lt;/code&gt;와 접속에 필요한 &lt;code&gt;.pem&lt;/code&gt;키는 이미 있다고 가정하고 진행한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;vscode extension: Remote Development 설치하기&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;X&lt;/code&gt; 단축키로 &lt;code&gt;MarketPlace&lt;/code&gt;를 열어 &lt;code&gt;Remote Development&lt;/code&gt;를 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126439051-458723b3-0d91-48b9-8da2-0b297c09b491.PNG&quot; alt=&quot;ec2 원격 접속하기-1&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SSH 연결 config 파일 수정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;F1&lt;/code&gt; 키를 눌러 &lt;code&gt;ssh open&lt;/code&gt;을 검색하여 나오는 &lt;code&gt;Remote-SSH: Open SSH Configuration File...&lt;/code&gt;을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126439053-01587648-e996-4d66-a64a-b01af114cc57.PNG&quot; alt=&quot;ec2 원격 접속하기-2&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;code&gt;사용자이름/.ssh/&lt;/code&gt; 이므로 &lt;code&gt;config&lt;/code&gt; 파일이 없다면 그냥 새로 만들면 된다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126439056-fdd0c98a-046b-4e35-b2b9-97b9603ad027.png&quot; alt=&quot;ec2 원격 접속하기-4&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;aws console&lt;/code&gt;에서 연결할 &lt;code&gt;ec2 instance&lt;/code&gt;를 찾아 &lt;code&gt;우클릭&lt;/code&gt; 후 &lt;code&gt;연결&lt;/code&gt; 을 눌러 다음과 같이 &lt;code&gt;SSH 클라이언트&lt;/code&gt; 정보를 참고하여 &lt;code&gt;config&lt;/code&gt;를 구성하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126439054-1e392488-65b5-469e-981d-085d4680d710.PNG&quot; alt=&quot;ec2 원격 접속하기-3&quot; /&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Host ami2_jenkins_ec2
  HostName [퍼블릭 IPv4 DNS 주소]
  User ec2-user
  IdentityFile ~/.ssh/ami2-jenkins.pem&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;Host&lt;/code&gt;: 연결할 ec2의 별칭(별명)이므로 아무렇게나 지어도 상관없다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HostName&lt;/code&gt;: ec2의 &lt;code&gt;퍼블릭 IPv4 DNS 주소&lt;/code&gt;이다. 위 사진에서는 &lt;code&gt;노란색 박스&lt;/code&gt; 부분이다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;User&lt;/code&gt;: 접속할 사용자 이름이다. 위 사진에서는 빨간색 부분이다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IdentityFile&lt;/code&gt;: ec2에 접속할 때 필요한 &lt;code&gt;.pem&lt;/code&gt;키의 위치를 지정한다. 본인은 &lt;code&gt;config&lt;/code&gt; 파일과 같은 폴더 내에 위치한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;원격 접속하기(Remote)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;F1&lt;/code&gt;을 눌러 &lt;code&gt;ssh&lt;/code&gt;를 검색하여 나오는 &lt;code&gt;Remote-SSH: Connect to Host...&lt;/code&gt; 를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 위에서 저장한 &lt;code&gt;Host&lt;/code&gt; 별칭을 확인할 수 있다. Host 별칭을 클릭하면 &lt;code&gt;ec2 인스턴스&lt;/code&gt;에 접속함을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126439057-4ec1c8c2-10eb-49d6-a9cd-3c8752c79a58.png&quot; alt=&quot;ec2 원격 접속하기-5&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;code&gt;폴더 열기&lt;/code&gt;를 통해 &lt;code&gt;ec2 인스턴스의 디렉토리 구조&lt;/code&gt;를 파일탐색기처럼 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;git&lt;/code&gt;이 설치되어 있다면 &lt;code&gt;project clone&lt;/code&gt;도 가능하다. &lt;code&gt;Terminal&lt;/code&gt; 창은 &lt;code&gt;ctrl&lt;/code&gt; + &lt;code&gt;~&lt;/code&gt; 으로 띄울 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 하단을 보면 &lt;code&gt;SSH:[별칭]&lt;/code&gt; 으로 하여 해당 &lt;code&gt;ec2 인스턴스&lt;/code&gt;에 접속했음을 다시 한 번 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/52652338/126439058-192764c5-9d10-472c-816c-033209ecf070.png&quot; alt=&quot;ec2 원격 접속하기-6&quot; /&gt;&lt;/p&gt;</description>
      <category>Cloud/AWS</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>Remote SSH</category>
      <category>ssh</category>
      <category>vscode</category>
      <category>원격접속</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/344</guid>
      <comments>https://gre-eny.tistory.com/344#entry344comment</comments>
      <pubDate>Wed, 21 Jul 2021 15:05:09 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] EC2(Amazon Linux 2)에 Java 11 설치하기</title>
      <link>https://gre-eny.tistory.com/343</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Amazon Linux 2 이미지를 가지고 실행된&lt;/span&gt; AWS EC2 에서 Java 11 을 설치해 보자.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;yum&lt;/code&gt; 으로 설치 가능한 Java 는 버전 8까지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 아마존에서 제공하는 OpenJDK인 &lt;code&gt;Amazon Coretto&lt;/code&gt; 를 다운받아 설치하자.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ yum list java*jdk-devel # 설치 가능한 jdk 확인
# java-1.6.0-openjdk-devel.x86_64                                       1:1.6.0.41-1.13.13.1.77.amzn1                                       amzn-main
# java-1.7.0-openjdk-devel.x86_64                                       1:1.7.0.261-2.6.22.1.83.amzn1                                       amzn-updates
# java-1.8.0-openjdk-devel.x86_64                                       1:1.8.0.252.b09-2.51.amzn1    &lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Java 11 설치하기&lt;/h2&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;# aws coreetto 다운로드 (2가지 방법)
$ sudo curl -L https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.rpm -o java11.rpm
# 혹은
$ sudo wget https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.rpm -O java11.rpm

# jdk11 설치
$ sudo yum localinstall jdk11.rpm

# jdk version 선택
$ sudo /usr/sbin/alternatives --config java

# java 버전 확인
$ java --version

# 다운받은 설치파일 제거
$ rm -rf jdk11.rpm&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일을 다운로드 할 때 &lt;code&gt;-o&lt;/code&gt; 혹은 &lt;code&gt;-O&lt;/code&gt; 옵션을 사용하여 파일명을 지정해서 다운로드 받을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용하지 않는 Java 버전 지우기&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ yum list installed | grep &quot;java&quot; # yum 설치 리스트 확인
# java-1.8.0-openjdk-headless.x86_64    1:1.8.0.222.b10-0.47.amzn1   @amzn-updates
# java-11-amazon-corretto-devel.x86_64  1:11.0.7.10-1                installed

$ sudo yum remove java-1.8.0-openjdk-headless.x86_64 &lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Refer to&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html&quot;&gt;AWS Corretto JDK List&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1626806429296&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;Downloads for Amazon Corretto 11 - Amazon Corretto&quot; data-og-description=&quot;Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Downloads for Amazon Corretto 11 - Amazon Corretto&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.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;</description>
      <category>Cloud/AWS</category>
      <category>AWS</category>
      <category>EC2</category>
      <author>팡우송</author>
      <guid isPermaLink="true">https://gre-eny.tistory.com/343</guid>
      <comments>https://gre-eny.tistory.com/343#entry343comment</comments>
      <pubDate>Wed, 21 Jul 2021 03:40:06 +0900</pubDate>
    </item>
  </channel>
</rss>