Home » python

python

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 업데이트)

ZMQ 소켓 – Dealer, Router 이해하기

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

Altair에서 변형 함수 사용하기

Vega-Lite는 몇 가지 간단한 데이터 변형 함수를 제공합니다. 물론 보통의 경우에 차트로 시각화하려는 원본 데이터는 DataFrame의 형태로 나와 있고, 데이터 프레임 자체를 조작하여 원하는 변형을 미리 처리하는 것이 보다 유연하고 강력합니다. (데이터 프레임은 원래 그럴려고 쓰는 것이니까요) 그렇지만 원본 데이터를 미리 조작하기 어려운 경우라면 간단한 변형은 Vega-Lite의 기능을 활용하는 방법도 고려해볼 수 있습니다. 오늘은 이 글을 통해서 Altair에서 데이터 변형을 적용하는 방법을 알아보겠습니다. 인코딩에서 집합 함수를 사용하기 가장 간단하게 쓰이는 방법으로는 차트 정보를 인코딩할 때, 필드 이름 대신에 집합 함수를… 더 보기 »Altair에서 변형 함수 사용하기

Jupyter용 시각화 라이브러리 Altair

파이썬 생태계에서 데이터 시각화 분야에서는 matplotlib이 사실상 독보적인 위치에 있음은 반론의 여지가 별로 없긴합니다. 하지만 일관성이 부족한 API나 그래프의 외관을 예쁘게 만드려면 과다한(?) 노동이 필요한 점은 단점으로 지적받기는 합니다. 이런 문제를 극복하기 위해서, 기본적으로 예쁜 그래프를 만들 수 있도록 해주는 Seaborn이나, R의 ggplot의 인터페이스를 이식해온 plotnine 같은 대안이 존재합니다.

데이터 시각화에 대한 니즈는 유독 파이썬에서만 있는 것은 아니기에, 다른 많은 언어들에서도 훌륭한 데이터 시각화 도구들이 나오고 있습니다. jupyter의 경우 웹 기반의 노트북을 지원하고 있기 때문에 자바 스크립트로 만들어진 프론트엔드 시각화 도구를 접목하여 사용하기가 용이합니다. 자바 스크립트 쪽에서 선언적인 API, 높은 자유도 등의 요구조건을 만족하는 시각화 프론트엔드로 Vega가 있습니다.

더 보기 »Jupyter용 시각화 라이브러리 Altair

선형대수를 사용해서 연립방정식 풀기

연립방정식을 손으로 푸는 방법으로는 학교에서 소거법이나 대입법 같은 테크닉을 배운다. 하지만 간단한 1차 연립 방정식을 다른 방법을 사용해서도 풀 수 있는데, 이 다른 방법이라는 것이 손으로 풀기에는 더욱 귀찮지만 컴퓨터에 적용할 수 있다는 장점이 있어서 소개한다. 한개에 600원하는 귤과 한 개에 1000원하는 사과를 모두 12개를 사고, 8800원을 지불하였다. 귤과 사과는 몇 개씩 샀는지 구하라. 이 문제에는 귤과 사과의 개수를 더해서 12, 구매 금액을 모두 더해서 8800원이라는 두 개의 조건이 등장한다. 이 두 조건을 식으로 쓰면 다음과 같을 것이다. 600 *… 더 보기 »선형대수를 사용해서 연립방정식 풀기

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

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

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

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

순열과 조합 – itertools (python)

알려져 있는 원소들로 구성되는 가능한 모드 조합 및 순열을 구하려 할 때, 이를 직접 구현해보는 것도 좋지만 itertools 모듈에 있는 함수를 사용하는 것을 추천한다. 이 함수들은 기본적으로 제너레이터 함수이기 때문에 한번에 리스트 등으로 만들기 전까지는 메모리에 큰 부담을 주지 않으며 성능도 적절한 편이다. 오늘은 itertools의 함수 중에서 순열과 조합에 관련된 함수들을 알아보도록 하자.

더 보기 »순열과 조합 – itertools (python)