자택경비대

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__)