콘텐츠로 건너뛰기
Home » Development » Python » Page 2

Python

ZMQ 파이프 만들기

ZMQ 프록시등에서 캡쳐된 데이터를 확인하려고 할 때와 같이 간단하게 1:1로 데이터를 주고 받을 수 있도록 두 개의 PAIR 소켓을 사용하여 파이프를 만들어 활용할 수 있다. 다른 소켓의 구성과 무관하게 스레드간 대화는 inproc 프로토콜을 사용해서 짝지은 소켓을 사용하여 만들 수 있다.

더 보기 »ZMQ 파이프 만들기

수식 파서를 이용한 계산기 만들기

일전에 수식을 직접 입력 받아 후위식으로 변환하여 계산하는, 사칙연산과 괄호를 처리할 수 있는 계산기를 만들어 본 적이 있는데, 1이 계산기는 지금까지 유용하게 잘 쓰고 있는 중임, 이번에는 좀 다른 계산기를 만들어보고자 한다. 사실 파서를 한 번 직접 구현해보고 싶어서 이리 저리 알아보다가 가장 간단하게 만들어 볼 수 있는 구현체가 수식 파서가 아닐까 해서, 정말 실용적으로 사용 가능한 수식 파서를 사용한 계산기를 구현해 보려고 한다.

더 보기 »수식 파서를 이용한 계산기 만들기

Python 101 : 리스트

지난 글에서 파이썬에서 사용되는 가장 기본적인 값의 유형에 대해 살펴보았다. 오늘은 리스트에 대해서 이야기해보려고 한다. 리스트는 여러 개의 값이 연속적으로 배치된 일종의 집합이다. 다른 프로그래밍 언어에서는 배열(Array)이라고 하기도 한다. 사실 배열과 다른 리스트라는 자료 구조가 별도로 존재하기는 하는데 (연결 리스트 같은 걸 들어본 적이 있을지도 모르겠다.) 파이썬의 리스트는 C의 배열과 크게 다르지 않다고 생각하면 된다.

더 보기 »Python 101 : 리스트

ZMQ 소켓을 모니터링하기

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

DEALER, ROUTER로 REQ, REP 구현하기

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

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

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

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

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

점자 텍스트로 이미지 표현하기

지난 글에서 이미지를 아스키문자로 렌더링하는 방법에 대해서 알아보았는데, 이번에는 조금 다른 이미지 렌더링 방식에 대해서 알아보자. 인터넷에서 돌아다니는 다음과 같은 아스키아트를 본 적이 있을지 모르겠다. 기존의 아스키아트는 글자 1개가 픽셀 1개를 표현하는데, 이런 종류의 아스키 아트는 1글자가 픽셀 8개를 표현한다. 2×4의 점으로 한 글자가 이루어지는 이 문자들은 유니코드 점자 문자 세트의 글자들이다. 각각의 점이 on/off 상태로 총 128개의 문자를 표현할 수 있기 때문에 실질적으로 모든 픽셀을 표현하는 것이 가능하다. 점자 코드의 첫글자는 0x2800로 빈 칸을 표현하며, 이후 아래방향으로 그리고 다시… 더 보기 »점자 텍스트로 이미지 표현하기

이미지를 아스키코드로 렌더링하기

인터넷에 보면 꽤나 유명한 사진 이미지를 아스키문자로 표현해놓은 것들을 종종 볼 수 있다. 선이나 슬래시 문자를 사용해서 그림처럼 그리는 것들은 아마도 장인정신을 발휘하여 한 땀 한 땀 수놓은 것들이겠지만, 그렇지 않고 문자와 문장 부호들만으로 멀리서 보면 그림처럼 보이게 표현해놓은 예들이 무척 많다. 이런 아스키 아트들은 사실 약간의 아이디어만 있으면 간단히 만들 수 있는데, 오늘은 아스키 코드로 이미지를 렌더링하는 방법에 대해서 알아보자. 이미지 처리를 위해서는 간단히 PIL 정도의 라이브러리만 있으면 된다.

더 보기 »이미지를 아스키코드로 렌더링하기

OpenCV를 사용하여 두 이미지의 다른 부분 찾기

두 이미지의 구조적 유사성을 분석하는 알고리듬으로 SSIM (Structural Similarity)가 있는데, 이를 사용하면 두 이미지가 어느 정도로 유사한지, 어느 부위가 다른지를 알아낼 수 있다. ssim을 수행하는 함수는 scikit-image 라이브러리가 제공하고 있으니, 이를 사용해서 두 이미지의 다른 부분을 찾는 작업을 수행할 수 있다. 다만 이미지를 비교하기 위해 필요한 전처리와 이미지 차이를 구분한 이후의 처리를 위해서는 opencv의 사용이 필수불가결하다. https://docs.opencv.org/master/modules.html 에서 각 모듈에 대한 정의와 Python API를 볼 수 있다. 필요한 라이브러리 설치 몇 가지 라이브러리가 필요하다. 먼저 opencv-python을 설치해서 OpenCV를 사용할 수… 더 보기 »OpenCV를 사용하여 두 이미지의 다른 부분 찾기