이전 편에서 놓치고 있던 세 가지 부분에 대해서 이야기를 했었는데 데이터 중간점검을 하는 도중 이상한 점이 발견되었다. 특정 버스의 데이터가 제대로 수집되고 있지 않다던지, 아침 시간대에 대충 알고 있는 버스 빈 자리 숫자와 수집된 데이터에 확연한 오차가 발생하고 있었던 것이다. 다시 유심히 경기버스의 데이터를 살펴보니 수집되는 데이터에 index가 고정이 아니라는 사실을 알 수 있었다. 예를 들어 보면 수집되는 데이터를 나타내는 busArrivalInfo 배열에는 32개의 버스 데이터 정보가 있는데 이 배열 안에 내게 필요한 버스 정보들이 있는 위치가 가변이라는 것이다. 예를 들어 A라는 버스가 이른 아침에는 6번 index에 있었지만 어느 시간이 되면 7번 index로 바뀌어 있는 것이다. 데이터 안..
서비스에 도커를 도입하는 배경을 보면 MSA( Micro Service Architecture )로 부터 시작하기 때문에 사실 Container의 크기가 큰 것은 정상적인 경우가 아닙니다. 컨테이너에는 모듈이나 기능 단위를 동작하게 하는 최소한의 패키지만 포함되는 게 일반적인데 깡통 우분투를 만들어서 그 안에 온갖 서비스를 다 말아 넣는 경우는 어떤 경우가 있을까요? 쉽게 생각하면 MSA 이전의 모놀리식 아키텍처( Monolithic Architecture )를 이야기할 수 있겠습니다. 도커는 개발환경과 프러덕트 환경의 간극을 줄이는데 크게 일조하고 있는데 이게 MSA로 정교하게 나뉘어져 있는 서비스에만 국한된 이야기가 아닙니다. 모놀리식 서비스라고 하더라도 개발과 프러덕트 환경에 간극을 없게 할 수 있..
이번에는 프로젝트를 진행하면서 놓친 부분을 언급하고 끝내려고 한다. 프로젝트를 시작한 지 이제 일주일 정도 되었고 데이터는 쌓이고 있지만 매우 중요한 부분이기 때문에 누군가 나와 비슷한 계획으로 움직이려고 한다면 미리 생각해야 할 부분일 것이다. 첫 번째로 이야기하는 건 타깃 정류소의 위치다. 이 프로젝트의 핵심은 내가 타고자 하는 정류소의 데이터를 수집하고 수집된 데이터 안에서 버스의 빈자리를 확인하는 데 있다. 예를 들어 특정 시간대에 빈자리가 항상 5자리 있다고 생각해보면 나는 그 시간대에 버스를 타기 위해 움직이면 된다는 이야기다. 여기서 매우 중요한 부분이 간과되고 있는데 바로 그 정류소에서 대기하고 있는 사람의 수이다. 이미 여섯명이 기다리고 있다면 나는 그 정류소에 제때 도착해봐야 앉을 수 ..
요즘은 사이드 프로젝트 하나를 하더라도 기획자와 개발자 몇 명이 모여서 팀을 이루는 경우를 많이 보는데요, 프론트, 백엔드, 거기에 데이터 분석까지 하려고 하면 역시 클라우드를 사용하는 것만큼 유리한 게 없겠죠? 이번에는 GCP( Google Cloud Platform )에 사이드 프로젝트 팀원들을 초대하고 함께 개발할 수 있는 환경을 꾸리는 방법에 대해서 알아봅니다. 혹시 GCP에 가입되어 있지 않다면 여기 링크를 참고하셔서 가입하시면 되겠습니다. 우선 GCP에 접속해서 팀원들과 함께 진행할 프로젝트를 생성해야 하는데 아래 그림처럼 화면 상단에 프로젝트를 선택합니다. 버튼을 클릭하면 아래와 같이 프로젝트를 변경하거나 새 프로젝트를 생성 할 수 있는 팝업이 출력됩니다. GCP는 폴더라는 개념 하위에 프로..
(용인) 집 근처에서 아침에 강남가는 버스를 타면 시간대에 따라서 앉을 수 있는 확률이 많이 갈린다. 경험으로 이야기하자면, - 06시 30분 전후 : 대략 10번에 9번은 앉을 수 있음 (2층버스) - 08시 30분 전후 : 대략 10번에 8~9번 앉을 수 있음 (2층버스) - 09-10시 사이 : 앉을 수 있는 확률 극악 (1층버스) 쉽게 납득하기 어렵다. 아무래도 학생들이나 출근하는 사람수는 08시 30분쯤이 더 많을 것 같은데 오히려 09시-10시 사이가 버스에 앉기 훨-씬 어렵다. 그런데 특이한 점은 09시-10시 사이에는 2층 버스가 덜 운행되는 느낌. 버스회사에 문의해보니 08시 20분까지만 모든 배차가 2층버스로 이뤄지고 그 이후로는 2층버스의 비율이 점차 줄어든단다. 다시말해 타는 사람도..
Cloud SDK는 구글 클라우드 콘솔(웹 브라우저 화면)에서 행하는 거의 모든것들을 터미널에서 가능하게 해줍니다. 어쩌면 110% 이상 가능할지도 모르겠네요. 아직 콘솔에 붙지 않은 일부 알파 버전은 터미널에만 존재하는 경우도 있으니까요. 더욱이 GUI 버그도 무시할 수 없고, 스크립트로 파이프라인을 구성하는 등의 무언가를 하기 위해서는 SDK는 분명 필수 입니다. 특히 인스턴스에 SSH 접속 할 때는 굉장히 편합니다. 물론 아래처럼 콘솔에서 브라우저를 통해 접속도 가능하지만 다른건 둘째치고 반응속도가 너무 느려서 타이핑하는데 다소 불편함을 감수해야 합니다. 이런 불편함은 SDK를 통해 해결 가능한데요, SDK를 설치하고 인증과정부터 SSH접속까지 알아보도록 하겠습니다. SDK설치 과정은 여기 링크를 ..
Google I/O에서 소개된 TensorFlow의 새로운 내용이 잘 정리된 글을 발견하고 번역해봤습니다. 아래 글의 원본은 TensorFlow @ Google I/O'19 Recap 에서 확인 하실 수 있습니다. 혹시 번역에 문제가 있거나 기타 문의가 있다면 말씀해주세요. :-) Google I/O'19가 끝났습니다! 5월 7-9일에 I/O에서 AI와 머신러닝 세션이 13개 다뤄졌는데요, TensorFlow는 2.0, AI for Mobile과 IoT 디바이스, TensorFlow용 Swift, TensorFlow Extended(TFX), TensorFlow.js, TensorFlow Graphics 등의 세션에서 만나 보실 수 있습니다. 이번 글에는 모든 세션 리스트와 링크가 담겨있습니다. 녹화된 ..
서비스를 운영하면서 적당한 시점이 되면 인스턴스를 AMI( amazon machine image )를 생성하고 그때부터는 해당 이미지를 흔히 이야기하는 오토스케일링, 즉 인스턴스 확장으로 사용하게 됩니다. AWS의 경우에는 대부분의 기능들이 리전 단위로 묶여있는데 AMI도 예외는 아닙니다. 글로벌 서비스를 준비하면서 생성한 AMI를 다른 리전에서 사용할 수 없다면 큰 낭패겠죠? 해당 이미지가 왜 리전에 종속되는지 알 수는 없지만 글로벌 배포를 위해서는 AMI를 각 리전에 복사해서 사용해야 합니다. 리전에 종속된다는 사실을 알고 다른 리전으로 넘기기 위해서 AMI를 Export 하고 Import 해야 하는지까지 생각해봤었는데요, 다행히 복사 기능이 제공되어 간단하게 글로벌로 사용이 가능합니다. 우선 아래와..
MySQL을 터미널에서 접속했을 때 현재 동작중인 쿼리를 보려면 아래와 같은 명령어를 사용합니다. MariaDB [(none)]> show processlist; +-------+----------------+-----------+------+---------+------+-------+------------------+----------+ | Id | User | Host | db | Command | Time | State | Info | Progress | +-------+----------------+-----------+------+---------+------+-------+------------------+----------+ | 14929 | newstyleseller | localhost..
letsencrypt를 통해 인증서를 아래와 같이 발급합니다. letsencrypt certonly --manual --preferred-challenges=dns \ -d example.com -d *.example.com 터미널에서 위 명령어를 입력하면 아래와 같은 메시지를 확인할 수 있습니다. Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Obtaining a new certificate Performing the following challenges: dns-01 challenge for example.com dns-01 challenge for..
매직마우스를 사용하다보면 마우스 가속이 생각보다 편한데 가끔은 이 설정이 필요 없을때가 있습니다. 아니, 오히려 없어야 하는 상황이 말이 맞겠네요. 보통은 게임을 할 때 그렇겠죠? 이 설정을 끄려고 마우스 설정을 살펴보면 관련된 내용이 없다는 것을 확인 할 수 있습니다. 하지만 터미널에서는 defaults 명령어를 마우스 가속도를 설정할 수 있습니다. 일단 현재 설정되어 있는 값을 읽어옵니다. 제 경우에는 1.5로 설정이 되어 있네요. defaults read .GlobalPreferences com.apple.mouse.scaling 이 설정을 끄려면 -1로 write 해주면 됩니다. 아래처럼 말이죠. defaults write .GlobalPreferences com.apple.mouse.scalin..
Ubuntu 16.04에서 Audacity를 사용하던 도중에 어떤 이유로 시스템을 재부팅 했는데 (OS crash로 인해), 부팅이 된 후로는 Audacity가 실행이 안됐습니다. 실행시켜보면 아래와 같은 팝업만 노출이 되었구요. 아마도 프로그램이 실행될 때 대부분의 애플리케이션이 그러듯이 pid 파일을 저장해둘 것 이라고 생각했는데요. 관련해서 보통의 애플리케이션은 pid를 /var/run/ 디렉터리 밑에 저장하도록 처리를 합니다. 하지만 Audacity 관련해서는 찾을 수가 없었습니다. 조금 더 찾아보니 아래 경로에 lock 파일이 있었네요. /var/tmp/audacity-{USER}/audacity-lock-{USER} 해당 파일을 삭제하고 Audacity가 정상적으로 동작되는 것을 확인했습니다...
앞선 글에서 PyTorch Hub를 맛보고자 Load tacotron2+waveglow from PyTorch Hub 를 진행해봤습니다. 이번 글에서는 PyTorch Hub가 어떤 원리로 어떻게 사용되는 것인지 살펴보려고 합니다. 모든 내용을 살펴본 이후에는 우리의 커스텀 모델을 등록하는 것으로 글을 마무리 합니다. torch.hub.load() 자, 이전에 작성했던 코드에서부터 출발 해볼까요? # contents of waveglow.py import torch waveglow = torch.hub.load('nvidia/DeepLearningExamples', 'nvidia_waveglow') torch를 import하고 torch.hub.load() 함수를 통해 미리 학습된 모델을 불러왔습니다. 이..
PyTorch Hub의 기세가 무섭습니다. 코드 구현체를 찾으려면 GitHub을 기웃거리면 되고 컨테이너를 찾으려면 Docker Hub로 가면 되듯이 얼마후면 딥러닝 모델 구현체를 찾기 위해서는 PyTorch Hub를 찾는 날이 올지도 모르겠습니다. 유명한 딥러닝 모델의 구현체들이 아래처럼 속속 등록되고 있는데요, 그중에 유독 눈에 띈 것은 Filter를 audio로 지정했을 때 나오는 Nvidia에서 구현한 Tacotron2, WaveGlow였습니다. 요즘 관심있게 보고 있던 모델이었기 때문에 PyTorch Hub와 함께 묶어서 살펴보기 좋겠다는 생각이 들어서 아래 링크를 참고해서 테스트를 진행해봤습니다. https://pytorch.org/hub/nvidia_deeplearningexamples_wa..
여기 블로그 글을 RSS 받으시는 분들은 아시겠지만 저는 도커 환경을 꽤 좋아합니다. 일단 1) PC를 군더더기 없이 깔끔하게 사용할 수 있는 장점이 있고 2) 정리할때도 깔끔하게 할 수 있습니다. 3) 나중에 다른 시스템으로 옮길 때 호환성은 이루말 할수 없습니다. 아무튼, 이런 장점들 때문에 웬만하면 모든 개발을 도커에서 진행하고 있는데 아래와 같은 상황을 마주했습니다. 한참 딥러닝 모델을 개발하고, 이를 jupyter notebook으로 inference등의 테스트를 진행하려고 보니, Host 머신에서 jupyter의 포트로 접속 할 수가 없지 않겠습니까? Host에서 컨테이너 내부의 포트로 접속하려면 PNAT나 Proxy를 사용해야 하는데 이런것들은 처음 컨테이너를 생성할 때 지정을 해줘야 하는 ..
librosa를 이용해서 load, write 하는 방법은 아래처럼 간단합니다. from librosa.core import load from librosa.output import write_wav y, sr = load('/tmp/test.wav', sr=44100) write_wav('/tmp/new.wav', y, sr) 그런데 write_wav() 하는 과정에서 에러가 발생하는 경우가 있는데요. librosa.util.exceptions.ParameterError: data must be floating-point 원본 파일에 따라 에러가 발생되는 경우가 있는 것 같습니다. 일단 상세한 원인은 librosa쪽 코드를 열어봐야겠지만 가장 간단한 해결방법은 librosa를 다시 설치하는 겁니다. 기..
conda를 사용하면서 activate와 deactivate를 타이핑하는 것이 왜 이리 힘들던지, 그리고 환경을 이동하는 것이 어찌나 불편했는지 모릅니다. 그래서 dialog를 이용해서 아래와 같은 툴을 만들어서 사용하기도 했습니다. 예를 들어 터미널에서. conda라는 명령어를 타이핑하면 바로 위의 dialog가 나옵니다. 그리고 환경을 선택해서 사용했었네요. 소스코드는 아래 링크에서 확인하실 수 있습니다. https://github.com/jybaek/conda_connector 주로 이런 방식으로 사용해오다가 다른 git, docker와 같은 일반적인 명령어들처럼 tab을 이용해서 자동 완성하는 게 더 고급져 보이지 않을까 하는 생각을 하게 됩니다. 그래서 bash_completion을 만들게 되었..
GitHub을 통해 호스팅이 가능해지면서 Jekyll 블로그가 선풍적인 인기인데요, 이 대열에는 제가 활동하고 있는 Google Cloud Platform 사용자 그룹의 홈페이지도 합류해있습니다. 페이지를 운영하면서 소스코드를 수정 할 때면 바로바로 결과물을 확인 할 수 없었기 때문에 자질구레한 커밋들이 너무 많이 남게 되었는데요. 사실 로컬에 Jekyll 환경을 구축하고 결과물을 확인하면서 개발하면 이런 불상사를 막을 수 있습니다만, 그 환경을 구축하면 또 뭔가 찝찝한 설치 파일들이 OS 구석구석에 설치되겠죠. 아래처럼 gem이 기본적으로 설치되어 있어야 하고 gem으로 bundler, jekyll 설치해야 합니다. 그리고 끝으로 번들을 이용해서 서버를 올리는 구성인거죠. 뭐 설치되는게 이정도면 양반이..
https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md 평소 vim을 즐겨 쓰고 있는데 회사 동료가 vim 패치를 하셔야 하지 않냐며 링크를 던져주셨습니다. 링크에 취약점 내용을 살펴보니 1) 공격자는 nc(netcat)을 통해 포트를 열고 있고 2) 공격자가 배포한 특수 파일을 보통의 사람이 vim으로 열었을 때 3) 파일에 감춰져있는 코드가 동작. nc로 shell을 실행시켜 공격자에게 연결해주는 방식이네요. 셸을 통째로 열어주는 것이기 때문에 상당히 위험한 취약점이지만 이 모든 게 성립하려면 1) 사용자가 계속 특수 파일을 열고 있어야 하고(닫으면 공격자와 연결된 세션이 종료됨), 2) 사용자의 OS에 설치된..
이전 편 : 다시쓰는 Flask unittest (상편) 앞서 우리는 Flask의 기본 예제코드를 pytest를 통해 테스트해봤습니다. 몇 몇 분들은 아마 눈치를 채셨을지 모르겠지만 사실 앞에서 테스트한 내용은 함수 단위의 테스트지 실제 Flask 서버와 무관합니다. /hello, /world 와 같은 API를 테스트한다고는 했지만 사실상 hello(), world() 함수를 호출하고 끝냈으니까요. 이번에는 조금 더 현실적인 Flask 코드를 놓고 unittest를 진행하는 방법에 대해서 알아보도록 하겠습니다. 일단 아래처럼 미리 준비된 코드를 가져와봤습니다. #!/usr/bin/env python # coding=utf8 # content of my_flask.py # Restful API from f..
- Total
- Today
- Yesterday