콘텐츠로 건너뛰기

ZMQ 소켓을 모니터링하기

zmq 소켓을 사용한 확장 패턴에서 zmq 프록시를 사용하는 경우, 일반적으로 두 개의 소켓을 사용하여 프론트엔드와 백엔드로 사용하는데, 세번째 소켓인 캡쳐를 추가할 수 있다. 캡쳐는 주로 publisher를 사용하는데, 이 소켓으로는 프록시 내부에서 흘러가는 모든 데이터가 캡쳐되어 발송된다. 이런 방식으로 우리는 zmq 프록시의 내용을 모니터링할 수 있다. 이와는 별도로 각각의 zmq 소켓은 그 자체로 모니터링 기능을 제공한다. 소켓은 프로그램과 네트워크 사이를 연결하는 인터페이스로, 소켓을 통과하는 데이터를 캡쳐링할 필요는 없다. 대신에 소켓의 모니터링 기능은 소켓이 네트워크에서 피어와 연결할 때 발생하는 이벤트를 감지한다. 소켓의… 더 보기 »ZMQ 소켓을 모니터링하기

ffmpeg로 영상 일부 구간 빠르게 자르기

큰 영상 파일의 일부 구간만 필요한 경우에 ffmpeg를 사용하면 빠르게 일부분을 추출할 수 있다. 이 때 사용되는 파라미터는 -ss-to 로 각각 결과물의 시작과 끝 시점을 정의한다. 이때 시점을 정의하는 문법은 h:mm:ss 로 사용한다. (그래서 특정 시간부터 t 초라고 한다면 시간을 계산해야 한다…)

더 보기 »ffmpeg로 영상 일부 구간 빠르게 자르기

수식을 조합해서 1~40을 만들 수 있는 수 찾기

이 문제는 작년에 조카의 수행평가 관련해서 질문 받은 것인데, 네 개의 서로 다른 숫자와 기본연산자를 조합하여 1~40의 모든 정수를 만들 수 있는 숫자를 찾는 문제였다. 사실 이 문제가 코딩 문제가 아닌 수학 수행 평가라는 점에서 눈을 의심하지 않을 수 없는데, 4개의 숫자로 구성되는 순열(24개)에 대해서, 각 숫자 사이에 들어갈 수 있는 연산자의 경우는 중복을 허용하여 5가지 (사칙연산에 필요한 4개와 연산자를 쓰지 않고 숫자를 붙이는 경우 1개 더)이기 때문에, 숫자 4개가 결정되었을 때 만들 수 있는 식의 개수는 무려 3,000 개이다. 1~9의 9개 숫자 중에서 4개를 선택하는 경우는 126가지이므로 4개의 숫자를 사용해서 만들 수 있는 식의 경우는 총378,000 가지이고, 이 문제는 전수 검사 (운이 좋다면 중간에 40가지의 수를 만드는 식을 만들 수 있는 조합을 찾을 수 있겠지만)를 통해서 찾아야 하는 수 밖에 없고, 결국 가능한 경우를 찾으려면 최악의 경우 거의 38만개의 식을 검사해야 하는데 이걸 컴퓨터의 힘을 빌리지 않고 수행평가를 하라는 것인지 이해가 가지 않았기 때문이다.

컴퓨터를 사용해서 이 문제를 해결하는 방법 자체는 간단한데, 의외로 실행 시간이 오래 걸릴 수는 있다. 이 문제에서는 어떻게든 숫자 4개의 조합에서 1~40까지를 만들 수 있는 경우를 찾으면 바로 종료하여 최대한 시간을 단축하는 방법을 사용했다.

더 보기 »수식을 조합해서 1~40을 만들 수 있는 수 찾기

DEALER, ROUTER로 REQ, REP 구현하기

이전 글에서 REQ, REP가 메시지를 주고 받을 때 그 속에서 벌어지는 일들에 대해서 살펴본 바 있다. 그리고 이를 통해 REQ > ROUTER > DEALER > REP 로 이어지는 확장 패턴이 어떻게 맞물려 돌아가는지 확인했다. 그렇다면 과연 ROUTER, DEALER 소켓은 중계기로서의 의미만 있는 것일까? 그렇지 않다. ROUTER/DEALER 소켓은 그 자체로도 유용하게 사용될 수 있는데, 이들 소켓은 REQ/REP 소켓처럼 수신-발신 사이크의 제약을 받지 않는다. 따라서 이들 소켓을 사용하면 완전히 자유로운 비동기 패턴을 구축할 수 있다. 그러한 확장 패턴을 탐구해보는 기초로서, 이 글에서는… 더 보기 »DEALER, ROUTER로 REQ, REP 구현하기

SQLite – STRICT 테이블

얼마전 SQLite의 새 버전인 3.37.0이 릴리즈되었습니다. 주로 안정성이나 성능 개선 위주의 업데이트만 있다가, 이번 버전에서는 STRICT 테이블이라는 새로운 기능이 추가되었습니다. 이 기능은 다른 DBMS 처럼 테이블 칼럼의 형식에 맞는 값만 저장하도록 제한하는 기능으로, 새로 생성하는 테이블의 옵션 형태로 설정하게 됩니다. SQLite3는 다른 DBMS와 달리 자료의 형(type)에 대해서 유연한 편입니다. 예를 들어 INTEGER 타입으로 정의된 칼럼에 “123” 같은 문자열을 저장하려 한다면 SQLite는 자동으로 이 문자열을 정수형태로 변환을 시도합니다. 따라서 저장되는 값은 문자열이 아닌 정수값 123이 저장됩니다. 만약 “xyz” 같은 변환이 불가능하거나,… 더 보기 »SQLite – STRICT 테이블

파이썬으로 구현하는 채팅앱

파이썬으로 터미널 상에서 돌아가는 간단한 채팅앱을 구현해보고자 한다. 채팅 앱은 서버와 클라이언트로 구성되며, 각각의 클라이언트가 보내는 메시지를 모든 클라이언트에게 되돌려주면 된다. 이 때 일반적인 에코서버 구현과 다른 점은, 대화 메시지가 오고 가는 방식은 비동기적이기 때문에 실제로는 서버와 클라이언트 모두 각각 수신용과 발신용의 2개의 소켓을 준비해야 한다는 점이다. 어쨌든 이것은 ZMQ를 사용하면 손쉽게 해결할 수 있다. 다음으로 채팅앱에서 어려운 점은 일반적인 input() 함수에 관한 것이다. 채팅앱은 키보드를 통해 메시지를 입력하는 중간에도 수신한 메시지를 출력할 수 있어야 한다. 그런데 input() 함수는 블록킹함수이기… 더 보기 »파이썬으로 구현하는 채팅앱

Subprocess 모듈 사용법 (2021 업데이트)

subprocess 모듈을 사용하는 방법에 대해 정리한 이전 글이 있는데, 이 글도 2021년 기준으로 벌써 6년전 글이고, 실제로 글이 발행됐을 때쯤에 파이썬 3.5가 나오면서 subprocess 모듈이 다시 업데이트 됐었다. 지금은 그 글에서 설명하고 있는 여러 API들은 레거시로 분류되어 있다. 그래서 좀 늦은 감은 있지만 subprocess 모듈의 사용법을 새롭게 정리해 보고자 한다. 급한 사람들을 위한 요약 딱 두 가지이다. 이제 subprocess.run() 함수만 쓰면 된다. run() 의 리턴값인 객체에서 리턴코드, 출력 내용 등을 확인할 수 있다. 물론 함수에 전달하는 추가적인 파라미터에 따라 여러가지… 더 보기 »Subprocess 모듈 사용법 (2021 업데이트)

ZMQ 소켓 – Dealer, Router 이해하기

이전 글에서 프록시를 소개하면서 단순한 REQ – REP 패턴의 네트워크 중간에 중간 매개로 프록시를 넣어 REQ – ROUTER – DEALER – REP 형태로 패턴을 확장하는 예를 살펴보았다. 이 때, ROUTER – DEALER 사이에서 오가는 데이터를 보면 REQ-REP 사이에서 오가는 데이터와 다르게 추가된 프레임이 보인다는 것을 볼 수 있었다. 이번 글에서는 이런 현상은 왜 일어나며, ROUTER가 무슨 짓을 벌이는지에 대해 소개하고자 한다. 적어도 이 개념을 이해한다면 ZMQ를 통해서 훨씬 더 유연하고 창의적인(?) 패턴을 만드는 것도 가능하리라고 본다. 먼저 간단한 REQ-REP 패턴에서… 더 보기 »ZMQ 소켓 – Dealer, Router 이해하기

마이크로소프트 무선마우스 4000 사용후기

코로나로 인해서 학교에서 원격 수업을 하기 시작하면서 딸아이도 본격적으로 컴퓨터를 사용하게 됐다. 집에서 사용하는 노트북을 구매할 때 받은 미니 무선 마우스가 있었는데, 몇 번 떨어뜨려서 건전지 수납부 뚜껑이 떨어져서 잃어버렸다. 그 이후로 쓰는 중에 건전지가 빠져서 마우스가 꺼지는 일이 자주 있어서 새 마우스를 알아보았다. 아무래도 손이 작은 아이가 주로 쓸 것이라 크기가 작은 것들 위주로 알아보려 했는데, 별도의 USB 리시버를 꽂지 않아도 사용할 수 있는 블루투스 연결을 지원하는 마우스들도 많이 있더라. 노트북을 가지고 다니는 일이 잦은데, 이 리시버가 작긴하지만 가방에… 더 보기 »마이크로소프트 무선마우스 4000 사용후기

Julia 정규식 다루기

Julia에서 정규식은 별도의 모듈을 반입하지 않고 사용할 수 있으며, 패턴 자체는 Base.RegExp 타입으로 표현된다. 정규식 패턴을 만들 때에는 r"..." 형태의 리터럴로 바로 정의할 수 있다. (대신, raw string문자열은 raw"..."이다.) 한번 생성한 Regexp 값은 .pattern 필드로 그 패턴을 다시 확인할 수 있다. 참고로 r" .... " 리터럴은 정규식 패턴을 좀 더 손쉽게 사용할 수 있게 하기 위해 백슬래시를 이스케이프해준다. 따라서 \d 등과 같은 이스케이프 문자 시퀀스에서 백슬래시는 두 번이 아니라 한 번만 쓰면 된다. (r"\d+")

더 보기 »Julia 정규식 다루기