<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Question영 이야기</title>
    <link>https://question0.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 19:00:35 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Question영</managingEditor>
    <image>
      <title>Question영 이야기</title>
      <url>https://tistory1.daumcdn.net/tistory/3198001/attach/ef373cfb6c944864a683e9e3d03d93dc</url>
      <link>https://question0.tistory.com</link>
    </image>
    <item>
      <title>[NAS/DS Video] 앱에서 동영상이 재생 안될때</title>
      <link>https://question0.tistory.com/51</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;synology_logo.png&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do4xqp/btrYIN2OQjp/pmVKjJuhE8xNfcvf4KpJVK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do4xqp/btrYIN2OQjp/pmVKjJuhE8xNfcvf4KpJVK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do4xqp/btrYIN2OQjp/pmVKjJuhE8xNfcvf4KpJVK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo4xqp%2FbtrYIN2OQjp%2FpmVKjJuhE8xNfcvf4KpJVK%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;815&quot; height=&quot;230&quot; data-filename=&quot;synology_logo.png&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&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;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※ 스크랩이나 담아갈시 댓글에 출처를 남겨주세요.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;평소에 나스와 DS Video 많이 사용하고 있는 퀘영입니다.&lt;/p&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;LTE 로 했을때도 정상 로그인되서 잘 재생이 될줄 알았는데 ...&lt;/p&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;h1&gt;&amp;nbsp;&lt;/h1&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;통신사 허브(SK) 1 + ipTime 공유기 + NAS&lt;br /&gt;(ipTime 공유기에 포트포워딩 설정된 상황)&lt;/li&gt;
&lt;li&gt;안드로이드 단말, 아이폰 단말 연결&lt;/li&gt;
&lt;li&gt;DS Video (시놀로지 앱) 설치된 상태&lt;/li&gt;
&lt;li&gt;QuickConnect ID 를 주소로 연결함&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&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;한참 로딩 뒤 '.... 재생할 수 없습니다.' 라는 문구가 팝업이 노출&lt;/li&gt;
&lt;li&gt;'지원되지 않는 동영상 입니다.' 라는 문구 팝업이 노출&lt;br /&gt;(이 증상은 이전에 코덱과 나스 안의 'Advanced Media Extensions' 및 ffmpeg 코덱 설치 후 해결됨)&lt;/li&gt;
&lt;li&gt;ffmpeg 코덱이 설치됬는데도 불구하고 mkv 파일이 실행 안될때&lt;br /&gt;(Video Station 에서 실행안되는 미디어 정보 보기 실행 &amp;gt; 오디오에 eac3 라는 코덱이 있을 경우 발생됨)&lt;/li&gt;
&lt;li&gt;eac3 코덱 지원을 위해 ssh 로 접속 후 sudo -i 혹은 sudo -s 를 통해 root 권한을 획득 아래 한줄 명령어를 실행하면 해결됨&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;shell&quot; data-ke-language=&quot;shell&quot;&gt;&lt;code&gt;curl https://raw.githubusercontent.com/AlexPresso/VideoStation-FFMPEG-Patcher/main/patcher.sh | bash&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;원인&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 느린 속도&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;QuicConnect ID 는 다 좋지만 시놀로지 사이트를 거쳐 나스에 설정된 ip 를 검색 후 연결하는 구조이기 때문에 느린것이 단점&lt;/li&gt;
&lt;li&gt;동영상 재생시 로딩 및 속도 저하의 이슈가 될수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 포트포워딩을 내부 공유기인 ipTime 에만 설정한 것에 대한 문제&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통신사 허브에서 실제 IP 를 할당 받아 내부 IP 를 ipTime 공유기에 할당,&lt;br /&gt;실제 나스와 연결된 ipTime 에서 다시 내부 ip 를 발급하여 나스에 부여하는 구조&lt;/li&gt;
&lt;li&gt;QuicConnect ID 를 사용하지 않고 IP 직접 입력이나 나스 설정 중 DDNS 사용시 문제가 발생할 수 있는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;해결책&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접연결을 위해 DDNS 를 이용하는 방법을 선택하여 진행&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;나스 Admin 계정으로 접속&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;네트워크에서 활성화된 포트를 확인&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 &amp;gt; 네트워크 인터페이스 실행&lt;/li&gt;
&lt;li&gt;활성화된 LAN 포트 를 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DDNS 설정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제어판 &amp;gt; 외부 액세스 &amp;gt; DDNS 탭 선택 &amp;gt; 추가 실행&lt;/li&gt;
&lt;li&gt;'서비스 공급자' 를 Synology 선택&lt;/li&gt;
&lt;li&gt;호스트 이름 입력 후 연결테스트 진행 &amp;gt; 정상 확인&lt;/li&gt;
&lt;li&gt;외부 주소(IPv4) 는 자동 설정된 것을 사용&lt;/li&gt;
&lt;li&gt;외부 주소(IPv6) 에서 연결되어 있는 포트 중 활성화된(이전단계에서 확인된 사항) 포트 확인하여 선택&lt;/li&gt;
&lt;li&gt;확인하여 활성화&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ipTime 설정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;wifi 연결 &amp;gt; 192.168.0.1 접속&lt;/li&gt;
&lt;li&gt;관리도구 &amp;gt; 고급설정 &amp;gt; NAT/라우터 관리(전 A104 버전으로 오래된 공유기여서 다를수 있습니다.)&lt;/li&gt;
&lt;li&gt;포트포워드 설정&lt;/li&gt;
&lt;li&gt;나스에 설정된 IP 주소 입력 후 외부/내부 포트 5000 ~ 5005 로 설정&lt;br /&gt;(IP 는 나스 접속시 주소란에 보입니다.)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;통신사 공유기 설정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작성자 기준 SK 는 DASAN 이라는 공유기였습니다.&lt;/li&gt;
&lt;li&gt;DASAN 관리자 페이지 접속은 wifi 해제 후 192.168.75.1 로 접속&lt;/li&gt;
&lt;li&gt;ID 는 admin&lt;/li&gt;
&lt;li&gt;PW 는 공유기에 붙어있는 S/N 정보에 GPON 이란 항목에서 끝 6자리와 _admin 조합으로 구성&lt;br /&gt;(예시 : GPON S/N : 1234a5678b90 &amp;gt; PW: 678D90_admin)&lt;/li&gt;
&lt;li&gt;영어는 대문자를 사용&lt;/li&gt;
&lt;li&gt;비밀번호 초기화 화면 노출이면 입력하고 다음으로 넘김&lt;br /&gt;(잘 접속 안하니 기억나는걸로 하시면 좋음, 전 그냥 그대로 비밀번호 다시 입력함)&lt;/li&gt;
&lt;li&gt;왼쪽 기본설정 &amp;gt; NAT &amp;gt; Port 포워딩 이동&lt;/li&gt;
&lt;li&gt;ipTime 에 부여된 내부 IP 를 로컬 IP 주소에 입력&lt;/li&gt;
&lt;li&gt;로컬포트 퍼블릭 포트 둘다 5000~5005 입력 후 추가 버튼 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;앱에서 ...&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Android / IOS 둘다 해당)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱에서는 QuickConnect ID 대신 설정한 &lt;b&gt;DDNS 주소를 작성&lt;/b&gt;해주시고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTPS 설정되어 있으면 해제&lt;/b&gt;하신 후 로그인 하시면 되며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 접속을 위한 것이기 때문에 내부 &lt;b&gt;wifi 는 연결 해제 후 사용&lt;/b&gt;해주셔야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 내부 wifi 를 연결하면 접속이 안되더라구요...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;평소 내부망에서 사용 예정이신분들은 그냥 QuickConnect ID&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;/p&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>DS Video</category>
      <category>NAS</category>
      <category>quickconnect</category>
      <category>video</category>
      <category>나스</category>
      <category>무한로딩</category>
      <category>연결문제</category>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/51</guid>
      <comments>https://question0.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 9 Feb 2023 20:30:02 +0900</pubDate>
    </item>
    <item>
      <title>[NAS/SourceTree]  Git Server 부터 SourceTree 연결 까지</title>
      <link>https://question0.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&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;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※ 스크랩이나 담아갈시 댓글에 출처를 남겨주세요.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신년을 맞아 나스를 구입하게되어 이것저것 해보고 있는 퀘영입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소 svn 보다 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;처음엔 &lt;b&gt;NAS + GitLab&lt;/b&gt; 으로 진행하려고 하였으나 현재 램이 &lt;b&gt;2G&lt;/b&gt; 에 압박으로 일단 &lt;b&gt;Git Server&lt;/b&gt; 로 진행해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른분들의 블로그를 참고해보니 &lt;b&gt;GitLab&lt;/b&gt; 을 사용하려면 최소 &lt;b&gt;8G 이상&lt;/b&gt; 정도의 램 환경에서 진행해야 할것 같더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(아무래도 도커 때문에 그런거 같아요... ㅠ-ㅠ)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이번 진행 과정에서 ssh 설정이 완벽하게 되지 않아 비밀번호를 입력하는 단계가 있으니 참고해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(왜인지 모르게 ssh 설정이 정상 설정되지 않아 우선 비밀번호를 입력하는 과정을 거치는 내용으로 설명되어 있습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;환경&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;a href=&quot;https://www.synology.com/ko-kr/products/DS220+&quot;&gt;시놀로지의 DS220+&lt;/a&gt; (서버)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. LG 그램 (클라이언트)&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;필요 소프트웨어&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 : NAS + Git Server&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 : &lt;a href=&quot;https://www.putty.org/&quot;&gt;Windows 10 + PuTTY&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;과정 (NAS 에서)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 나스의 세팅과정에 대한 내용은 생략하겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;제어판 &amp;gt; 사용자 &amp;gt; 하단 사용자 홈서비스 활성화 체크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이걸 해줘야 터미널에서 `cd ~` 관련된 명령어들을 사용 가능하다고 들었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;패키지센터에서 Git Server 설치&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;1923&quot; data-origin-height=&quot;903&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5D8Gn/btrXhnD52cz/NKtN01eh1QsbGYmfaEOElK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5D8Gn/btrXhnD52cz/NKtN01eh1QsbGYmfaEOElK/img.png&quot; data-alt=&quot;패키지 센터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5D8Gn/btrXhnD52cz/NKtN01eh1QsbGYmfaEOElK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5D8Gn%2FbtrXhnD52cz%2FNKtN01eh1QsbGYmfaEOElK%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;1923&quot; height=&quot;903&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;1923&quot; data-origin-height=&quot;903&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;패키지 센터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.PNG&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KpgTj/btrXhvaTJch/UmPTVv7rYrJkhhYclVzYP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KpgTj/btrXhvaTJch/UmPTVv7rYrJkhhYclVzYP1/img.png&quot; data-alt=&quot;Git Server 를 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KpgTj/btrXhvaTJch/UmPTVv7rYrJkhhYclVzYP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKpgTj%2FbtrXhvaTJch%2FUmPTVv7rYrJkhhYclVzYP1%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;1356&quot; height=&quot;766&quot; data-filename=&quot;2.PNG&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Git Server 를 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NAS에서 root, admin 외에 Git 전용 사용자 추가&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[예: gituser(사용자 아이디)]&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.PNG&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnsAUT/btrXhopxsj2/y3n3lrozS0MQPNAZipdwX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnsAUT/btrXhopxsj2/y3n3lrozS0MQPNAZipdwX1/img.png&quot; data-alt=&quot;제어판 &amp;amp;gt; 사용자 및 그룹&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnsAUT/btrXhopxsj2/y3n3lrozS0MQPNAZipdwX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnsAUT%2FbtrXhopxsj2%2Fy3n3lrozS0MQPNAZipdwX1%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;1917&quot; height=&quot;896&quot; data-filename=&quot;4.PNG&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제어판 &amp;gt; 사용자 및 그룹&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.PNG&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhtAHD/btrXgq9pQ1X/E41KHdcN5VPNXwYK5knUf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhtAHD/btrXgq9pQ1X/E41KHdcN5VPNXwYK5knUf1/img.png&quot; data-alt=&quot;Git 서버 사용할 사용자 등록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhtAHD/btrXgq9pQ1X/E41KHdcN5VPNXwYK5knUf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhtAHD%2FbtrXgq9pQ1X%2FE41KHdcN5VPNXwYK5knUf1%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;1462&quot; height=&quot;844&quot; data-filename=&quot;6.PNG&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Git 서버 사용할 사용자 등록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SSH 서비스 활성화 및 포트 변경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안을 위해서 기본 &lt;b&gt;22&lt;/b&gt; 로 되어 있는 포트를 &lt;b&gt;2222&lt;/b&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-filename=&quot;13.PNG&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;839&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LSsAZ/btrXhmZy0z9/4EjcncknGnMUxhuhjcYcJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LSsAZ/btrXhmZy0z9/4EjcncknGnMUxhuhjcYcJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LSsAZ/btrXhmZy0z9/4EjcncknGnMUxhuhjcYcJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLSsAZ%2FbtrXhmZy0z9%2F4EjcncknGnMUxhuhjcYcJK%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;1458&quot; height=&quot;839&quot; data-filename=&quot;13.PNG&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;839&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;h2 data-ke-size=&quot;size26&quot;&gt;Git Server 설정화면에서 gituser(사용자 아이디) 에 접근허용 체크&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12.PNG&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YLb5M/btrXg3y2Uwi/wbbNN0ajZtyeJ2KKhGylNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YLb5M/btrXg3y2Uwi/wbbNN0ajZtyeJ2KKhGylNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YLb5M/btrXg3y2Uwi/wbbNN0ajZtyeJ2KKhGylNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYLb5M%2FbtrXg3y2Uwi%2FwbbNN0ajZtyeJ2KKhGylNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;770&quot; height=&quot;462&quot; data-filename=&quot;12.PNG&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;[window] PuTTY 프로그램을 이용해서 ssh 접속&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Host Name 에 나스 아이피 입력&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 192.168.0.13 로 잡혔는데 초반 나스에 접속할때 잡히는 로컬 ip 로 설정하시면 됩니다.&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-filename=&quot;3.PNG&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUMrpU/btrXibpL3ps/rN48L4kp7hkTesiGzsUrM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUMrpU/btrXibpL3ps/rN48L4kp7hkTesiGzsUrM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUMrpU/btrXibpL3ps/rN48L4kp7hkTesiGzsUrM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUMrpU%2FbtrXibpL3ps%2FrN48L4kp7hkTesiGzsUrM0%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;460&quot; height=&quot;449&quot; data-filename=&quot;3.PNG&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;나스 사용자 아이디 입력 (예: abc123)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.PNG&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;47&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b47W8J/btrXg3TlObl/ukEcl2WOZxkBmXA58lkfT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b47W8J/btrXg3TlObl/ukEcl2WOZxkBmXA58lkfT0/img.png&quot; data-alt=&quot;사용자 아이디까지 같이 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b47W8J/btrXg3TlObl/ukEcl2WOZxkBmXA58lkfT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb47W8J%2FbtrXg3TlObl%2FukEcl2WOZxkBmXA58lkfT0%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;281&quot; height=&quot;47&quot; data-filename=&quot;11.PNG&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;47&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자 아이디까지 같이 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.PNG&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kwdn1/btrXgwBHr0l/MrFmJ9hmvqB8U5nMbri5k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kwdn1/btrXgwBHr0l/MrFmJ9hmvqB8U5nMbri5k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kwdn1/btrXgwBHr0l/MrFmJ9hmvqB8U5nMbri5k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKwdn1%2FbtrXgwBHr0l%2FMrFmJ9hmvqB8U5nMbri5k0%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;670&quot; height=&quot;426&quot; data-filename=&quot;5.PNG&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;등록한 사용자폴더로 이동&lt;/h2&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;$ cd /var/services/homes/gituser(사용자 아이디)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git 저장소로 이용할 폴더 생성&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;$ mkdir repository.git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.PNG&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBqEri/btrXfay02jV/IIzsgCZVSmk41Wl7pNtUVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBqEri/btrXfay02jV/IIzsgCZVSmk41Wl7pNtUVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBqEri/btrXfay02jV/IIzsgCZVSmk41Wl7pNtUVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBqEri%2FbtrXfay02jV%2FIIzsgCZVSmk41Wl7pNtUVk%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;661&quot; height=&quot;418&quot; data-filename=&quot;7.PNG&quot; data-origin-width=&quot;661&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&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-filename=&quot;8.PNG&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XvUKJ/btrXcpDlrrW/eVZ1PSb1ikbBYgwNRi8Ug1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XvUKJ/btrXcpDlrrW/eVZ1PSb1ikbBYgwNRi8Ug1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XvUKJ/btrXcpDlrrW/eVZ1PSb1ikbBYgwNRi8Ug1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXvUKJ%2FbtrXcpDlrrW%2FeVZ1PSb1ikbBYgwNRi8Ug1%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;723&quot; height=&quot;586&quot; data-filename=&quot;8.PNG&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ cd repository.git&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git 선언&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;
$ git init --bare

$ git update-server-info

$ git remote update

$ cd ..

$ chown -R gituser(사용자 아이디):users(사용자 그룹) repository.git&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;과정 (Window 에서)&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9.PNG&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cejRkW/btrXimY2iRf/K4b7VoJuXpQMf55ODV3WFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cejRkW/btrXimY2iRf/K4b7VoJuXpQMf55ODV3WFK/img.png&quot; data-alt=&quot;SourceTree &amp;amp;gt; 상단 탭 중 '+' 선택 &amp;amp;gt; Clone 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cejRkW/btrXimY2iRf/K4b7VoJuXpQMf55ODV3WFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcejRkW%2FbtrXimY2iRf%2FK4b7VoJuXpQMf55ODV3WFK%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;820&quot; height=&quot;607&quot; data-filename=&quot;9.PNG&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;607&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SourceTree &amp;gt; 상단 탭 중 '+' 선택 &amp;gt; Clone 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git 클라이언트 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 &lt;a href=&quot;https://www.sourcetreeapp.com/&quot;&gt;SourceTree&lt;/a&gt; 로 설치했습니다. &lt;a href=&quot;https://git-fork.com/&quot;&gt;Fork&lt;/a&gt; 를 설치해서 진행해도 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;git bash 프롬프트 실행&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ ssh-keygen

$ ssh-copy-id gituser(사용자 아이디)@192.168.0.13(NAS IP)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SourceTree 에 내장되어 있는 터미널을 통해 ssh key 를 발급받아 나스 서버에 .ssh 에 등록하는 과정을 거치면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 ssh 이 과정을 거치지 않더라도 id/pw 를 통한 접근도 가능하더라구요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ssh://\[nas 사용자id\]@192.168.0.13:\[ssh 포트번호 \]/var/services/homes/\[nas 사용자 Id 폴더\]/repository.git&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;기타&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 id 와 그룹 확인 id&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;$ id [사용자 ID]&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;chown&lt;/code&gt; 로 사용자 그룹 설정시 root 권한이 필요하기 때문에 root 사용자로 변경 ( sudo -i 입력 혹은 sudo -s 입력) 하고 권한 설정하면 좀 더 쉽게 진행 할 수 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 자료 1. &lt;a href=&quot;https://gutmate.tistory.com/entry/Synology-NAS-Git-Server-%EC%84%A4%EC%B9%98&quot;&gt;https://gutmate.tistory.com/entry/Synology-NAS-Git-Server-%EC%84%A4%EC%B9%98&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료 2. &lt;a href=&quot;https://www.icatpark.com/entry/Synology-Nas-%EC%97%90-Git-Server-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%84%A4%EC%A0%95&quot;&gt;https://www.icatpark.com/entry/Synology-Nas-%EC%97%90-Git-Server-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%84%A4%EC%A0%95&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료3. &lt;a href=&quot;https://www.bearpooh.com/40&quot;&gt;https://www.bearpooh.com/40&lt;/a&gt;&lt;/p&gt;</description>
      <category>형상관리</category>
      <category>git server</category>
      <category>NAS</category>
      <category>sourcetree</category>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/50</guid>
      <comments>https://question0.tistory.com/50#entry50comment</comments>
      <pubDate>Wed, 18 Jan 2023 00:52:56 +0900</pubDate>
    </item>
    <item>
      <title>[SourceTree] Mac 에서 반복해서 암호를 물어볼경우</title>
      <link>https://question0.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;※ 해당 글은 제가 직접 작성한 글입니다. 정확하지 않은 정보일 수 있으니 정정할 사항이 있으면 알려주시기 바랍니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;※ 스크랩이나 담아갈시 댓글에 출처를 남겨주세요.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;맥에서 순서대로 실행하면 더 이상 pull, push 기타 등등... 동작시 암호를 물어보지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 터미널&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. git config --global credential.helper osxkeychain 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 소스트리 재실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;감사합니다.&lt;/p&gt;</description>
      <category>형상관리</category>
      <category>Git</category>
      <category>Mac</category>
      <category>sourcetree</category>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/49</guid>
      <comments>https://question0.tistory.com/49#entry49comment</comments>
      <pubDate>Thu, 5 Jan 2023 20:23:12 +0900</pubDate>
    </item>
    <item>
      <title>[Android/정규식] 특정 양식의 전화번호만 링크로 처리</title>
      <link>https://question0.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;※ 해당 글은 제가 직접 작성한 글입니다. 정확하지 않은 정보일 수 있으니 정정할 사항이 있으면 알려주시기 바랍니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;※ 스크랩이나 담아갈시 댓글에 출처를 남겨주세요.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;목적&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문장에서 전화번호만 추출하여 이벤트를 부여하거나 편집하고 싶을 경우 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;환경&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Macbook&lt;/li&gt;
&lt;li&gt;Android Studio&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;용어&lt;/h1&gt;
&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;프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어를 말한다. 정규식이라고도 부르며,보통 regex 혹은 regexp라 많이 쓴다. (나무위키)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;테스트 데이터&lt;/h1&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;010-1234-1234전화번호테스트1234-1234전화번호 테스트1234-1234전화번호 테스트
전화번호 케이스 1 : (1234-1234)
전화번호 케이스 2 : 1234-12341234
전화번호 케이스 3 : 32432431234-1234
전화번호 케이스 4 : zzzzz1234-1234테스트
전화번호 케이스 5 : 1234 1234
전화번호 케이스 6 : 테스트 1234 1234테스트
전화번호 케이스 7 : 1234 1234테스트
url 테스트 https://www.naver.com (1234-1234)
010 4444 4444
adfadf010 4444 4444dsafsfa
dfafada010 4444 4444
(010 4444 4444)&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;&amp;nbsp;&lt;/h2&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://regexr.com/&quot;&gt;regexr&lt;/a&gt; 사이트에서 테스트를 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_사이트.PNG&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;936&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdq64V/btrVqg2gmnj/GoSKY41BL1DkecgHYlAUsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdq64V/btrVqg2gmnj/GoSKY41BL1DkecgHYlAUsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdq64V/btrVqg2gmnj/GoSKY41BL1DkecgHYlAUsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdq64V%2FbtrVqg2gmnj%2FGoSKY41BL1DkecgHYlAUsk%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;1917&quot; height=&quot;936&quot; data-filename=&quot;edited_사이트.PNG&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;936&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;사용 정규식&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. ex) 1234-1234&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;(?=\d{4}.?\d{4}[\D]).*?((?&amp;lt;=[\D])\d{4}.?\d{4})&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_정규식 테스트1.PNG&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;939&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8FqQP/btrVt29QPaB/QpwKRb1Twn24NZl9Eju2wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8FqQP/btrVt29QPaB/QpwKRb1Twn24NZl9Eju2wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8FqQP/btrVt29QPaB/QpwKRb1Twn24NZl9Eju2wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8FqQP%2FbtrVt29QPaB%2FQpwKRb1Twn24NZl9Eju2wk%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;1917&quot; height=&quot;939&quot; data-filename=&quot;edited_정규식 테스트1.PNG&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;939&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. ex) 010-1234-1234&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code class=&quot;language-java&quot;&gt;(?=(\d{3}(\s|-))?\d{4}(\s|-)\d{4}(\D|$)).*?((?&amp;lt;=(\D|^))\d{4}(\s|-)\d{4})&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_정규식 테스트2.PNG&quot; data-origin-width=&quot;1921&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd2L89/btrVqhmv9Oj/t30ZwgO1lemV8guk0TgIZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd2L89/btrVqhmv9Oj/t30ZwgO1lemV8guk0TgIZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd2L89/btrVqhmv9Oj/t30ZwgO1lemV8guk0TgIZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd2L89%2FbtrVqhmv9Oj%2Ft30ZwgO1lemV8guk0TgIZ0%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;1921&quot; height=&quot;938&quot; data-filename=&quot;edited_정규식 테스트2.PNG&quot; data-origin-width=&quot;1921&quot; data-origin-height=&quot;938&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;h1&gt;정규식 작성 고려사항&lt;/h1&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;/li&gt;
&lt;li&gt;&lt;code&gt;.*?&lt;/code&gt; 표현은 AND 와 같은 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;Android 에서 위의 정규식이 필요한 경우와 해결 방법&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_Screenshot_20230105-192944_DemoProject_201218.jpg&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WCWWc/btrVukh7kpk/65VEO6qUjRy7KINFqurk70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WCWWc/btrVukh7kpk/65VEO6qUjRy7KINFqurk70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WCWWc/btrVukh7kpk/65VEO6qUjRy7KINFqurk70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWCWWc%2FbtrVukh7kpk%2F65VEO6qUjRy7KINFqurk70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;268&quot; data-filename=&quot;edited_Screenshot_20230105-192944_DemoProject_201218.jpg&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 기준 Android TextView 에서 ellipse 기능과 AutoLink 기능을 동시에 사용하려고 할때 문제가 발생함 (동시 사용 안됨)&lt;/li&gt;
&lt;li&gt;Layout XML 에서 TextView 에 limitLine = &quot;2&quot;, ellipze =&quot;end&quot; 옵션을 설정&lt;/li&gt;
&lt;li&gt;Link 는 Kotlin 혹은 Java 에서 적용 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;// 처리 본문
val spanText = SpannableString(item.description)
Linkify.addLinks(spanText, Linkify.ALL)
tvDescription.text = spanText
tvDescription.setOnTouchListener(TouchTextView(spanText))&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;// TouchTextView
class TouchTextView(
    var spannable: Spannable,
    val clickUrl: (URLSpan) -&amp;gt; Unit
) : View.OnTouchListener {

    override fun onTouch(v: View, event: MotionEvent): Boolean {
        val action = event.action
        if (v !is TextView) {
            return false
        }
        if (action == MotionEvent.ACTION_UP ||
            action == MotionEvent.ACTION_DOWN
        ) {
            var x = event.x.toInt()
            var y = event.y.toInt()
            x -= v.totalPaddingLeft
            y -= v.totalPaddingTop
            x += v.scrollX
            y += v.scrollY
            val layout = v.layout
            val line = layout.getLineForVertical(y)
            val off = layout.getOffsetForHorizontal(line, x.toFloat())
            val link = spannable.getSpans(
                off, off,
                ClickableSpan::class.java
            )
            if (link.isNotEmpty()) {
                when(action) {
                    MotionEvent.ACTION_UP -&amp;gt; {
                        val linkUrl = (link[0] as URLSpan)
                        if (linkUrl.url.startsWith(&quot;tel:&quot;)) {
                            link[0].onClick(v)
                        } else {
                            clickUrl.invoke(linkUrl)
                        }
                        v.performClick()
                    }
                    MotionEvent.ACTION_DOWN -&amp;gt; {
                        Selection.setSelection(
                            spannable,
                            spannable.getSpanStart(link[0]),
                            spannable.getSpanEnd(link[0])
                        )
                    }
                    else -&amp;gt; {}//Nothing
                }
                return true
            } else {
                Selection.removeSelection(spannable)
            }
        }
        return false
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;마치며&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 형태의 화면에서 전화번호에 이벤트 부여를 위해 많이 사용될 것으로 기대 되며,실제로 맡은 프로젝트를 진행하면서 사용했던 방법으로 IOS 에서도 정규식은 그대로 사용하면 됩니다.&lt;br /&gt;정규식의 해석은 구글링하면 많이 나와 있으니 별도로 다루지 않도록 하겠습니다.&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;참고&lt;/h1&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;http://www.java2s.com/example/android/user-interface/linkify-any-links-appearing-in-the-text-and-place-it-in-the-textview.html&quot;&gt;http://www.java2s.com/example/android/user-interface/linkify-any-links-appearing-in-the-text-and-place-it-in-the-textview.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/20245862/make-ellipsized-a-textview-which-has-linkmovementmethod/35735409#35735409&quot;&gt;https://stackoverflow.com/questions/20245862/make-ellipsized-a-textview-which-has-linkmovementmethod/35735409#35735409&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vagabond95.me/posts/android_not_working_ellipsize_with_autolink_or_movementmethod/&quot;&gt;https://vagabond95.me/posts/android_not_working_ellipsize_with_autolink_or_movementmethod/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Android</category>
      <category>Android</category>
      <category>ios</category>
      <category>Java</category>
      <category>kotlin</category>
      <category>mobile</category>
      <category>정규식</category>
      <category>정규표현식</category>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/48</guid>
      <comments>https://question0.tistory.com/48#entry48comment</comments>
      <pubDate>Thu, 5 Jan 2023 18:47:18 +0900</pubDate>
    </item>
    <item>
      <title>[사업자/프리랜서] 원천징수영수증 조회</title>
      <link>https://question0.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;5월 종합소득신고를 위해 원천징수영수증을 획득하는 방법은 두가지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로젝트 종료시 계약한 업체에 요청 -&amp;gt; 익월 최종 지급후 요청이 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 종합소득세 신고 년도의 4월에 홈텍스에서 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번의 방법을 사용했을때 들어가는 경로는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 홈텍스 로그인 이후 홈텍스 상단의 &lt;b&gt;My홈텍스&lt;/b&gt; 를 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;홈텍스.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EoDgu/btrz6ZTw49E/dlLtk1iJW9dlFxcuSXHbk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EoDgu/btrz6ZTw49E/dlLtk1iJW9dlFxcuSXHbk0/img.png&quot; data-alt=&quot;홈텍스 상단 My 홈텍스를 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EoDgu/btrz6ZTw49E/dlLtk1iJW9dlFxcuSXHbk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEoDgu%2Fbtrz6ZTw49E%2FdlLtk1iJW9dlFxcuSXHbk0%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;78&quot; data-filename=&quot;홈텍스.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;홈텍스 상단 My 홈텍스를 선택&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;2. 하단의 메뉴중 연말정산 지급명세서 메뉴를 선택 &amp;gt; 지급명세서 등 제출내역을 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;홈텍스2.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BvRxA/btrz5pekRNs/1hqKhvWz54k1McCu82Tzek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BvRxA/btrz5pekRNs/1hqKhvWz54k1McCu82Tzek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BvRxA/btrz5pekRNs/1hqKhvWz54k1McCu82Tzek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBvRxA%2Fbtrz5pekRNs%2F1hqKhvWz54k1McCu82Tzek%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;1316&quot; height=&quot;323&quot; data-filename=&quot;홈텍스2.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고바랍니다.&lt;/p&gt;</description>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/46</guid>
      <comments>https://question0.tistory.com/46#entry46comment</comments>
      <pubDate>Fri, 22 Apr 2022 10:27:01 +0900</pubDate>
    </item>
    <item>
      <title>[Android/Kotlin] ViewPager 와 비슷한 RecyclerView 만들기</title>
      <link>https://question0.tistory.com/45</link>
      <description>&lt;h1&gt;목적&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RecyclerView 를 Scroll 이후 ViewPager 처럼 특정 페이지에 걸린것처럼 동작하게 하는 방법을 정리했습니다.&lt;/p&gt;
&lt;h1&gt;환경&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Macbook&lt;/li&gt;
&lt;li&gt;Android Studio&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;용어&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RecyclerView&lt;/li&gt;
&lt;li&gt;ViewPager2&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;구성&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 1. 현재 위치 계산 함수&lt;/li&gt;
&lt;li&gt;코드 2. 현재 위치에서 가변위치까지 에니메이션이 적용된 동작을 하게 하는 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;fun getCurrentPosition(): Int {
    return LinearSnapHelper().findSnapView(layoutManager)?.run {
          layoutManager.getPosition(this)
    } ?: 0
}

fun moveToPosition(offset: Int) {
    val position = getCurrentPosition() + offset
    binding.rvContents.smoothScrollToPosition(position)
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;시나리오&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RecyclerView 의 Scroll 진행&lt;/li&gt;
&lt;li&gt;&lt;code&gt;onScrollStateChanged&lt;/code&gt; 에서 이벤트를 감시 중 Scroll 완료시 임시 위치에서 멈추면 감지&lt;/li&gt;
&lt;li&gt;마지막 위치로 에니메이션 이동을 실행하여 자연스럽게 마지막 페이지의 정중앙으로 스크롤을 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;val layoutManager = rvContents.layoutManager as LinearLayoutManager

rvContents.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
          super.onScrollStateChanged(recyclerView, newState)
          if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            moveToPosition(0)
          }
    }

    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
          super.onScrolled(recyclerView, dx, dy)
        // 선택시 정보 갱신
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;고려사항&lt;/h1&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;val snapHelper = LinearSnapHelper()
snapHelper.attachToRecyclerView(recyclerView)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;LinearSnapHelper&lt;/code&gt; 의 &lt;code&gt;attachToRecyclerView&lt;/code&gt; 로 구현하는 방식도 있으나 횡 스크롤시 다소 시원스럽게 동작하지 않고 가속으로 스크롤하는 느낌을 살릴수가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약간 ViewPager 인데 하나씩 스크롤하는게 아닌 여러개 스크롤하다 멈추는 느낌이 좀 더 강하죠.&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;h1&gt;마치며&lt;/h1&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;제 겪은 상황은 페이지의 양옆의 인덱스 정보를 노출하는 UI 를 표현시 해당 부분에 로직처리를 진행 했었고 관련 로직은 별도 기술하지 않았습니다.&lt;/p&gt;
&lt;h1&gt;참고&lt;/h1&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://altongmon.tistory.com/442&quot;&gt;https://altongmon.tistory.com/442&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rkdxowhd98.tistory.com/116&quot;&gt;https://rkdxowhd98.tistory.com/116&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/26682277/how-do-i-get-the-position-selected-in-a-recyclerview&quot;&gt;https://stackoverflow.com/questions/26682277/how-do-i-get-the-position-selected-in-a-recyclerview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Android</category>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/45</guid>
      <comments>https://question0.tistory.com/45#entry45comment</comments>
      <pubDate>Mon, 4 Apr 2022 14:10:54 +0900</pubDate>
    </item>
    <item>
      <title>[Android] 개발시 유용한 Tool 모음</title>
      <link>https://question0.tistory.com/44</link>
      <description>&lt;h1&gt;&lt;span&gt;목적&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;안드로이드 실무 개발시 유용한 Tool 정보를 정리해보았습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;환경&lt;/span&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;*&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Macbook&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Android Studio 설치&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Homebrew 설치&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Node.js 설치&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;span&gt;종류&lt;/span&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;scrcpy (무료 Device 미러링 Tool)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/Genymobile/scrcpy/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/Genymobile/scrcpy/releases&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1650333192723&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Releases &amp;middot; Genymobile/scrcpy&quot; data-og-description=&quot;Display and control your Android device. Contribute to Genymobile/scrcpy development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Genymobile/scrcpy/releases&quot; data-og-url=&quot;https://github.com/Genymobile/scrcpy/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2kOW0/hyN5xIvpeN/IBWQZ9kFYEKUdl2UVWwNgK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/g1pWc/hyN5IXzLi9/fQHLOw2UX1VUdK65kNaTLK/img.png?width=1526&amp;amp;height=1113&amp;amp;face=0_0_1526_1113,https://scrap.kakaocdn.net/dn/wcow0/hyN5tsyGLT/EVSn88ykJVKt55KdtAxNPK/img.png?width=300&amp;amp;height=325&amp;amp;face=0_0_300_325&quot;&gt;&lt;a href=&quot;https://github.com/Genymobile/scrcpy/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Genymobile/scrcpy/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2kOW0/hyN5xIvpeN/IBWQZ9kFYEKUdl2UVWwNgK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/g1pWc/hyN5IXzLi9/fQHLOw2UX1VUdK65kNaTLK/img.png?width=1526&amp;amp;height=1113&amp;amp;face=0_0_1526_1113,https://scrap.kakaocdn.net/dn/wcow0/hyN5tsyGLT/EVSn88ykJVKt55KdtAxNPK/img.png?width=300&amp;amp;height=325&amp;amp;face=0_0_300_325');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Releases &amp;middot; Genymobile/scrcpy&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Display and control your Android device. Contribute to Genymobile/scrcpy 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;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;*&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;디바이스와 단말기를 연결해주는 미들웨어 앱입니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;Git 에 설치 관련 자료가 있으나 별도 자세히 정리한 블로거가 있어 이쪽을 추천합니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;a href=&quot;https://kibua20.tistory.com/138&quot;&gt;https://kibua20.tistory.com/138&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1650333152310&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;안드로이드 스마트 폰 화면 미러링 방법:  scrcpy 사용법&quot; data-og-description=&quot;안드로이드 스마트 폰 화면을 PC로 미러링 하는 방법을 설명하도록 하겠습니다. 스마트 폰 화면을 그대로 PC에 가져오는 것 뿐만 아니라, 사운드 전송, 마우스로 원격 클릭 및 키보드 입력 값을 &quot; data-og-host=&quot;kibua20.tistory.com&quot; data-og-source-url=&quot;https://kibua20.tistory.com/138&quot; data-og-url=&quot;https://kibua20.tistory.com/138&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Wccjk/hyN5Et5nE3/BxfoSpkNnk3sBqkDDqd4Ek/img.png?width=596&amp;amp;height=532&amp;amp;face=0_0_596_532,https://scrap.kakaocdn.net/dn/buPFGY/hyN5IXzJfM/Lann3NpqB7hAFkD79paQXk/img.png?width=596&amp;amp;height=532&amp;amp;face=0_0_596_532,https://scrap.kakaocdn.net/dn/c0OC2Z/hyN5z0CB83/6nKa0k8ITfc8k9O1MgvCdk/img.png?width=933&amp;amp;height=761&amp;amp;face=0_0_933_761&quot;&gt;&lt;a href=&quot;https://kibua20.tistory.com/138&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kibua20.tistory.com/138&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Wccjk/hyN5Et5nE3/BxfoSpkNnk3sBqkDDqd4Ek/img.png?width=596&amp;amp;height=532&amp;amp;face=0_0_596_532,https://scrap.kakaocdn.net/dn/buPFGY/hyN5IXzJfM/Lann3NpqB7hAFkD79paQXk/img.png?width=596&amp;amp;height=532&amp;amp;face=0_0_596_532,https://scrap.kakaocdn.net/dn/c0OC2Z/hyN5z0CB83/6nKa0k8ITfc8k9O1MgvCdk/img.png?width=933&amp;amp;height=761&amp;amp;face=0_0_933_761');&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;안드로이드 스마트 폰 화면 미러링 방법: scrcpy 사용법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안드로이드 스마트 폰 화면을 PC로 미러링 하는 방법을 설명하도록 하겠습니다. 스마트 폰 화면을 그대로 PC에 가져오는 것 뿐만 아니라, 사운드 전송, 마우스로 원격 클릭 및 키보드 입력 값을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kibua20.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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;실행 방법&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;// 실행 command
scrcpy -m 1080&lt;/code&gt;&lt;/pre&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;span&gt;장점&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;*&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;무료 오픈소스로 구성된 프로젝트&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;개발 환경에서 단말기로 확인하는데 번거로움을 줄여주며 미팅이나 발표시 유용합니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;단점&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;*&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;설치와 기능들의 실행을 터미널로 진행해야함&lt;/span&gt;&lt;/span&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;span&gt;&lt;span&gt;## Notion (마크 다운, 메모)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;## 원노트 (마크 다운, 메모)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Android</category>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/44</guid>
      <comments>https://question0.tistory.com/44#entry44comment</comments>
      <pubDate>Wed, 30 Mar 2022 08:45:19 +0900</pubDate>
    </item>
    <item>
      <title>[Android/NDK] 기존 프로젝트에 .so 파일 연결하는 법</title>
      <link>https://question0.tistory.com/42</link>
      <description>&lt;p&gt;&lt;code&gt;.so&lt;/code&gt; 파일은 NDK 의 C/C++ 파일이 컴파일된 파일입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;NDK 를 사용하기 위해서는 그냥 JNI 로 구성된 C/C++ 파일이 있으면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://question0.tistory.com/39&quot;&gt;[Android/NDK] 기존 프로젝트에 NDK 설정하는 방법&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1577407261417&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Android/NDK] 기존 프로젝트에 NDK 설정하는 방법&quot; data-og-description=&quot;NDK 프로젝트를 매번 진행할때마다 설정을 구글에 검색하고 있는 저를 보며 이번 기회에 정리해야겠다 벼루고 있었는데 게을러서 미루기를 수차례 드디어 칼을 뽑아 정리합니다. 기존 프로젝트에 NDK 를 설정하는..&quot; data-og-host=&quot;question0.tistory.com&quot; data-og-source-url=&quot;https://question0.tistory.com/39&quot; data-og-url=&quot;https://question0.tistory.com/39&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/X6a7P/hyEjG1LDnz/25H6SzaY0BdhSt1lFUvIm1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/brs9nM/hyEjyQcZL0/okH9YXBvoyLFVGX5KE4tv0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bq9jNo/hyEhv1TIKi/5vuFOPUcn6ViL4f3kpBDBK/img.png?width=2118&amp;amp;height=1762&amp;amp;face=0_0_2118_1762&quot;&gt;&lt;a href=&quot;https://question0.tistory.com/39&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://question0.tistory.com/39&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/X6a7P/hyEjG1LDnz/25H6SzaY0BdhSt1lFUvIm1/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/brs9nM/hyEjyQcZL0/okH9YXBvoyLFVGX5KE4tv0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bq9jNo/hyEhv1TIKi/5vuFOPUcn6ViL4f3kpBDBK/img.png?width=2118&amp;amp;height=1762&amp;amp;face=0_0_2118_1762');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Android/NDK] 기존 프로젝트에 NDK 설정하는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;NDK 프로젝트를 매번 진행할때마다 설정을 구글에 검색하고 있는 저를 보며 이번 기회에 정리해야겠다 벼루고 있었는데 게을러서 미루기를 수차례 드디어 칼을 뽑아 정리합니다. 기존 프로젝트에 NDK 를 설정하는..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;question0.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 &lt;code&gt;.so&lt;/code&gt; 컴파일된 파일만 있어도&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;C/C++ 로 구성했었던 기능과 동일하게 사용 가능합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;주로 라이브러리 배포시 이런식으로 진행하곤 하죠.&lt;/p&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;설정&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;연결을 하는 Java 클래스를 이전 포스팅에서 사용했던 예제와 동일하게 작성합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;// MainActivity.class
public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary(&quot;native-lib&quot;);
    }

    public native int helloNDK(int v);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        int result = helloNDK(5);

        ((TextView)findViewById(R.id.tvHello)).setText(&quot;result : &quot; + result);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;// activity_main.xml
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    tools:context=&quot;.MainActivity&quot;&amp;gt;

    &amp;lt;TextView
        android:id=&quot;@+id/tvHello&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;
        app:layout_constraintBottom_toBottomOf=&quot;parent&quot;
        app:layout_constraintLeft_toLeftOf=&quot;parent&quot;
        app:layout_constraintRight_toRightOf=&quot;parent&quot;
        app:layout_constraintTop_toTopOf=&quot;parent&quot; /&amp;gt;

&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그리고 &lt;code&gt;.so&lt;/code&gt; 파일을 &lt;code&gt;app/src/main/jniLibs&lt;/code&gt; 폴더에 종류별로 넣어줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 설정 끝입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실행해주면 이전 포스팅에서 예제로 들었던 JNI 프로젝트와 동일하게&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;result: 15&lt;/code&gt; 라는 결과값을 화면상에서 확인할수 있을것입니다.&lt;/p&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이전 포스팅과 차이점은 C/C++ 로 구성된 JNI 로직과 연결하기 위한&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Link 설정&lt;/code&gt;이나 &lt;code&gt;build.gradle(app)&lt;/code&gt; 에 별도 설정이 필요 없고&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;jniLibs&lt;/code&gt; 라는 폴더에 CPU 종류에 따른 폴더구분 후 종류에 맞게&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.so&lt;/code&gt; 파일을 넣어 주기만 하면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-12-27 오전 9.36.36.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;1572&quot; width=&quot;319&quot; height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Flbk9/btqAMkvskux/jG7fySVbKVjhXHRBo9p9kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Flbk9/btqAMkvskux/jG7fySVbKVjhXHRBo9p9kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Flbk9/btqAMkvskux/jG7fySVbKVjhXHRBo9p9kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFlbk9%2FbtqAMkvskux%2FjG7fySVbKVjhXHRBo9p9kk%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-12-27 오전 9.36.36.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;1572&quot; width=&quot;319&quot; height=&quot;628&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Android</category>
      <category>Android</category>
      <category>Java</category>
      <category>ndk</category>
      <category>빌드</category>
      <category>환경설정</category>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/42</guid>
      <comments>https://question0.tistory.com/42#entry42comment</comments>
      <pubDate>Fri, 27 Dec 2019 09:40:43 +0900</pubDate>
    </item>
    <item>
      <title>[NodeJs/React/Error] The engine &amp;quot;node&amp;quot; is incompatible with this module. Expected version</title>
      <link>https://question0.tistory.com/41</link>
      <description>&lt;p&gt;React 프로젝트를 &lt;code&gt;create-react-app&lt;/code&gt; 로 생성하려고 했을때 다음과 같은 오류가 발생했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-12-23 오전 10.36.46.png&quot; data-origin-width=&quot;2196&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCJn8C/btqADIEi4zM/S0d4Vkm4x2l3AgOAGvKIkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCJn8C/btqADIEi4zM/S0d4Vkm4x2l3AgOAGvKIkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCJn8C/btqADIEi4zM/S0d4Vkm4x2l3AgOAGvKIkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCJn8C%2FbtqADIEi4zM%2FS0d4Vkm4x2l3AgOAGvKIkk%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-12-23 오전 10.36.46.png&quot; data-origin-width=&quot;2196&quot; data-origin-height=&quot;648&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;error @typescript-eslint/eslint-plugin@2.10.0: The engine &quot;node&quot; is incompatible with this module. Expected version &quot;^8.10.0 || ^10.13.0 || &amp;gt;=11.10.1&quot;. Got &quot;11.6.0&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오류 메세지를 살펴보니 node 버전이 호환이 안되서 문제인 것 같아 업데이트를 진행 해줬습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://question0.tistory.com/40&quot;&gt;Node.js 업데이트 방법&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1577066905535&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Node.js] 최신버전으로 업데이트 하기&quot; data-og-description=&quot;Node 업데이트 $ sudo npm cache clean -f # 강제캐시삭제 $ sudo npm install -g n # n 모듈 설치 $ sudo n stable # or sudo n 12.14.0 (버전명) $ node -v # 버전 확인 Node 업데이트 오류 bash: /usr/bin/node..&quot; data-og-host=&quot;question0.tistory.com&quot; data-og-source-url=&quot;https://question0.tistory.com/40&quot; data-og-url=&quot;https://question0.tistory.com/40&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhoFZw/hyEdeS8leY/3XVIQA1eaPyNCkNwkuAPJ0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bxHXtR/hyEdn3BFAB/wk6SAnj4QuCAWtJXX66yE0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://question0.tistory.com/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://question0.tistory.com/40&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhoFZw/hyEdeS8leY/3XVIQA1eaPyNCkNwkuAPJ0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bxHXtR/hyEdn3BFAB/wk6SAnj4QuCAWtJXX66yE0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;[Node.js] 최신버전으로 업데이트 하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Node 업데이트 $ sudo npm cache clean -f # 강제캐시삭제 $ sudo npm install -g n # n 모듈 설치 $ sudo n stable # or sudo n 12.14.0 (버전명) $ node -v # 버전 확인 Node 업데이트 오류 bash: /usr/bin/node..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;question0.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;업데이트를 진행 후 다시 시도하면 정상적으로 프로젝트가 생성된 것을 확인할수 있었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2019-12-23 오전 10.37.43.png&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FDl5u/btqADY1b9tG/gx3b12kJLpr1G7J1XiKP4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FDl5u/btqADY1b9tG/gx3b12kJLpr1G7J1XiKP4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FDl5u/btqADY1b9tG/gx3b12kJLpr1G7J1XiKP4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFDl5u%2FbtqADY1b9tG%2Fgx3b12kJLpr1G7J1XiKP4K%2Fimg.png&quot; data-filename=&quot;스크린샷 2019-12-23 오전 10.37.43.png&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;632&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고하세요.&lt;/p&gt;</description>
      <category>NodeJS</category>
      <category>Error</category>
      <category>js</category>
      <category>node</category>
      <category>react</category>
      <category>버전</category>
      <category>해결</category>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/41</guid>
      <comments>https://question0.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 23 Dec 2019 11:08:58 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] 최신버전으로 업데이트 하기</title>
      <link>https://question0.tistory.com/40</link>
      <description>&lt;h2&gt;Node 업데이트&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;$ sudo npm cache clean -f # 강제캐시삭제
$ sudo npm install -g n # n 모듈 설치
$ sudo n stable # or sudo n 12.14.0 (버전명)
$ node -v # 버전 확인&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Node 업데이트 오류&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;bash: /usr/bin/node: No such file or directory&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 오류가 발생하면 다음과 같이 입력해줍니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;$ sudo ln -sf /usr/local/n/versions/node/&amp;lt;Version&amp;gt;/bin/node /usr/bin/node&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;예시&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;$ sudo ln -sf /usr/local/n/versions/node/12.14.0/bin/node /usr/bin/node&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;NPM 업데이트&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;$ sudo npm install -g npm # 업데이트
$ npm -v # 버전 확인&lt;/code&gt;&lt;/pre&gt;</description>
      <category>NodeJS</category>
      <category>node</category>
      <category>npm</category>
      <category>Update</category>
      <category>Upgrade</category>
      <author>Question영</author>
      <guid isPermaLink="true">https://question0.tistory.com/40</guid>
      <comments>https://question0.tistory.com/40#entry40comment</comments>
      <pubDate>Mon, 23 Dec 2019 11:05:55 +0900</pubDate>
    </item>
  </channel>
</rss>