자택경비대

wget으로 curl 대체, curl로 wget 대체 하는 법

Programming

wget -> curl

보통은 curl이 있고 wget이 없는 경우가 더 많겠지만, 아무튼 아래와 같이 옵션인자를 줘서 해결이 가능하다.


wget -q -O- [URL]



# -q 로깅을 하지 않는다

# -O 다운로드 출력을 stdout으로 리다이렉팅 한다

curl -> wget

curl로 wget을 대체하는 방법은 좀 더 간단하다.

curl -o [FILENAME] [URL]

CURL로 SSE (Server-Sent Event) 응답 받는법

Programming

아래와 같이 옵션을 주면 에러 발생없이 서버 응답값을 보는것이 가능하다.

curl -N -m0 --ignore-content-length [SSE 소스 주소]

옵션 인자에 대한 세부 설명은 다음과 같다.

-N 버퍼링을 하지 않음

-m 전송 타임아웃 시간을 설정함

--ignore-content-length 서버의 Content-Length 응답 헤더를 무시함

인터페이스의 개념

misc/쌉

인터페이스란 어떠한 객체에서 다른 객체로 정보를 넘겨줄때 사용되는 매개체를 인터페이스라고 한다.

한 예를 들면 노트북이 있을때, 이 노트북에 메모장을 띄워서 abc라고 적어두었다고 가정하자.

이때, 노트북에 HDMI포트를 연결해서 TV에 연결하는것이나, 사람이 노트북 화면을 통해서 글자를 읽는것이나 인터페이스 관점에서는 같다.

왜? 눈은 빛을 받아들이는 기관이다. 그리고 HDMI포트는 HDMI 케이블을 통해 정보를 받아들이는 장치이다.

한 마디로 모니터에서 눈으로 빛이라는 인터페이스를 통해 정보가 전달되었다고 보면 된다.

HDMI를 노트북의 HDMI포트에 꽂아서 TV화면에 abc라는 글자를 그리는 데이터를 전달하는 것이나,

모니터에 띄워진 abc라는 글자를 눈으로 쳐다봐서 받아들이는것이나 둘다 인터페이스를 통한 전달인 것이다.

  • 노트북 -> (생략) -> HDMI포트 -> HDMI 케이블 -> TV

  • 노트북 -> (생략) -> 화면 -> 빛 -> 눈 -> 뇌

다만, 이렇게 눈으로 들어온 정보는 HDMI포트로 직접 꽂아서 전달 된 정보만큼 빠르고 정확하지는 않다는것이 그 차이이다.

(비효율적)

그렇기 때문에 Brain–Computer Interface (BCI) 같은, 눈에서 빛을 받아들인걸 뇌에서 다시처리하는.. 이런 쓸때없는 과정을 거치지 않고

뇌와 기계를 직접적으로 연결하려는 시도가 생기는 것이다. (물론 이것도 결국엔 인터페이스다.)

첨언으로, 정보를 전달하는 공통된 무언가... 네트워크에서 HTTP니 FTP 하는 프로토콜과도 비슷하지 않은가?

그렇기 때문에 인터페이스는 때로 프로토콜이라고 불리기도 한다. (Swift 언어 참고)

파이썬 argparse 모듈에서 버전 옵션과 필수 옵션 혼용하는법

Programming

Pythonargparse모듈은 Cgetopt.h 처럼 명령 인자를 받아서 옵션으로 해석할 수 있도록 돕는 모듈이다.

기본적인 사용방법은 다음과 같다.


import argparse



parser = argparse.ArgumentParser()

parser.add_argument('--foo')

args = parser.parse_args()

문제는, --version 같은 옵션은 별 다른 옵션 없이 progname --version 형태로 전달하게 되면 일반적으로 정상적으로 버전을 출력하고 끝나는데, 항상 요구되는 Required 인자, 혹은 옵션이 전달되지 않은 경우 에러를 발생시키는 Positional argument와 함께 사용하려하면 --version 옵션을 붙이고도 다른 요구사항을 만족시키지 못해 에러를 발생시키게 된다.


import argparse



parser = argparse.ArgumentParser()

parser.add_argument('foo')  # `foo` 가 제공되지 않으면 에러가 발생한다.

parser.add_argument('--version')

args = parser.parse_args()  # 다음의 `version` 옵션 체크 이전에 에러가 발생하기 때문에 버전이 정상적으로 출력되지 못한다.

if args.version:

    print(__version__)

이런 경우의 해결 방법은 action 어트리뷰트를 action='version' 으로 설정하고, version=__version__ 처럼 version 어트리뷰트를 추가로 지정해주면 위와 같은 상황에서 에러를 발생시키지 않고, 버전을 정상 출력 한 뒤, 종료된다.


import argparse



parser = argparse.ArgumentParser()

parser.add_argument('foo')

parser.add_argument('--version', action='version', version=__version__)

args = parser.parse_args()  # "1.0.0"

# 아래 옵션 검사, 버전 출력 구문은 더 이상 필요없다

# if args.version:

#    print(__version__)

Yarn 으로 파일 시스템 상의 패키지 설치하는법

Programming

npm과는 다르게 yarn에서는 로컬 파일 시스템의 패키지를 설치 할경우

npm install -g . # 현재 디렉토리의 패키지를 전역 설치

처럼 파일 경로를 명시하는 방식으로 설치하게 되면 오류가 발생한다.

이를 해결하려면 file:// 프로토콜을 앞에 덧붙여 파일 시스템상의 패키지라고 명시해주면 해결 할 수 있다.

yarn global add file:$PWD # yarn으로 현재 디렉토리의 패키지를 전역 설치

두개의 명령어 출력을 하나로 합치는 방법

Programming

예를 들어 echo fooecho bar, 두 개의 명령어의 출력을 하나로 합쳐서 cat으로 파이핑 하고 싶다면 아래와 같은 방법으로 해낼 수 있다.

# 방법 1
( echo foo ; echo bar ) | cat

# 방법 2
{ echo foo ; echo bar ; } | cat

꼬리재귀(Tail Recursion)란

Programming

Tail Call

Tail Call은 어떠한 함수가 Return 명령어를 만나기 바로 직전에 호출 되는것을 뜻한다.

이때의 직전, 혹은 마지막이란 위치 개념은 컴파일 이전의 코드에서의 개념이 아닌, 실제 스택 프레임의 할당 해제 가 일어나기 직전의 위치를 뜻한다.

그러므로 다음과 같은 경우는 코드의 마지막에 위치하지만 Tail Call에 해당하지 않는다.

e.g.

return func(n--);  // 꼬리 호출이 아니다. (호출이 일어난 뒤, n의 감소가 이루어진다)
// 만약 위 코드가 `return func(--n)` 였다면, 꼬리 호출이다.

TCO

TCO(Tail Call Optimization)는 마지막 호출에서 Call (Tail call) 을 하는경우, 새로운 스택 프레임 생성을 반복 하지 않고

같은 스택 프레임 내에서 다시 호출되는 함수의 진입점으로 Jump 하여 루틴을 진행할 수 있는것을 뜻한다(스택 프레임의 재사용 안전성).

그리고 Recursion 즉, 자기 자신을 호출하는 함수가 명령어의 가장 마지막에 위치할 때 이것을 Tail Recursion이라고 한다.

Tail Recursion Elimination

TCO(Tail Call Optimization)의 특별한 경우인 Tail Recursion Elimination 은 어떠한 함수가 꼬리재귀에 해당 할 때,

이를 반복문의 형태로 재구성 할 수 있는것을 뜻한다.

많이 착각하는 부분은, 꼬리 재귀의 형태로 구현이 되면 Tail Recursion Elimination이 된다고 생각하는 것인데,

이는 재구성 할 수 있다 라는 것이지 실제 컴파일러에서 최적화를 진행하지 않으면 일반적인 재귀와 마찬가지로 일반적인 Call이 이루어지게 된다.

Reference

Node.js에서 watch 프로세스를 두개 이상 띄우는 방법

Programming

concurrently를 설치해서 사용하면 된다.

밑의 예제에서 cmdN 부분을 watch 프로세스를 띄우는 명령어로 교체해서 사용하면 된다.

npm install --save concurrently
npx concurrently "cmd1" "cmd2"
# OR
npm install -g concurrently
concurrently "cmd1" "cmd2"

Alpine Linux에서 root 유저로 권한 변경하는법

Programming

Alpine Linux에서는 sudo 명령어를 사용할 수 없기 때문에, 대신 su root 명령어를 사용하면 된다.


~$ sudo

-ash: sudo: not found

~$ su root

Password:

~# whoami

root

Alpine Linux에서 일반유저로 도커 관리하는 방법

Programming

알파인 리눅스에서는 sudo, usermod 명령어가 없기 때문에 addgroup 명령어를 사용해서 일반 유저를 도커 그룹에 추가해주어야 한다.


~# addgroup docker [USERNAME]

root 권한으로 위 명령을 실행한 뒤에 일반 로그인유저로 접속하면 된다.

혹은, ssh 등으로 이미 접속해 있는 상태였다면 로그아웃 한 뒤에 재접속 하면 해결완료.