Jekyll2022-05-13T02:57:26+00:00https://tech.zzizily.com/feed.xml어서와! 새로운 기술은 언제나 환영이야~안녕하세요 김석영 입니다.OpenWRT with NordVPN2020-05-17T12:53:00+00:002020-05-17T12:53:00+00:00https://tech.zzizily.com/openwrt/2020/05/17/OpenWrt-with-NordVPN<h1 id="openwrt-with-nordvpn">OpenWRT-with-NordVPN</h1>
<p>VPN 을 PC 에 설치 보다는 Route 에 설치 해서 사용하자</p>
<p><a href="https://support.nordvpn.com/Connectivity/Router/1047411192/OpenWRT-CI-setup-with-NordVPN.htm">OpenWRT CI setup with NordVPN</a> 참조해서 진행하다 안된것이 있어서 별도의 문서로 만들어봄</p>
<h2 id="목차">목차</h2>
<ol>
<li>환경</li>
<li>설치</li>
<li>설정</li>
<li>테스트</li>
</ol>
<h2 id="1-환경">1. 환경</h2>
<ul>
<li>OpenWrt 19.07.2 r10947-65030d81f3</li>
<li>LuCI 를 통한 웹콘솔 접속 SSH 접속</li>
<li>NordVPN 계정 (유료)</li>
</ul>
<h2 id="2-설치">2. 설치</h2>
<p>OpenWRT 에 3개의 모듈을 설치 합니다.<br />
SSH 이용해서 설치 또는 LuCI 이용한 웹설치도 가능</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>opkg update
opkg <span class="nb">install </span>openvpn-openssl
opkg <span class="nb">install </span>ip-full
opkg <span class="nb">install </span>luci-app-openvpn
</code></pre></div></div>
<h2 id="3-설정">3. 설정</h2>
<p>NordVPN 접속을 원하는 국가의 openvpn 설정 파일을 받기</p>
<h3 id="31-국가-선택">3.1 국가 선택</h3>
<p><img src="/img/2020-05-17-001.png" alt="VPN 국가" />
<a href="https://nordvpn.com/ko/servers/tools">VPN 서버</a> 이동 하여 접속을 원하는 국가로 선택 하여서 <strong>Show available protocols</strong> 클릭 하면 상세 정보 출력 한다.<br />
서버는 <strong>us5287</strong> 랜덤 하게 발생 TCP (UDP 로도 가능) 설정 파일을 받아 준다.</p>
<h3 id="32-openvpn-설정-파일-업로드">3.2 OpenVPN 설정 파일 업로드</h3>
<p><img src="/img/2020-05-17-002.png" alt="OpenVPN 설정 파일 업로드" />
LuCI 로 접속 해서 상단 메뉴>VPN>OpenVPN 으로 이동 한다.
<strong>Instance name</strong> 에는 us5287 입력 해준다.<br />
<strong>OVPN config file upload</strong> 에 <strong>파일 선택</strong> 으로 다운로드 받은 파일을 선택 후 Upload 한다.</p>
<h3 id="33-openvpn-설정-파일-변경">3.3 OpenVPN 설정 파일 변경</h3>
<p><img src="/img/2020-05-17-003.png" alt="OpenVPN 설정" />
OpenVPN instances 에서 us5287 의 <strong>EDIT</strong> 선택</p>
<p><img src="/img/2020-05-17-004.png" alt="NordVPN 계정정보 설정" />
위쪽 text 영역 (us5287.ovpn) 기존 auth-user-pass 만 있는 문자열에 us5287.auth 추가<br />
openvpn 로그 보고 싶으면 log-append openvpn.log 추가</p>
<pre><code class="language-txt">auth-user-pass us5287.auth
log-append openvpn.log
</code></pre>
<p>아래쪽 text 영역 (us5287.auth) NordVPN 계정정보를 입력 첫번째 줄은 메일주소(아이디)<br />
두번째 줄은 비밀번호</p>
<pre><code class="language-txt">NordVPN-id
NordVPN-password
</code></pre>
<h3 id="34-network-interface-추가">3.4 Network Interface 추가</h3>
<h4 id="341-uci-이용한-방법">3.4.1 uci 이용한 방법</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>uci <span class="nb">set </span>network.nordvpntun<span class="o">=</span>interface
uci <span class="nb">set </span>network.nordvpntun.proto<span class="o">=</span><span class="s1">'none'</span>
uci <span class="nb">set </span>network.nordvpntun.ifname<span class="o">=</span><span class="s1">'tun0'</span>
uci commit network
</code></pre></div></div>
<h4 id="342-설정-파일-직접-수정">3.4.2 설정 파일 직접 수정</h4>
<p>vi /etc/config/network</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>config interface <span class="s1">'nordvpntun'</span>
option proto <span class="s1">'none'</span>
option ifname <span class="s1">'tun0'</span>
</code></pre></div></div>
<h3 id="35-firewall-추가">3.5 Firewall 추가</h3>
<h4 id="351-uci-이용한-방법">3.5.1 uci 이용한 방법</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>uci add firewall zone
uci <span class="nb">set </span>firewall.@zone[-1].name<span class="o">=</span><span class="s1">'vpnfirewall'</span>
uci <span class="nb">set </span>firewall.@zone[-1].input<span class="o">=</span><span class="s1">'REJECT'</span>
uci <span class="nb">set </span>firewall.@zone[-1].output<span class="o">=</span><span class="s1">'ACCEPT'</span>
uci <span class="nb">set </span>firewall.@zone[-1].forward<span class="o">=</span><span class="s1">'REJECT'</span>
uci <span class="nb">set </span>firewall.@zone[-1].masq<span class="o">=</span><span class="s1">'1'</span>
uci <span class="nb">set </span>firewall.@zone[-1].mtu_fix<span class="o">=</span><span class="s1">'1'</span>
uci add_list firewall.@zone[-1].network<span class="o">=</span><span class="s1">'nordvpntun'</span>
uci add firewall forwarding
uci <span class="nb">set </span>firewall.@forwarding[-1].src<span class="o">=</span><span class="s1">'lan'</span>
uci <span class="nb">set </span>firewall.@forwarding[-1].dest<span class="o">=</span><span class="s1">'vpnfirewall'</span>
uci commit firewall
</code></pre></div></div>
<h4 id="352-설정-파일-직접-수정">3.5.2 설정 파일 직접 수정</h4>
<p>vi /etc/config/firewall</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>config zone
option name <span class="s1">'vpnfirewall'</span>
option input <span class="s1">'REJECT'</span>
option output <span class="s1">'ACCEPT'</span>
option forward <span class="s1">'REJECT'</span>
option masq <span class="s1">'1'</span>
option mtu_fix <span class="s1">'1'</span>
list network <span class="s1">'nordvpntun'</span>
config forwarding
option src <span class="s1">'lan'</span>
option dest <span class="s1">'vpnfirewall'</span>
</code></pre></div></div>
<h3 id="36-서비스-또는-openwrt-재시작">3.6 서비스 또는 OpenWRT 재시작</h3>
<h4 id="361-서비스-재시작">3.6.1 서비스 재시작</h4>
<p>firewall, openvpn, netwrok 설정을 변경을 하였으니 3개 서비스 재시작 필요함
<strong>network 를 재시작 하면 SSH 연결 이 분리됨</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/etc/init.d/firewall restart
/etc/init.d/openvpn restart
/etc/init.d/network restart
</code></pre></div></div>
<h4 id="362-openwrt-재시작">3.6.2 OpenWRT 재시작</h4>
<p>이것 저것 하기 귀찬으면 시스템 재시작
LuCI 로 접속 해서 상단 메뉴>System>Reboot
<strong>Perform reboot</strong></p>
<h2 id="4-테스트">4. 테스트</h2>
<h3 id="41-openvpn-동작-확인">4.1 OpenVPN 동작 확인</h3>
<p><img src="/img/2020-05-17-006.png" alt="OpenVPN Enabled 설정" />
us5287 Enabled check 하고 <strong>Save & Apply</strong></p>
<p><img src="/img/2020-05-17-007.png" alt="OpenVPN 동작 확인" />
Enabled checked 상태에서 만 실행이 가능</p>
<h3 id="42-nordvpn-접속-확인">4.2 NordVPN 접속 확인</h3>
<p><img src="/img/2020-05-17-005.png" alt="NordVPN 접속 확인" />
<a href="https://nordvpn.com/ko/servers">NordVPN 홈페이지</a> 접속을 해서 상단 녹색 문자열로 보호됨</p>OpenWRT-with-NordVPNHow To Connection Onpremise And Aws2019-08-30T00:00:00+00:002019-08-30T00:00:00+00:00https://tech.zzizily.com/2019/08/30/how-to-connection-onpremise-and-aws<p>회사 네트워크에서 AWS 연결을 위한 방법</p>
<ul>
<li>AWS VPN Gateway 사용하세요 꼭이요…</li>
<li>안돼(이병헌 헉 안돼)</li>
<li>우린 답을 찾을것이다 늘그랬듯이(인터스텔라 포스터)</li>
</ul>회사 네트워크에서 AWS 연결을 위한 방법 AWS VPN Gateway 사용하세요 꼭이요… 안돼(이병헌 헉 안돼) 우린 답을 찾을것이다 늘그랬듯이(인터스텔라 포스터)Mount2019-07-07T00:00:00+00:002019-07-07T00:00:00+00:00https://tech.zzizily.com/2019/07/07/mount<h1 id="mount">mount</h1>
<p>폴더에 disk 를 mount 시키자!</p>
<p>debian 에서는 mount 할때 /etc/fstab 에 파일이 정의가 안되 있다고 경고를 하네 오오오 역시..<br />
centos 에서는 mount 시도 하면 /etc/fstab 확인 없이 그냥 바로 mount 가 되고…</p>
<h2 id="command">command</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>mount <span class="nt">-t</span> ext4 /dev/sdb5 /home/crom/disk1/
<span class="nv">$ </span>mount <span class="nt">-t</span> ext4 /dev/sdc5 /home/crom/disk2/
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>vi /etc/fstab
<span class="c"># /etc/fstab: static file system information.</span>
<span class="c">#</span>
<span class="c"># Use 'blkid' to print the universally unique identifier for a</span>
<span class="c"># device; this may be used with UUID= as a more robust way to name devices</span>
<span class="c"># that works even if disks are added and removed. See fstab(5).</span>
<span class="c">#</span>
<span class="c"># <file system> <mount point> <type> <options> <dump> <pass></span>
/dev/mapper/gaia--vg-root / ext4 <span class="nv">errors</span><span class="o">=</span>remount-ro 0 1
<span class="c"># /boot was on /dev/sda1 during installation</span>
<span class="nv">UUID</span><span class="o">=</span>19d9af70-ca03-4687-b9a4-55dbbf1858e5 /boot ext2 defaults 0 2
/dev/mapper/gaia--vg-swap_1 none swap sw 0 0
/dev/sdb5 /home/crom/disk1 ext4 defaults 0 2
/dev/sdc5 /home/crom/disk2 ext4 defaults 0 2
</code></pre></div></div>
<h3 id="file-system">file system</h3>
<p>디바이스 이름</p>
<h3 id="mount-point">mount point</h3>
<p>보통 폴더명은 swap 일경우는 none 또는 swap</p>
<h3 id="type">type</h3>
<ul>
<li>ext: 초기 리눅스에서 사용되었던 fs-type으로 현재 사용하지 않는다.</li>
<li>ext2: 현재도 사용되고 있는 fs-type으로서 긴 파일명을 지원하는것이 특징이다.</li>
<li>ext3: 저널링파일시스템으로서 ext2에 비해 파일시스템 복구기능과 보안부분을 크게 향상시킨것이다.</li>
<li>ext4: ext3다음버전의 리눅스표준 파일시스템으로 16TB까지만 지원하던 ext3타입보다 훨씬 큰 용량까지 지원하며, 삭제파일복구 기능 및 파일시스템 점검속도가 크게 빨라진 파일시스템이다.</li>
<li>iso9660: DVD또는 CD-ROM의 데이터를 읽고자 할때에 마운트시 사용하는 fs-type으로 Read-Only에 사용된다.</li>
<li>nfs: Network File System으로 원격서버를 마운트할때 사용하며 분산시스템 구현에 사용된다.</li>
<li>swap: swap메모리를 사용하는 파일시스템에서 사용한다.</li>
<li>ufs: Unix File System으로 UNIX SYSTEM 5계열에서의 fs-tyep이다.</li>
<li>vfat: 윈도우95, 윈도우98, 그리고 NT를 지원하기 위한 fs-type</li>
<li>msdos: MS-DOS파티션을 사용하기 위한 fs-type</li>
<li>ntfs: 윈도우NT나 2000의 NTFS파일시스템을 사용하기 위한 fs-type</li>
<li>hfs: Mac컴퓨터의 hfs파일시스템을 지원하기 위한 fs-type</li>
<li>ramdisk: RAM디스크를 지원하는 fs-type</li>
</ul>
<h3 id="options">options</h3>
<ul>
<li>defaults: rw,nouser,auto,exec,suid 속성을 모두 가지는 속성으로서, 일반적인 파일시스템에서 사용되는 속성</li>
<li>auto: 부팅시 자동마운트됨</li>
<li>noauto: 부팅시 자동마운트되지 않게함.</li>
<li>exec: 실행파일이 실행되는것을 허용함.</li>
<li>noexec: 실행파일을 실행되지 못하게 함.</li>
<li>suid: SetUID와 SetGID의 사용을 허용함.</li>
<li>nosuid: SetUID와 SetGID의 사용을 허용하지 않음.</li>
<li>ro: 읽기전용으로 마운트.</li>
<li>rw: 읽기,쓰기 모두 가능하도록 마운트.</li>
<li>user: 일반 계정사용자들도 마운트할수 있음.</li>
<li>nouser: 일반 계정사용자들은 마운트할수 없음(root계정만 mount가능).</li>
<li>usrquota: 개별 계정사용자의 Quota설정이 가능하도록 함.</li>
<li>grpquota: 그룹별 Quota설정이 가능하도록 함.</li>
</ul>
<h3 id="dump">dump</h3>
<h3 id="pass">pass</h3>
<h2 id="참조">참조</h2>
<ul>
<li><a href="http://blog.naver.com/PostView.nhn?blogId=dudwo567890&logNo=1301564499830">Linux, 파일시스템테이블(/etc/fstab)</a></li>
<li><a href="https://jikime.tistory.com/448">/etc/fstab 해부하기 - 하드디스크 마운트 관리</a></li>
</ul>mount 폴더에 disk 를 mount 시키자!Docker Login Error2019-07-06T00:00:00+00:002019-07-06T00:00:00+00:00https://tech.zzizily.com/2019/07/06/docker-login-error<h1 id="docker-login-error">Docker Login Error</h1>
<blockquote>
<p>** Message: 19:10:47.099: Remote error from secret service: org.freedesktop.DBus.Error.UnknownMethod: ?? /org/freedesktop/secrets/collection/login? ??? ‘org.freedesktop.Secret.Collection’ ?????? ????
Error saving credentials: error storing credentials - err: exit status 1, out: <code class="language-plaintext highlighter-rouge">경로 /org/freedesktop/secrets/collection/login의 객체에 'org.freedesktop.Secret.Collection' 인터페이스가 없습니다</code></p>
</blockquote>
<h2 id="발생">발생</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="si">$(</span>aws ecr get-login <span class="nt">--no-include-email</span> <span class="nt">--region</span> ap-northeast-2<span class="si">)</span>
WARNING! Using <span class="nt">--password</span> via the CLI is insecure. Use <span class="nt">--password-stdin</span><span class="nb">.</span>
<span class="k">**</span> Message: 19:10:47.099: Remote error from secret service: org.freedesktop.DBus.Error.UnknownMethod: ?? /org/freedesktop/secrets/collection/login? ??? <span class="s1">'org.freedesktop.Secret.Collection'</span> ?????? ????
Error saving credentials: error storing credentials - err: <span class="nb">exit </span>status 1, out: <span class="sb">`</span>경로 /org/freedesktop/secrets/collection/login의 객체에 <span class="s1">'org.freedesktop.Secret.Collection'</span> 인터페이스가 없습니다<span class="sb">`</span>
<span class="nv">$ </span><span class="nb">sudo </span>apt <span class="nb">install </span>gnupg2 pass
<span class="o">[</span><span class="nb">sudo</span><span class="o">]</span> crom의 암호:
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다
상태 정보를 읽는 중입니다... 완료
다음의 추가 패키지가 설치될 것입니다 :
libqrencode3 qrencode tree xclip
제안하는 패키지:
ruby
다음 새 패키지를 설치할 것입니다:
gnupg2 libqrencode3 pass qrencode tree xclip
0개 업그레이드, 6개 새로 설치, 0개 제거 및 10개 업그레이드 안 함.
144 k바이트 아카이브를 받아야 합니다.
이 작업 후 487 k바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까? <span class="o">[</span>Y/n] y
<span class="nv">$ </span><span class="si">$(</span>aws ecr get-login <span class="nt">--no-include-email</span> <span class="nt">--region</span> ap-northeast-2<span class="si">)</span>
WARNING! Using <span class="nt">--password</span> via the CLI is insecure. Use <span class="nt">--password-stdin</span><span class="nb">.</span>
WARNING! Your password will be stored unencrypted <span class="k">in</span> /home/trms/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
</code></pre></div></div>
<h2 id="참조">참조</h2>
<ul>
<li>https://github.com/docker/docker-credential-helpers/issues/60</li>
</ul>Docker Login ErrorDocker Jenkins Https2019-06-28T00:00:00+00:002019-06-28T00:00:00+00:00https://tech.zzizily.com/2019/06/28/docker-jenkins-https<p>https://github.com/jenkinsci/docker/issues/493
https://wiki.jenkins.io/display/JENKINS/Starting+and+Accessing+Jenkins</p>https://github.com/jenkinsci/docker/issues/493 https://wiki.jenkins.io/display/JENKINS/Starting+and+Accessing+JenkinsDeveloping a micro-service in a local environment2019-04-15T23:29:00+00:002019-04-15T23:29:00+00:00https://tech.zzizily.com/msa/2019/04/15/developing-a-micro-service-in-a-local-environment<h1 id="developing-a-micro-service-in-a-local-environment">Developing a micro-service in a local environment</h1>
<p>micro-service 를 local 환경에서 개발하기 하기 위해서는 기존 monolithic 과는 많이 다르다.<br />
<strong>운영 환경 과 동일한 환경으로 local 에서 개발을 하기 위해서는 어떻게 해야 할까?</strong></p>
<p>Spring Cloud, Netflix OSS 를 활용 한다면 4개의 어플리케이션이 필수 요소 이다.</p>
<ul>
<li>Discovery (Eureka)</li>
<li>API Gateway (Spring Cloud Gateway)</li>
<li>API (api-skeleton)</li>
<li>Client (client-skeleton)</li>
</ul>
<p>Client 만 개발시에는 API 가 필요 하지 않기 때문에 dev 환경에 API 가 동작 한다는 전제를 한다.<br />
환경은 2 가지만 생각을 해보자</p>
<ul>
<li>local</li>
<li>dev</li>
</ul>
<p>현재 4 가지 상황이 있고 더 추가 될수 있다.</p>
<h2 id="목차">목차</h2>
<ul>
<li>Client (홈페이지)</li>
<li>API (기능)</li>
<li>API & API</li>
<li>Client & API</li>
</ul>
<h2 id="clinet-홈페이지">Clinet (홈페이지)</h2>
<p>Client 만 개발 한다.<br />
dev 환경의 API Gateway 통해서 가지고 오면 된다.<br />
<strong>독립</strong>적으로 개발이 가능 하다.<br />
Client 모듈만 필요</p>
<h2 id="api-기능">API (기능)</h2>
<p>API 만 개발 한다.<br />
API 에는 개발을 위한 소스가 있다.<br />
<strong>독립</strong>적으로 개발이 가능 하다.
API 모듈만 필요</p>
<h2 id="api--api">API & API</h2>
<p>API A 와 API B 를 같이 개발 한다.<br />
A 와 B 는 서로 간에 Discovery 가 필요하기 때문에 Eureka 사용이 필요하다.<br />
API A, API B, Eureka 3가지 모듈 필요</p>
<h2 id="client--api">Client & API</h2>
<p>Client 와 API 둘다 개발 한다.<br />
외부에 있는 Client 가 내부에 있는 API 통해야 해서 Gateway 가 필요하다.
Client, API, Gateway 3가지 모듈 필요</p>Developing a micro-service in a local environment micro-service 를 local 환경에서 개발하기 하기 위해서는 기존 monolithic 과는 많이 다르다. 운영 환경 과 동일한 환경으로 local 에서 개발을 하기 위해서는 어떻게 해야 할까?Download all images of a website using wget2019-02-10T18:29:00+00:002019-02-10T18:29:00+00:00https://tech.zzizily.com/java/8/functional/interface/2019/02/10/download-all-images-of-a-website-using-wget<h1 id="download-all-images-of-a-website-using-wget">Download all images of a website using wget</h1>
<p>특정 웹사이트의 모든 이미지를 다운로드 받기</p>
<h2 id="1-목차">1. 목차</h2>
<ol>
<li>방법
<ol>
<li>chrome Image Downloader</li>
<li>flashget</li>
<li>httrack</li>
<li>wget or curl</li>
</ol>
</li>
<li>참조</li>
</ol>
<h2 id="2-방법">2. 방법</h2>
<h3 id="21-image-downloader">2.1. <a href="https://chrome.google.com/webstore/detail/image-downloader/cnpniohnfphhjihaiiggeabnkjhpaldj">Image Downloader</a></h3>
<p>제일 만만한 방법이지만 웹페이지만 가능 해서 포기</p>
<h3 id="22-flashget">2.2. <a href="http://www.flashget.com/index_en.html">flashget</a></h3>
<p>어플을 설치해야 해서 포기</p>
<h3 id="23-httrack">2.3. <a href="https://www.httrack.com/">httrack</a></h3>
<p>어플 설치및 웹사이트 가 아닌 이미지만 받는게 목적이라서 포기</p>
<h3 id="24-wget-or-curl">2.4. wget or curl</h3>
<p>이게 될까 하고 잠깐 검색 하고 테스트 해바는됭 된다<br />
아 역시 대단하 1줄만 모든 이미지 다운 받기 성공</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget <span class="nt">-nd</span> <span class="nt">-r</span> <span class="nt">-P</span> /save/location <span class="nt">-A</span> jpeg,jpg,bmp,gif,png http://www.imge.com
</code></pre></div></div>
<p><a href="https://explainshell.com/explain?cmd=wget+-nd+-r+-P+%2Fsave%2Flocation+-A+jpeg%2Cjpg%2Cbmp%2Cgif%2Cpng+http%3A%2F%2Fandar.co.kr">explainshell.com</a></p>
<h2 id="3-참조">3. 참조</h2>
<p><a href="https://explainshell.com/explain?cmd=wget+-nd+-r+-P+%2Fsave%2Flocation+-A+jpeg%2Cjpg%2Cbmp%2Cgif%2Cpng+http%3A%2F%2Fandar.co.kr">How do I use Wget to download all images into a single folder, from a URL?</a>
<a href="https://github.com/eduardschaeli/wget-image-scraper">wget-image-scraper</a></p>Download all images of a website using wgetJava 8 functional interface2019-02-10T18:29:00+00:002019-02-10T18:29:00+00:00https://tech.zzizily.com/java/2019/02/10/java-functional-interface<h1 id="java-funcional-interface">Java Funcional Interface</h1>
<p>Java Lamda 가 지원 이후로 많이 생겨난 Functioanl Interface 확실히 몰라서 이번에 정리<br />
외우는것이 육체 건강에 좋음</p>
<h2 id="1-목차">1. 목차</h2>
<ol>
<li>테스트 예제</li>
<li>참조</li>
</ol>
<h2 id="2-example">2. Example</h2>
<h3 id="21-runnable-리턴-없음-인자-없음">2.1 Runnable 리턴 없음 인자 없음</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_X_인자_X</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">Runnable</span> <span class="n">runnable</span> <span class="o">=</span> <span class="o">()</span> <span class="o">-></span> <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Runnable"</span><span class="o">);</span>
<span class="n">runnable</span><span class="o">.</span><span class="na">run</span><span class="o">();</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="22-supplier-리턴-1개-인자-없음">2.2 Supplier 리턴 1개 인자 없음</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_1_인자_X</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">Supplier</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">supplier</span> <span class="o">=</span> <span class="o">()</span> <span class="o">-></span> <span class="s">"Supplier"</span><span class="o">;</span>
<span class="n">assertThat</span><span class="o">(</span><span class="n">supplier</span><span class="o">.</span><span class="na">get</span><span class="o">())</span>
<span class="o">.</span><span class="na">isEqualTo</span><span class="o">(</span><span class="s">"Supplier"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="23-consumer-리턴-없음-인자-1개">2.3 Consumer 리턴 없음 인자 1개</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_X_인자_1</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">Consumer</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">consumer</span> <span class="o">=</span> <span class="n">str</span> <span class="o">-></span> <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">str</span><span class="o">);</span>
<span class="n">consumer</span><span class="o">.</span><span class="na">accept</span><span class="o">(</span><span class="s">"consumer"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="24-function-리턴-1개-인자-1개">2.4 Function 리턴 1개 인자 1개</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_1_인자_1</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">//Function<String(parameter), Integer(return)></span>
<span class="nc">Function</span><span class="o"><</span><span class="nc">String</span><span class="o">,</span> <span class="nc">Integer</span><span class="o">></span> <span class="n">function</span> <span class="o">=</span> <span class="n">str</span> <span class="o">-></span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">str</span><span class="o">);</span>
<span class="n">assertThat</span><span class="o">(</span><span class="n">function</span><span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="s">"1"</span><span class="o">))</span>
<span class="o">.</span><span class="na">isEqualTo</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="25-predicate-리턴-boolean-인자-1개">2.5 Predicate 리턴 Boolean 인자 1개</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_Boolean_인자_1</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">Predicate</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">predicate</span> <span class="o">=</span> <span class="n">str</span> <span class="o">-></span> <span class="n">str</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">();</span>
<span class="n">assertThat</span><span class="o">(</span><span class="n">predicate</span><span class="o">.</span><span class="na">test</span><span class="o">(</span><span class="s">"HELLO"</span><span class="o">))</span>
<span class="o">.</span><span class="na">isEqualTo</span><span class="o">(</span><span class="kc">false</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="26-unaryoperator-리턴-1개-인자-1개-리턴-과-인자-같은-타입">2.6 UnaryOperator 리턴 1개 인자 1개 리턴 과 인자 같은 타입</h3>
<p>Generic 때 많이 사용함</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_1_인자_1_리턴_과_인자_같은_타입</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">UnaryOperator</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">unaryOperator</span> <span class="o">=</span> <span class="n">str</span> <span class="o">-></span> <span class="n">str</span> <span class="o">+=</span> <span class="s">" WORLD"</span><span class="o">;</span>
<span class="n">assertThat</span><span class="o">(</span><span class="n">unaryOperator</span><span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="s">"HELLO"</span><span class="o">))</span>
<span class="o">.</span><span class="na">isEqualTo</span><span class="o">(</span><span class="s">"HELLO WORLD"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="27-binaryoperator-리턴-1개-인자-2개-리턴-과-인자-같은-타입">2.7 BinaryOperator 리턴 1개 인자 2개 리턴 과 인자 같은 타입</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_1_인자_2_리턴_과_인자_같은_타입</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">BinaryOperator</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">binaryOperator</span> <span class="o">=</span> <span class="o">(</span><span class="n">str1</span><span class="o">,</span> <span class="n">str2</span><span class="o">)</span> <span class="o">-></span> <span class="n">str1</span> <span class="o">+</span> <span class="n">str2</span><span class="o">;</span>
<span class="n">assertThat</span><span class="o">(</span><span class="n">binaryOperator</span><span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="s">"HELLO"</span><span class="o">,</span> <span class="s">"WORLD"</span><span class="o">)).</span><span class="na">isEqualTo</span><span class="o">(</span><span class="s">"HELLOWORLD"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="28-bipredicate-리턴-boolean-인자-2개">2.8 BiPredicate 리턴 Boolean 인자 2개</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_Boolean_인자_2</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">// BiFunction<String(parmeter1), Integer(parmeter2)></span>
<span class="nc">BiPredicate</span><span class="o"><</span><span class="nc">String</span><span class="o">,</span> <span class="nc">Integer</span><span class="o">></span> <span class="n">biPredicate</span> <span class="o">=</span> <span class="o">(</span><span class="n">str</span><span class="o">,</span> <span class="n">num</span><span class="o">)</span> <span class="o">-></span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">str</span><span class="o">)</span> <span class="o">></span> <span class="n">num</span><span class="o">;</span>
<span class="n">assertThat</span><span class="o">(</span><span class="n">biPredicate</span><span class="o">.</span><span class="na">test</span><span class="o">(</span><span class="s">"5"</span><span class="o">,</span> <span class="mi">2</span><span class="o">)).</span><span class="na">isTrue</span><span class="o">();</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="29-biconsumer-리턴-없음-인자-2개">2.9 BiConsumer 리턴 없음 인자 2개</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_X_인자_2</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">BiConsumer</span><span class="o"><</span><span class="nc">String</span><span class="o">,</span> <span class="nc">Integer</span><span class="o">></span> <span class="n">biConsumer</span> <span class="o">=</span> <span class="o">(</span><span class="n">str</span><span class="o">,</span> <span class="n">num</span><span class="o">)</span> <span class="o">-></span> <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">str</span><span class="o">)</span> <span class="o">+</span> <span class="n">num</span><span class="o">);</span>
<span class="n">biConsumer</span><span class="o">.</span><span class="na">accept</span><span class="o">(</span><span class="s">"5"</span><span class="o">,</span> <span class="mi">2</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="210-bifunction-리턴-1개-인자-2개">2.10 BiFunction 리턴 1개 인자 2개</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_1_인자_2</span><span class="o">()</span> <span class="o">{</span>
<span class="c1">// BiFunction<String(parmeter1), String(parmeter2), Integer(return)></span>
<span class="nc">BiFunction</span><span class="o"><</span><span class="nc">String</span><span class="o">,</span> <span class="nc">String</span><span class="o">,</span> <span class="nc">Integer</span><span class="o">></span> <span class="n">biFunction</span> <span class="o">=</span> <span class="o">(</span><span class="n">str1</span><span class="o">,</span> <span class="n">str2</span><span class="o">)</span> <span class="o">-></span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">str1</span><span class="o">)</span> <span class="o">+</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">str2</span><span class="o">);</span>
<span class="n">assertThat</span><span class="o">(</span><span class="n">biFunction</span><span class="o">.</span><span class="na">apply</span><span class="o">(</span><span class="s">"2"</span><span class="o">,</span> <span class="s">"3"</span><span class="o">)).</span><span class="na">isEqualTo</span><span class="o">(</span><span class="mi">5</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="211-comparator-리턴-1개-인자-2개">2.11 Comparator 리턴 1개 인자 2개</h3>
<p>기존 정렬 할때 Comparable 많이 사용 하였지만 Lamda 이후에는 Comparator 더 많이 쓰임</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="n">리턴_int_인자_2_Comparator</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">Comparator</span><span class="o"><</span><span class="nc">Integer</span><span class="o">></span> <span class="n">comparator</span> <span class="o">=</span> <span class="o">(</span><span class="n">num1</span><span class="o">,</span> <span class="n">num2</span><span class="o">)</span> <span class="o">-></span> <span class="n">num1</span><span class="o">.</span><span class="na">compareTo</span><span class="o">(</span><span class="n">num2</span><span class="o">);</span>
<span class="n">assertThat</span><span class="o">(</span><span class="n">comparator</span><span class="o">.</span><span class="na">compare</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span> <span class="mi">1</span><span class="o">)).</span><span class="na">isEqualTo</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>
<h2 id="3-참조">3. 참조</h2>
<p><a href="https://multifrontgarden.tistory.com/125">Java8#02. 함수형 인터페이스(Functional Interface)</a></p>Java Funcional InterfaceMaven Plugin Task List Check2019-01-31T09:24:00+00:002019-01-31T09:24:00+00:00https://tech.zzizily.com/maven/plugin/2019/01/31/maven-plugin-goal-list-check<h1 id="maven-plugin-task-list-check">Maven Plugin Task List Check</h1>
<p>Maven 의 사용 중인 Plugin 들에 대한 Task (Goal) 확인 하기</p>
<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mvn help:describe -Dplugin=org.apache.maven.plugins:maven-war-plugin -Ddetail=true
</code></pre></div></div>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://maven.apache.org/plugins-archives/maven-help-plugin-LATEST/examples/describe-configuration.html">Configuring Describe Goal</a></li>
<li><a href="https://www.baeldung.com/maven-goals-phases">Why are my contributions not showing up on my profile?</a></li>
</ul>Maven Plugin Task List CheckWhy are my contributions not showing up on my profile?2019-01-29T11:44:00+00:002019-01-29T11:44:00+00:00https://tech.zzizily.com/github/profile/2019/01/29/Why-are-my-contributions-not-showing-up-on-my-profile<h1 id="github-에-commit-을-해도-기록이-안남는다">github 에 commit 을 해도 기록이 안남는다</h1>
<p>언제 부터지는 모르겠지만 github profile 에 commit 기록이 안남는다 뭐징?<br />
github 에서 직접 수정 할때는 기록이 잘남고 집에서는 기록이 안남는다 뭐징?<br />
이상하다고 만 생각 하고 그러려니 하다가 문듯 검색을 해보니깐</p>
<p>github 계정 email 주소와 git config –globa user.email 이정보가 달라서 안나옴</p>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://help.github.com/articles/why-are-my-contributions-not-showing-up-on-my-profile/">Why are my contributions not showing up on my profile?</a></li>
</ul>github 에 commit 을 해도 기록이 안남는다