이번 주 개발 및 공부 정리 - 01/52

Reading time ~4 minutes

신년 계획을 세우면서 읽은 글에서 가장 기억에 남는게 있다면, 계획을 세우는 것도 중요하지만 1주, 1달 단위로 정리하고 평가하는 시간을 갖는 것도 중요하다는 구절이었다. 본래 mac에 깔려있는 Bear에만 정리하고 있는데 생활 파트를 뺀 개발과 공부 파트는 블로그에 공유하는게 좋을 듯 하여 별도로 정리해 올리려한다.

공부 📖

ELK 스택

ELK(Elasticsearch + Logstash + Kibana) 스택에 대해 공부하고 localhost로 테스트해봄. 테스트 로그 파일은 학식알리미 2017-06월부터 12월까지의 운영기록

  • Elasticsearch: 검색 엔진으로만 알고있었는데 DB역할도 겸한다. 관계형 DB가 엔티티 간의 관계가 중요한 곳에서 쓰인다면, 엘라스틱 서치는 여러 데이터를 모으고 분석하기에 적합하다. 사이트 플러그인이 버전 5.0 이상부터는 install 형식이 아니라 standalone 형식으로 바뀌었다. 노드, 샤드 등의 현황을 파악하기에 Head보단 HQ라는 플러그인이 좋았다.
  • Logstash: 여러 input, output 플러그인을 통해 로그를 한 곳으로 모으고 전달하는 역할을 한다. 필터를 통해 내용을 편집할 수도 있다. 잘 쓰기 위해서는 앱에서 로깅할 때 부터 잘 해야한다. 웬만하면 json으로 로깅하는 것이 좋을 듯.
  • Kibana: 엘라스틱서치와 맞물려서 저장된 로그(도큐먼트)를 시각화할 수 있게 해준다. 간단하게 써봤는데 시각화한 엔티티를 모아서 대시보드로 구성할 수 있다는 점이 매우 마음에 든다.
  • Filebeats: 만약 로그가 여러 파일에 분산되어 기록되고 있을 때 Logstash로 가기 전 하나로 모아주는 애라고 이해했다. 써보긴 했는데 굳이 내가 쓸 필요는 없어보여서 뺐다.
  • 파이썬 앱을 사용한다면 eht16/python-logstash-async 라이브러리를 사용해 json 형식으로 로깅하고 Logstash의 input에서 udp(tcp) 5959포트로 받는게 제일 나아보인다. 만약 도커로 분리된 환경이라면 컨테이너들을 같은 네트워크로 묶고 Logstash 컨테이너를 띄워 이쪽으로 보내라고 알려줘야 할 듯 싶다.

Docker

면회가서 Docker, Docker-compose, Caddy에 대해 배움. 배운걸 다시 실습해보고 문서를 읽고 정리가 필요. Docker로 앱을 띄우면 별도의 의존성을 설치할 필요가 없고 이미지에 따라 필요한 세팅이 되어있는 경우가 많아 편하다. -p 옵션으로 포트를 매핑해줘 nginx를 80:80으로 매핑해두거나 elasticsearch, kibana등을 안으로 숨겨 웹 서버의 리버스 프록시 기능으로만 접근 가능하게끔 할 수 있다. 기존에 학식알리미의 url이 p.winterj.me:5000 인게 마음에 안들었는데 이번 기회에 대체해야겠다. A 컨테이너의 서비스가 B 컨테이너의 5959포트로 로그를 날린다고 할 때 둘을 어떻게 인식시켜줘야할지 잘 모르겠다. 이럴 때 쓰라고 compose로 엮어주는 거 같은데 실험이 필요하다.

VPS

엘라스틱 서치를 올리려면 1GB의 메모리는 절대적으로 부족해서 적절한 VPS 서비스를 찾아봤다. 메모리를 가장 주요하게 봤는데 국내의 fun25iwinv 해외의 vpsdime이 제일 나아보인다. 다만 vpsdime은 동아시아 쪽 리전이 없어서 제외할 듯 싶다.

개발 🖥

#35: Improve keyboard interrupt handling in iPython · ManrajGrover/halo

별도의 에러 핸들링 구문(e.g. try-except)없이 spinner를 실행시키고 그 후 spinner가 돌아가는 상태에서 KeyboardInterrupt를 발생시킬 시 루프는 빠져나오지만 spinner.stop() 메소드가 실행되지 않아 별도의 스레드가 내뱉는 출력이 계속 잔재해있다는 문제가 제기되었다. 이를 signal 모듈을 활용하여 인터럽트가 발생할 때 시그널을 캡쳐해 정해진 함수, spinner.stop()을 실행시키도록 개선시켰다. 원래는 별도의 테스트까지 포함시켰지만 로컬머신에서 테스트 할 때는 문제없이 테스트가 성공하는데 appeyor라는 CI툴을 사용해 윈도우 환경에서 테스트 할 때 문제가 생겨서 임시적으로 테스트 케이스를 제거했다.

#32: Available Halo in jupyter notebook · ManrajGrover/halo

jupyter notebook은 일반적인 REPL, 터미널 실행과는 달리 stdout에서 해당 줄을 지우거나 커서를 이동시키는 코드를 사용할 수 없다. 그래서 IPython widget을 새로 만들었으며 ipywidgetsOutput을 활용했다. 처음에는 HTML 클래스로 구현했으나 ansi code로 인한 문자열 색 변경에 문제가 생겨 Output 클래스로 구현했다. 테스트를 작성하려고 했으나 jupyter widget에 대한 테스트를 어떻게 진행하는지 나와있지 않고 구현할 때 참고했던 tqdm의 notebook widget구현체_tqdm_notebook.py을 살펴봐도 별도의 테스트를 진행하지 않았다. 그래서 일단 별도의 테스트를 추가하진 않았다. 만약 추가해야 한다면 실제로 notebook에서 잘 작동하는지 테스트 하기보단 HaloNotebook 클래스에서 출력부를 담당하는 Output 인스턴스에 제대로 값이 추가되고 있는지를 검사하는 식으로 low-level로 접근해 테스트 해야 할 것 같다. 지금은 프로젝트 오너의 리뷰를 기다리는 중이다.

다음주 계획 📅

  • JSON Resume 구성
  • ELK 공부한거 포스팅

이번 주 개발 및 공부 정리 - 02/52

책 읽은 것 말고 결과물은 없지만 이런 저런 포스팅도 읽고 서점 다니며 책 리스트도 정리하고 새 프로젝트를 구상하는 한 주 였다.## 공부 📖### 원래 하려 했던 것- ❌ JSON Resume 구성: [사이트](https://jsonresume...… Continue reading

문서 읽기 - 04

Published on January 15, 2018

File on blockchain 개발기

Published on December 07, 2017