Download

기본 설정

  • 기본적인 터미널 사용과 동일함
  • 단축키 별도로 확인 필요
  • 설정 파일 위치
    • %USER%\AppData\Local\Packages\Microsoft.WindowsTerminal_~~(임의문자인듯)\LocalState\settings.json

SSH 용 프로필 추가 방법

  • 설정 파일 내의 profiles 항목에 추가
  • 폰트가 깨질 경우 기본 폰트를 변경 (D2Coding 등으로)
    • 윈도우에 설치된 폰트여야 하는듯
  • commandline 으로 ssh 실행 추가
  • 추가한 개별 프로필 탭에 아이콘을 표시하고 싶은 경우 `icon` 옵션 추가
  • 참고 : https://gist.github.com/jmyoon4488/a5dab4a0c460d5824da10540c6f6686b
"profiles":
{
  "defaults":
  {
    // Put settings here that you want to apply to all profiles.
    // zsh 사용중 또는 한글이 깨질경우 폰트 변경
    "fontFace": "D2Coding"
  },
  "list":
  [
    {
      // Make changes here to the powershell.exe profile.
      "guid": "{RANDOM-UNIQUE-GUID}",
      "name": "Windows PowerShell",
      "commandline": "powershell.exe",
      "hidden": false
    },
    {
      // Make changes here to the cmd.exe profile.
      "guid": "{RANDOM-UNIQUE-GUID}",
      "name": "명령 프롬프트",
      "commandline": "cmd.exe",
      "hidden": false
    },
    ......
    {
      "guid": "{RANDOM-UNIQUE-GUID}",
      "hidden": false,
      "name": "for SSH",
      "icon": "{local image path or image url}",
      "commandline": "wsl ssh user@example.com"
    }
  ]
}

 

(지속적으로 추가 예정)

[OPEN SOURCE]

1. Captura

2. HyperLedger Fabric

3. cmder

4. DBeaver Community Edition

  • https://dbeaver.io/
  • 멀티 플랫폼 DB 접속 툴
  • 커뮤니티 버전만 무료
  • Free and Open Source (Apache 2.0)

5. Windows Terminal

 

 

 

 

'Programming > Open Source' 카테고리의 다른 글

Windows Terminal SSH용 프로필 추가  (0) 2020.05.24

Default Method 란

  • Interface 안에서 method 를 구현해놓아 상속받는 클래스에서 해당 method 를 따로 override 하지 않아도 된다.
  • 해당 Interface 를 상속받는 여러 클래스에서는 동일하게 동작하는 method 지만 하나의 클래스에서만 다르게 동작해야 할 경우
    Interface 내에서 default method 로 구현 후 다르게 동작할 클래스에서 override 하여 구현하면 된다.

JDK 내 예시

  • Collection.java (Interface)

      /**
       * Removes all of the elements of this collection that satisfy the given
       * predicate.  Errors or runtime exceptions thrown during iteration or by
       * the predicate are relayed to the caller.
       *
       * @implSpec
       * The default implementation traverses all elements of the collection using
       * its {@link #iterator}.  Each matching element is removed using
       * {@link Iterator#remove()}.  If the collection's iterator does not
       * support removal then an {@code UnsupportedOperationException} will be
       * thrown on the first matching element.
       *
       * @param filter a predicate which returns {@code true} for elements to be
       *        removed
       * @return {@code true} if any elements were removed
       * @throws NullPointerException if the specified filter is null
       * @throws UnsupportedOperationException if elements cannot be removed
       *         from this collection.  Implementations may throw this exception if a
       *         matching element cannot be removed or if, in general, removal is not
       *         supported.
       * @since 1.8
       */
      default boolean removeIf(Predicate<? super E> filter) {
          Objects.requireNonNull(filter);
          boolean removed = false;
          final Iterator<E> each = iterator();
          while (each.hasNext()) {
              if (filter.test(each.next())) {
                  each.remove();
                  removed = true;
              }
          }
          return removed;
      }
    
      /**
       * Creates a {@link Spliterator} over the elements in this collection.
       *
       * Implementations should document characteristic values reported by the
       * spliterator.  Such characteristic values are not required to be reported
       * if the spliterator reports {@link Spliterator#SIZED} and this collection
       * contains no elements.
       *
       * <p>The default implementation should be overridden by subclasses that
       * can return a more efficient spliterator.  In order to
       * preserve expected laziness behavior for the {@link #stream()} and
       * {@link #parallelStream()}} methods, spliterators should either have the
       * characteristic of {@code IMMUTABLE} or {@code CONCURRENT}, or be
       * <em><a href="Spliterator.html#binding">late-binding</a></em>.
       * If none of these is practical, the overriding class should describe the
       * spliterator's documented policy of binding and structural interference,
       * and should override the {@link #stream()} and {@link #parallelStream()}
       * methods to create streams using a {@code Supplier} of the spliterator,
       * as in:
       * <pre>{@code
       *     Stream<E> s = StreamSupport.stream(() -> spliterator(), spliteratorCharacteristics)
       * }</pre>
       * <p>These requirements ensure that streams produced by the
       * {@link #stream()} and {@link #parallelStream()} methods will reflect the
       * contents of the collection as of initiation of the terminal stream
       * operation.
       *
       * @implSpec
       * The default implementation creates a
       * <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
       * from the collections's {@code Iterator}.  The spliterator inherits the
       * <em>fail-fast</em> properties of the collection's iterator.
       * <p>
       * The created {@code Spliterator} reports {@link Spliterator#SIZED}.
       *
       * @implNote
       * The created {@code Spliterator} additionally reports
       * {@link Spliterator#SUBSIZED}.
       *
       * <p>If a spliterator covers no elements then the reporting of additional
       * characteristic values, beyond that of {@code SIZED} and {@code SUBSIZED},
       * does not aid clients to control, specialize or simplify computation.
       * However, this does enable shared use of an immutable and empty
       * spliterator instance (see {@link Spliterators#emptySpliterator()}) for
       * empty collections, and enables clients to determine if such a spliterator
       * covers no elements.
       *
       * @return a {@code Spliterator} over the elements in this collection
       * @since 1.8
       */
      @Override
      default Spliterator<E> spliterator() {
          return Spliterators.spliterator(this, 0);
      }
      default Stream<E> stream() {
          return StreamSupport.stream(spliterator(), false);
      }
      default Stream<E> parallelStream() {
          return StreamSupport.stream(spliterator(), true);
      }

스마트폰의 설정에서 앱 권한에 어느순간 추가하지 않은 Permission 이 표시되고 있을 때 (선택 권한)

  • AndroidManifest.xml 소스 상에서는 표시되는 권한과 관련된 설정값이 전혀 없음

    <uses-permission android:name="android.permission.INTERNET" />
    ...
  • 프로젝트를 빌드하면 추가한 의존성 및 라이브러리들까지 포함된 Merged Manifest 를 확인 할 수 있음

    • 경로 : app/build/outputs/logs/manifest-merger-debug-report.txt
    • 내용
        uses-permission#android.permission.~~~
        ADDED from [(library or dependency name)] /(~~~local path ~~~)/AndroidManifest.xml:15:5-71
    • 해당 경로의 AndroidManifest.xml 파일 내용을 확인해보면 표시되는 권한을 확인 할 수 있음.
    • 라이브러리 제거로 확인 후 대처.
  • 참고 : https://medium.com/glucosio-project/how-libraries-can-silently-add-permissions-to-your-android-app-620911d7de6c

MacOS 에 OpenJDK 설치 (HomeBrew 사용)

  • 다른 버전의 OpenJDK 설치하기

    $ brew tap AdoptOpenJDK/openjdk
    $ brew cask install {JDK버전}
  • 입력 가능한 JDK 버전 종류

    1. OpenJDK8 - adoptopenjdk8
    2. OpenJDK9 - adoptopenjdk9
    3. OpenJDK10 - adoptopenjdk10
    4. OpenJDK11 - adoptopenjdk11
  • 예시

    $ brew tap AdoptOpenJDK/openjdk
    $ brew cask install adoptopenjdk8

mongoDB 설치 - CentOS 7

  • add mongoDB repository

    # vi /etc/yum.repos.d/mongodb.repo
    [mongodb-4.0]
    name=mongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64
    gpgchecl=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
  • install nginx

    # yum install -y mongodb-org
  • find mongodb config file

    # cat -n /usr/lib/systemd/system/mongod.service
    ...
    9 Environment="OPTIONS=-f /etc/mongod.conf"
    ...
  • start mongodb service

    # systemctl start mongod

'Programming > Server' 카테고리의 다른 글

[CentOS 7] Nginx 설치  (0) 2019.04.29
[Network] OSI 7계층  (0) 2019.04.03
[Linux] 자주 사용하는 명령어 (grep, find, exec, xargs, awk)  (1) 2019.02.26
[Linux] nohup 사용  (0) 2019.02.01
[Ubuntu] AWS - Ubuntu locale 한글 변경  (0) 2019.01.14

Nginx 설치 - CentOS 7

  • add nginx repository

    # vi /etc/yum.repos.d/nginx.repo
    [nginx]
    name=Nginx Repository
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgchecl=0
    enabled=1
  • install nginx

    # yum install -y nginx
  • if not use 80 port, setting firewall and modify nginx conf file

    # firewall-cmd --permanent --zone=public --add-port=81/tcp
    # firewall-cmd --reload
    # firewall-cmd --list-ports
    ...
    # vi /etc/nginx/conf.d/default.conf
    ...
      listen 81;
    ...

'Programming > Server' 카테고리의 다른 글

[CentOS 7] mongoDB 설치  (0) 2019.04.29
[Network] OSI 7계층  (0) 2019.04.03
[Linux] 자주 사용하는 명령어 (grep, find, exec, xargs, awk)  (1) 2019.02.26
[Linux] nohup 사용  (0) 2019.02.01
[Ubuntu] AWS - Ubuntu locale 한글 변경  (0) 2019.01.14

계층별 주요 기능 요약

  • 물리 계층 (Physical Layer, L1)

    • 기계적, 전기적인 통신망 접면의 정의

    • 데이터를 전기적인 신호로 변환해서 주고받는 기능만 할 뿐

    • 대표 장비 : 통신 케이블, 리피터, 허브 등

  • 데이터링크 계층 (DataLink Layer 2, L2)

    • 데이타 링크의 제어 (프레임화, 데이터 투명성, 오류 제어 등)

    • 맥 주소를 가지고 통신한다.

    • 대표 장비 :브리지, 스위치 등

  • 네트워크 계층 (Network Layer 3, L3)

    • 경로 배정, 주소, 호 설정 및 해지 등

    • 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능(라우팅)

    • 주소부여(IP), 경로설정(Route)

  • 전송 계층 (Transport Layer 4, L4)

    • 종단 간의 신뢰성 있고 효율적인 메세지 전송(연결 관리,에러제어,데이타 분리,흐름제어 등)

    • 오류검출 및 복구와 흐름제어, 중복검사 등을 수행

    • TCP 프로토콜 / UDP 프로토콜

  • 세션 계층 (Session Layer 5, L5)

    • 응용 개체들간의 대화, 동기화 제어, 연결세션관리 등

    • 데이터가 통신하기 위한 논리적인 연결

    • 세션 설정, 유지, 종료, 전송 중단시 복구 등

    • 동시 송수신 방식(duplex), 반이중 방식(half-duplex), 전이중 방식(Full Duplex)

    • TCP/IP 세션을 만들고 없애는 책임

  • 표현 계층 (Presentation Layer 6, L6)

    • 전송 형식 협상, 데이타의 표현 방식 변환 등

    • MIME 인코딩이나 암호화 등의 동작

    • 데이터 종류 구분(해당 데이터가 TEXT인지, 그림인지, GIF인지 JPG인지의 구분)

  • 응용 계층 (Application Layer 7, L7)

    • 화일 전송, 접근 및 관리 및 문서, 메세지 교환 등

    • 최종 목적지로서 HTTP, FTP, SMTP, POP3, IMAP, Telnet 등과 같은 프로토콜

    • 일반적인 응용 서비스를 수행


참고

Nginx Reverse Proxy Example with Node.js Express

   - reverse proxy 관련 도커 이미지는 jwilder/nginx-proxy 와 JrCs/docker-letsencrypt-nginx-proxy-companion 를 사용했습니다.
   - https://github.com/jwilder/nginx-proxy
   - https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion

  • https://github.com/jmyoon4488/docker-nginx-reverse-proxy
  • docker-compose 사용
  1. nginx-proxy 컨테이너 실행
  2. Dockerfile 로 Node.js 이미지 파일 빌드
  3. 빌드한 이미지로 Node.js 웹서버 실행
  4. 잘 적용되었는지 확인!

  1. nginx-proxy container 실행해줍니다.

    • /your/path/nginx-proxy - 해당 부분은 자신의 서버에 맞는 경로로 바꿔주세요.
    • proxy/nginx-proxy-letsencrypt.yml

    version: '3' services: nginx-proxy: container_name: nginx-proxy image: jwilder/nginx-proxy ports: - 80:80 - 443:443 restart: always volumes: - /your/path/nginx-proxy/log:/var/log/nginx  - /your/path/nginx-proxy/html:/usr/share/nginx/html - /your/path/nginx-proxy/certs:/etc/nginx/certs         - /your/path/nginx-proxy/vhost.d:/etc/nginx/vhost.d - /your/path/nginx-proxy/config:/etc/nginx/conf.d - /var/run/docker.sock:/tmp/docker.sock:ro labels: - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy etsencrypt-nginx-proxy: container_name: leten-nginx-proxy image: jrcs/letsencrypt-nginx-proxy-companion restart: always depends_on: - nginx-proxy volumes: - /your/path/nginx-proxy/certs:/etc/nginx/certs - /your/path/nginx-proxy/vhost.d:/etc/nginx/vhost.d - /your/path/nginx-proxy/html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro networks: default: external: name: nginx-proxy

    $ docker-compose -f nginx-proxy-letsencrypt.yml up -d
    
    • $ docker ps 명령어로 컨테이너가 정상적으로 실행되고 있는지 확인.
  2. Dockerfile 로 Node.js 이미지 빌드

    • node/Dockerfile
    FROM node:carbon
    
    ENV SRCDIR /src
    RUN mkdir -p $SRCDIR/app && chown -R node:node $SRCDIR
    
    WORKDIR $SRCDIR
    COPY ./package.json $SRCDIR
    
    RUN npm install
    
    COPY . $SRCDIR
    
    EXPOSE 3000
    WORKDIR $SRCDIR/app
    
    CMD ["node", "app.js"]
    • package.json
    {
        "name": "node",
        "version": "0.0.0",
        "private": true,
        "scripts": {
            "start": "node ./app/app.js"
        },
        "dependencies": {
            "debug": "~2.6.9",
            "ejs": "~2.5.7",
            "express": "~4.16.0",
            "request": "^2.88.0",
            "uuid": "^2.0.2"
        }
    }
    • build image
    $ docker build --tag nodejs:test .
    
    • $ docker images  로  이미지 확인
    REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
    nodejs                                   test                000000000000        24 minutes ago      902 MB
    
  3. 빌드한 이미지로 Node.js 컨테이너 실행

    • 4개 항목은 꼭 자신에게 맞는 값으로 변경 - VIRTUAL_HOST, VIRTUAL_PORT, LETSENCRYPT_HOST, LETSCRYPT_EMAIL
    • 포트를 변경하려면 Dockerfile 에서 EXPOSE 포트를 변경하고 다시 빌드해 줍니다.
    • node/node-test.yml
    version: '3'
    
    services:
      nodejs-test:
        container_name: node-test
        image: nodejs:test
        volumes:
          - ./app:/src/app
        environment:
          - VIRTUAL_HOST=sub.domain.com
          - VIRTUAL_PORT=3000
          - LETSENCRYPT_HOST=sub.domain.com
          - LETSCRYPT_EMAIL=your@email.com
    
    networks:
      default:
        external:
          name: nginx-proxy
    • 컨테이너 확인
    $ docker ps
    
  4. 프록시 및 letsencrypt 적용 확인

    • 브라우저를 통해 설정에 적용한 서브도메인으로 접속해봅니다.
    • nginx 설정파일을 확인해 봅니다.
    $ docker exec nginx-proxy cat /etc/nginx/conf.d/default.conf
    

    or

    $ sudo cat ./config/default.conf
    
    • default.conf
    ~~~~~~~
    # sub.domain.com
    upstream sub.domain.com {
                    ## Can be connected with "nginx-proxy" network
                # node-test
                server 172.5.0.1:3000;
    }
    server {
        server_name sub.domain.com;
        listen 80 ;
        access_log /var/log/nginx/access.log vhost;
        return 301 https://$host$request_uri;
    }
    server {
        server_name sub.domain.com;
        listen 443 ssl http2 ;
        access_log /var/log/nginx/access.log vhost;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers 'CODE~~~~~~~~~~~~~';
        ssl_prefer_server_ciphers on;
        ~~~ many options 
        include /etc/nginx/vhost.d/default;
        location / {
            proxy_pass http://sub.domain.com;
        }
    }
  5. 만약 다른 웹서버 컨테이너를 추가하고 싶다면...

    • 추가할 웹서버는 도커를 이용해 실행해야 합니다.
    • 컨테이너는 반드시 프록시 컨테이너와 같은 도커 네트워크 상에 위치해야 합니다. (nginx-proxy)
    • 위에서 지정한 4가지 옵션을 꼭 입력해 주세요.


- grep

 : 파일 내용이나 콘솔상의 출력 내용에서 특정 문자열을 찾아서 보여줍니다.


1) 파일에서 word 문자열을 찾아 출력합니다.

$ grep word test.txt


2) 현재 디렉토리상에 있는 모든 파일에서 word 문자열이 포함된 줄을 찾아 출력합니다.

$ grep word *


3) 현재 디렉토리 및 하위에 있는 모든 파일에서 word 문자열이 포함된 줄을 찾아 출력합니다.

$ grep -r word * 


4) 파일에서 word 문자열을 찾아 다음 3줄을 포함해서 출력합니다.

$ grep word test.txt -A 3


5) 파일에서 word 문자열을 찾아 이전 3줄을 포함해서 출력합니다.

$ grep word test.txt -B 3


6) 파일에서 word 문자열을 찾아 줄번호를 포함해서 출력합니다.

$ grep word test.txt -n


7) 파일에서 word 문자열이 포함된 줄을 제외하고 출력합니다.

$ grep -v word test.txt


8) 파일에서 (word1 or word2) 문자열이 포함된 줄을 출력합니다. ( or 연산자 = |  는 특수기호이므로 역슬래시를 붙여줍니다. )

$ grep "word1|word2" test.txt


9) 파일에서 (word1 and word2) 문자열이 포함된 줄을 출력합니다.

$ grep word1 test.txt | grep word2


10) 옵션 혼합 가능

$ grep -rn word /home/test -B 5 -A 3


=> /home/test 폴더 하위 모든 파일에서 word 문자열을 찾아서 해당 문자열 이전 5줄, 이후 3줄에 줄번호를 포함해서 출력합니다.


11) pipe 로 다른 명령어의 표준 출력과 연계가능

$ cat /home/test/test.txt | grep word



- find

 : 파일 및 디렉토리 등 검색할 때 사용합니다


1) /home/test 하위 파일, 디렉토리, 링크, 소켓 등등 모든 것을 출력합니다.

$ find /home/test


2) /home/test 하위 파일만 출력합니다. ( -type d = 디렉토리만 출력 )

$ find /home/test -type f


3) /home/test 하위 파일 중 크기가 5MB 이상인 파일만 출력합니다.

$ find /home/test -type f -size +5M


4) /home/test 하위 파일 중 크기가 5MB 이상이고 권한이 644인 파일만 출력합니다.

$ find /home/test -type f -size +5M -perm 644


5) /home/test 하위 파일 중 크기가 5MB 이상이고 파일이 변경된지 5일이 지난 파일만 출력합니다.

(일자 옵션 - s : 초, m : 분, h : 시, d : 일, w : 주)

$ find /home/test -type f -size +5M -mtime +5d 



- exec

 : 앞선 명령어의 결과를 입력으로 받아 “\;” 라는 표기자를 만날때까지 읽고 실행

 : 즉 exec 커맨드의 끝을 ';'(세미콜론)으로 표기해줘야함

 : '+' 옵션은 인자를 연속으로 입력해서 커맨드 한번으로 실행하게끔 해줌


/home/test 에 아래와 같이 3개의 파일이 있을 경우

/home/test/a.txt

/home/test/b.txt

/home/test/c.txt


1) /home/test 하위 파일 중 크기가 5MB 이상인 파일의 출력을 인자로 하여 ls -l 명령어를 실행합니다.

$ find /home/test -type f -size +5M -exec ls -l {} \;

({} <- 위치에 find 결과값의 인자가 들어갑니다.)


위 명령어를 풀어서 써보자면...

$ find /home/test -type f -size +5M -exec ls -l {} \;

=>  $ ls -l  /home/test/a.txt

    $ ls -l  /home/test/b.txt

    $ ls -l  /home/test/c.txt


1) /home/test 하위 파일 중 크기가 5MB 이상인 파일의 출력을 인자로 하여 chmod 명령어를 실행합니다.

$ find /home/test -type f -size +5M -exec chmod 755 {} +


위 명령어를 풀어서 써보자면...

$ find /home/test -type f -size +5M -exec chmod 755 {} +

=>  $ chmod 755 /home/test/a.txt /home/test/b.txt /home/test/c.txt



- xargs

 : exec 커맨드의 + 옵션과 유사하다.

 : 앞선 명령어의 결과를 입력으로 받아 인자를 연속으로 나열하여 커맨드를 실행함

 : {} 문자열은 다른 문자열로 사용할 수 있다.


1) -I 옵션으로 txt 파일을 backup 폴더로 복사 (권장)

$ find /home/test -type f | xargs -I{} cp {} /home/test/backup


2) -i 옵션으로 txt 파일을 backup 폴더로 복사

$ find /home/test -type f | xargs -i cp {} /home/test/backup


3) {} 대신 다른 문자열 사용

$ find /home/test -type f | xargs -IARGS cp ARGS /home/test/backup


매뉴얼에는 -i 옵션은 옛날 방식이므로 -I 옵션을 사용하도록 권고하고 있다. -i 옵션에서 아무것도 지정하지 않을 경우 기본값으로 "{}" 문자열이 사용되고, -I 옵션에는 기본값이 없으므로 반드시 -I{} 이런 식으로 사용해야 한다.



- awk

 : 패턴 탐색과 처리를 위한 명령어로 간단하게 파일에서 결과를 추려내고 가공하여 원하는 결과물을 만들어내는 명령어이다.

 : F 옵션을 통해 구분자를 지정할 수 있다.

 : 구분된 인자는 $1 부터 차례대로 할당된다.


기본 문법

$ awk 'pattern' filename

$ awk '{action}'  filename

$ awk 'pattern' '{action}' filename

$ awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]


ex) $ ls -al

total 1111

drwxr-xr-x  6 test  staff      192  2 20 10:10  .

drwxr-xr-x  4 test  staff      128  2 20 10:10  ..

-rwxr-xr-x  1 test  staff       100  2 20 10:10 a.txt

-rwxr-xr-x  1 test  staff       100  2 20 10:10 b.txt

-rw-r--r--   1 test  staff       100  2 20 10:10 c.txt


공백으로 분리하면

$1  : '-rw-r--r--'

$2 : '1'

$3 : 'test'

$4 : 'staff'

$5 : '100'

$6 : '2'

$7 : '20'

$8 : '10:10'

$9 : 'c.txt'


$ ls -al | awk -F " " '{print $9}'

.

..

a.txt

b.txt

c.txt


(추가 사항이 생길 경우 수정할 예정입니다.)

+ Recent posts