모든 위치파라미터를 저장한다는 점에서는 동일하나, 쌍따옴표(")로 둘러쌓이면 다른 의미를 갖는다.

기억하기 쉽게 설명하자면, "$*"는 모든 파라미터를 한개의 문자열로 퉁치고, "$@"는 인용문자(', ")의 의미를 살려 파라미터를 배열로 취급한다.

다음의 예제를 실행해보면 쉽게 알 수 있다.

 

코드

all.sh

#!/bin/bash
set "hong gildong" jangbogo janggilsan
declare -i cnt=0
for i in $* # 이 부분을 $*, $@, "$*", "$#" 네가지로 변경하며 실행하면 차이를 알 수 있음
do
        echo $cnt
        echo $i
        cnt+=1
done

 

실행

./all.sh

 

 

결과

$*, $@ 인 경우

0
hong
1
gildong
2
jangbogo
3
janggilsan

 

"$*" 인 경우

0
hong gildong jangbogo janggilsan

 

"$@" 인 경우

0
hong gildong
1
jangbogo
2
janggilsa
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

리눅스 쉘스크립트는 기본적으로 변수를 문자열로 취급하기 때문에, 정수형 산술연산(-, +, *, /, % 등)을 하기 위해서는 아래의 세가지 방법을 사용할 수 있다.

 

1. 선언시 정수형으로 선언

declare -i 변수명

으로 변수 선언시, 해당 변수는 정수로 취급하며, 문자열을 넣으면 0이 된다. 기본값은 0이다.

이렇게 선언된 변수는 바로 산술연산이 가능하다.(산술식의 결과를 대입할 수도 있고, 변수끼리 산술연산도 가능하다)

e.g.

declare -i num

num=10+10

echo $num # 20이 출력됨

 

2. let 명령어 사용

declare -i 로 선언된 변수가 아니더라도,

let 산술연산 대입식

을 사용하여 산술연산이 가능하다.

e.g.

num=10

let num=num+10 # let "num = num + 10" 쌍따옴표로 묶어도 연산이 되며, 띄어쓰기도 넣을 수 있다.

echo $num # 20이 출력됨

 

3. 쌍괄호 사용

쌍괄호로 산술연산식을 감싸면 let 명령어를 사용한 것과 동일하다.

e.g.

num=10

((num=num+10)) # ((num = num + 10)) 띄어쓰기도 넣을 수 있다.

echo $num # 20이 출력됨

 

4. expr 명령어 사용

expr 값 연산자 값 or expr $[값 연산자 값]

e.g.

expr 10 + 20 # 30

expr 2 \* 3 # 6. *연산자를 와일드카드를 의미하므로 escape 해줘야 한다.

expr $[2 * 3] # expr $[2*3], echo $[2*3], echo $[2 * 3] 과 동일. $[] 로 감싸면 escape 할 필요 없다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

[Nginx] config 정리

Nginx 2022. 7. 26. 16:10

경로

/etc/nginx/nginx.conf

user  nginx;
worker_processes  10;


error_log  /webserver/nginx/logs/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  /var/log/nginx/access.log  main;

    server_tokens off;
    sendfile        on;
    keepalive_timeout  1200;

#    large_client_header_buffers 4 16k;
    client_max_body_size 200M;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    proxy_read_timeout 600;
    send_timeout 600;
    fastcgi_send_timeout 600;
    fastcgi_read_timeout 600;


    charset utf-8;

    include /etc/nginx/conf.d/*.conf;
}
  • user: nginx의 worker process가 실행되는 user권한. 공백을 구분자로 두번째 값을 써줄 수 있는데, 이는 group을 의미하며, 생략시 user와 같은 그룹을 사용한다.(기본값 nobody)
  • worker_processes: worker process의 수를 의미. 최적값은 하드웨어의 코어수, 하드드라이브 이용률 및 로드패턴 등과 복잡하게 얽혀 있어서 일반적으로 코어수와 동일하게 맞추는것을 권장한다.(기본값 1)
  • error_log: 로그파일 경로와 남기고자 하는 심각도 레벨. (기본값 logs/error.log) 레벨은 다음 값 중 하나이다.(심각도 오름차순)(기본값 error)
    debug, info, notice, warn, error, crit, alert, or emerg
  • pid: nginx main process(=master process)의 pid 저장 파일경로(기본값 logs/nginx.pid)
  • events.worker_connections: 한개의 worker process가 동시에 오픈할 수 있는 최대 연결 갯수. client 와의 연결만 포함하는게 아니고, 모든 connection을 포함한다. (주의)worker_rlimit_nofile 값을 초과해서 세팅하면, worker_rlimit_nofile 값이 우선시된다.(기본값 512)
  • http.include: http 블록에 가져올 context 파일 경로.(여기서는 mimetype 정의 파일 - mimetype 목록과 파일 확장명)
  • http.default_type: mimetype 중에 기본값으로 사용할 값(여기서는 application/octet-stream)
  • http.log_format: 로그포멧 이름과 형식 지정. 가상호스트 설정시 로그파일 뒤에 로그포멧 이름을 지정하면 해당 포멧대로 로그가 쌓인다.(여기서는 main이 로그포멧 이름)
  • http.server_tokens: off로 설정시 response 의 Server 헤더값에서 nginx 버전을 지워준다.(보안상 이점)
  • http.sendfile: on으로 설정시 read/write시 하드디스크 io를 일으키지 않고 커널 내부에서 파일을 복사하여 속도 향상
  • http.keepalive_timeout: 서버에 접속시 클라이언트와 커넥션을 열린채로 유지하는 시간.(0으로 잡으면 keepalive 비활성)
  • http.client_max_body_size: 파일 업로드 제한용량. 파일 업로드시 http 응답코드 413 (equest Entity Too Large)인 경우 이를 설정하면 해결됨.
  • http.proxy_connect_timeout: 프록시 서버와 연결(establishing)시 timeout. 모든 서버에 대해 적용됨. server나 location 컨텍스트에서 재정의 가능
  • http.proxy_send_timeout: 프록시 서버에 요청시 timeout. 모든 서버에 대해 적용됨. server나 location 컨텍스트에서 재정의 가능
  • http.proxy_read_timeout: 프록시 서버에 요청 후 응답을 기다리는 timeout. 모든 서버에 대해 적용됨. server나 location 컨텍스트에서 재정의 가능
  • http.send_timeout: 클라이언트에 응답을 보내는 timeout.
  • http.fastcgi_send_timeout: fastcgi 프로토콜로 프록시 서버에 요청시 timeout.
  • http.fastcgi_read_timeout: fastcgi 프로토콜로 프록시 서버에 요청 후 응답을 기다리는 timeout.
  • http.charset: 문자셋 설정

 

 

 

 


https://gist.github.com/goodGid/19aceb989a86adbb4560e976cf437453

 

Nginx Conf

Nginx Conf. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

http://nginx.org/en/docs/ngx_core_module.html

 

Core functionality

Core functionality Example Configuration user www www; worker_processes 2; error_log /var/log/nginx-error.log info; events { use kqueue; worker_connections 2048; } ... Directives Syntax: accept_mutex on | off; Default: accept_mutex off; Context: events If

nginx.org

https://www.nginx.com/nginx-wiki/build/dirhtml/start/topics/examples/full/

 

Full Example Configuration | NGINX

Full Example Configuration nginx.conf user www www; ## Default: nobody worker_processes 5; ## Default: 1 error_log logs/error.log; pid logs/nginx.pid; worker_rlimit_nofile 8192; events { worker_connections 4096; ## Default: 1024 } http { include conf/mime.

www.nginx.com

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

입력을 필터링하고, 필터링된 데이터를 원하는 포멧으로 출력하기 위한 리눅스 빌트인 프로그램(명령어)은 주요하게 3가지가 있다.

grep, sed, awk

 

grep은 보통 입력에서 원하는 패턴 또는 문자열이 포함된(또는 포함되지 않은) 라인만 출력하기 위해 사용된다.

이번 글에서는 sed와 awk의 주요 명령어 사용형식에 대해서 정리한다.

 

1. sed

패턴에 일치(또는 라인번호에 일치)하는 라인에 대해 어떤 처리(치환, 삭제) 후 출력한다.

 

치환 : sed '[/패턴 or 라인범위/]s/pattern1/pattern2/g' 대상파일(pattern2를 빈값으로 하면 일치하는 텍스트만 삭제되는 효과)

일치 라인만 출력 : sed -n '/패턴 or 라인범위/p' 대상파일

삭제후 나머지 라인 출력 : sed '/패턴 or 라인범위/d' 대상파일

 

2. awk

*** 잘쓰면 개유용함***

패턴이나 조건에 일치하는 라인에 대해 (공백 또는 탭을 기준으로-default)각 필드를 포멧팅 하여 출력한다. 프로그래밍적 문법과 연산도 지원하기 때문에 복잡한 데이터 가공까지 가능하다.

 

awk '[/패턴/ or 필드조건][{printf "포멧지정자 포함 텍스트",$필드위치변수 > "출력파일"}]' 대상파일

awk -f awk명령어파일 대상파일

awk 'BEGIN{awk내장함수 or 명령어 | getline item;awk처리액션...}[/패턴/ or 필드조건]{레코드별 액션}END{모든행 처리 후 액션}'

*BEGIN만 사용하면 입력파일 없이 액션 부분에 쉘 명령어를 사용하여 원하는 출력을 만들어낼 수 있다.

*awk 빌트인 변수와 빌트인 함수를 잘 사용하면 강려크하다.

 

3. 유용한 awk 빌트인 함수

3.1. 문자열함수

sub, gsub, index, length, substr, match, split, sprint, toupper, tolower

3.2. 수학함수

int, log, rand, srand, sin, cos

3.3. 시간함수

systime, strftime

3.4. 입력읽기 함수

getline: 파이프라인(|) 뒤에서 앞 명령어로 출력된 라인을 입력받거나, 장치(파일)로부터 앞에서 입력리다이렉션(<)을 받는다.

반환값은 입력된 라인이 존재하면 1, 존재하지 않으면 0, 에러시 -1 이다.(falsy 값이므로 루프나 조건문에 사용가능)

e.g. "date" | getline d; getline data < "/dev/tty"; getline data < "/etc/passwd"

3.5. 리눅스 명령어 실행함수

system

 

4. 유용한 awk 빌트인 변수

NF: 현재 레코드 필드 갯수

 

NR: 현재 레코드 번호(1부터 시작)

FNR: 파일의 전체 레코드 갯수

 

FS: 입력필드 분리자(기본값 공백)

OFS: 출력필드 분리자(기본값 공백)

 

RS: 입력레코드 분리자(기본값 newline: \n)

ORS: 출력레코드 분리자(기본값 newline: \n)

 

RLENGTH: match 함수에 의해 매칭된 문자열 길이

RSTART: match 함수에 의해 매칭된 문자열의 offset(매칭시작인덱스)

 

IGNORECASE: 정규표현식과 문자 비교처리시 대소문자 구분여부(0: 구분안함, 1: 구분함. 기본값 1)

ARGC: 인자갯수

ARGV: 인자배열

 

 

 

e.g. 특정 필드의 값이 특정 패턴에 매칭되면 수행하는 awk

netstat.awk
#!/bin/awk
BEGIN{
        pring "BEGIN\n";
        cnt = 0;
}
{
        if ($3 ~ /S/) {
                cnt++;
                printf "NO:%d.\tNR:%d.\tFNR:%d\t%s\n", cnt, NR, FNR, $0;
        }
}
END{
        printf "cnt: %d\nEND\n", cnt;
}
netstat.txt

(읽을 파일 만들기)

netstat -r > netstat.txt

 

확인커맨드

awk -f netstat.awk netstat.txt
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

env : 환경변수 출력

source 파일경로 : 해당 파일을 즉시 설정으로 적용

du 파일경로 : 해당 파일의 용량 표시

    -h : 용량을 보기쉬운 단위로 표현

su : 슈퍼유저로 로그인 시도

    - : 모든 환경변수도 전환

which 실행기(언어) : 환경변수의 PATH 경로에 존재하는 실행파일의 위치를 검색하여 출력

whereis 실행기(언어) : which 와 비슷함.(자세한건 모르겠음)

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

네트워크 모델이라 함은 우리가 한 컴퓨터에서 다른 컴퓨터로 데이터를 보낼 때 쓰이는 네트워크 소프트웨어의 아키텍쳐임. 데이터는 송신 컴퓨터에서 5계층부터 1계층까지의 인코딩 과정을 거쳐 인터넷 망을 통해 수신 컴퓨터에 도달하며, 수신 컴퓨터에서는 반대로 1계층부터 5계층까지의 디코딩 과정을 거쳐 데이터를 읽는다.

 

1 - Physical Layer : 디지털 신호를 아날로그 신호로 변환하여 전송(하드웨어에 구현. PHY칩)

2 - Data Link Layer : 전송하는 데이터의 시작과 끝 부분에 구분자를 붙여 데이터 단위를 식별할 수 있도록 함(하드웨어에 구현. 랜카드)

3 - Networt Layer : 목적지 컴퓨터의 ip 주소를 보내는 데이터 구조체에 추가함(소프트웨어에 구현. OS 커널)

4 - Transport Layer : 목적지 프로세스의 port 주소를 보내는 데이터 구조체에 추가함(소프트웨어 구현. OS 커널)

5 - Application Layer : 종단의 송신, 수신 프로그램에서 정의한 프로토콜(HTTP)

 

* 기존 OSI 7 Layer 는 TCP/IP 모델로 대체되었으며. OSI 7 Layer 중 Session Layer(5계층), Presentation Layer(6계층), Application Layer(7계층)이 TCP/IP 모델의 Application Layer로 구현되어있다.

* TCP/IP 소켓 프로그래밍(네트워크 프로그래밍)을 한다는 것은 운영체제의 4계층 전송계층 API 를 사용하여 네트워크 통신을 한다는 것이다.

* 대표적인 Application Layer 프로토콜은 HTTP 이다.

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

다른 블로그 글들을 보면 host 의 timezone 파일을 도커 컨테이너에 연결해서 timezone 을 일치시키는 방법을 많이 쓴다.

하지만 윈도우에서 어떻게 하는지 몰라 그냥 쉽고 편한 방식인 tzdata 를 이용한 방법을 썼다.

 

우분투 컨테이너에서 아래 명령어를 차례로 실행

 

apt update

apt install tzdata

dpkg-reconfigure tzdata

위와 같이 대륙?과 도시를 선택하면 된다.

로컬타임과 유니버셜타임이 각각 설정되며,

date 명령어로 확인하면 KST 타임존이 적용된 것을 볼 수 있다.

'Docker' 카테고리의 다른 글

[Docker] 자주쓰는 명령어 정리  (0) 2021.07.08
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

- search 키워드

: 설치가능한 이미지 검색

 

- pull 이미지명

: 이미지 다운로드

 

- images [이미지명]

: 다운로드 받은 이미지 목록

 

- create [옵션] --name 컨테이너명 이미지명

: 이미지를 컨테이너로 만들기

: 옵션은 보통 -i -t 를 주며, -i는 상호입출력, -t는 tty를 사용하여 bash 쉘로 입출력

 

- ps [옵션]

: 현재 컨테이너 목록보기

: 옵션을 안주면 실행중인 컨테이너만 보이며, -a 옵션을 주면 모든 컨테이너를 보여줌

 

- start 컨테이너명

: 컨테이너를 실행(이미 create 로 만들어져 있어야 함)

 

- attach 컨테이너명

: 컨테이너에 연결(이미 start 로 실행되어 있어야 함)

 

- run [옵션] --name 컨테이너명 이미지명 이미지실행파일경로

: 생성(create) + 실행(start) + 연결(attach)까지 한번에 하는 명령어

 

- stop 컨테이너명

: 컨테이너 종료

 

 

* 컨테이너 종료

exit

* 컨테이너 실행상태에서 빠져나오기(백그라운드 실행)

ctrl + p, ctrl + q

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

두 자연수의 최대공약수를 구해서 푸는 문제가 많으므로 메모...

 

아래의 문제를 최대공약수(gcd)를 이용해서 풀었다.

가로 1, 세로 1 크기의 작은 정사각형으로 이루어진 큰 사각형의 대각선 두 꼭짓점을 선분으로 이었을 때, 선분이 통과하는 작은 정사각형 교차점의 갯수를 구해야 했다. 이때, 바로 큰 사각형의 가로(w), 세로(h) 길이의 최대공약수(gcd(w, h))가 교차점의 갯수이다.

 

선분이 통과하는 작은 사각형의 갯수는

- 교차점이 있는 경우: w + h - gcd(w, h)

- 교차점이 없는 경우: w + h - 1

 

https://programmers.co.kr/learn/courses/30/lessons/62048

 

코딩테스트 연습 - 멀쩡한 사각형

가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을

programmers.co.kr

 

function getGcd (n, m) {
    let gcd = 0
    let max = Math.max(n ,m)
    let min = Math.min(n, m)
    while (true) {
        // 최대공약수
        const quot = Math.floor(max/min)
        const remains = max%min
        if (remains === 0) {
            gcd = min
            break
        } else {
            max = min
            min = remains
        }
    }
    return gcd
}

 

유클리드 호제법

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

프로그래머스에서 애증의 코딩테스트...를 준비하는 도중 1단계 문제임에도 성능때문에 계속 실패하는 문제에 부딪혔다.

 

https://programmers.co.kr/learn/courses/30/lessons/12921

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr

 

소수를 구하는 함수를 짠 후, 모든 숫자에 대해 소수인지 판별하여 카운팅을 하는 방식으로 짯더니 실패.

 

검색결과 에라토스테네스의 체를 사용하여 구하여야 1부터 아주 큰 수 까지의 숫자 중에서 소수의 집합을 구할 때 효율적이라고 한다.

 

https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간

ko.wikipedia.org

 

먼저 숫자 몇까지의 소수집합을 구할지 배열공간을 만들어 놓은 후, 2부터 1씩 증가시키며 2배수 이상의 숫자들을 지워준다. 이미 지워진 숫자는 건너 뛴다. 아래는 자바스크립트로 짠 코드

 

function solution(n) { 
    let arr = [] 
    // 1은 소수가 아니고, 2부터 소수가 될 수 있으므로, 2부터 구하고자 하는 값까지의 배열을 만든다. 
    for (let i = 2; i <= n; i++) { 
        arr[i] = i 
    } 
    // 2부터 시작해서 2배수 이상의 숫자를 모두 지우되, 이미 지워진 숫자는 건너 뛴다. 
    for (let i = 2; i <= n; i++) { 
        for (let j = i + i; j <= n; j += i) { 
            if (arr[j] === 0) { 
                continue 
            } 
            arr[j] = 0 
        } 
    } 
    return arr.filter((item) => item !== 0).length 
}

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,