Google HackFair 2017, Android Things, 만들고 싶은 것

Google HackFair 2017

Android Things with Raspberry Pi 3

Android Things, TensorFlow, Image Classifier

구글 핵페어 참가 신청을 작성할 지 고민이다. 어제 저녁 라즈베리 파이 3를 주문했고, Android Things를 올린 뒤에 생각해보기로 했다. Android Things를 쉽게 올리고 개발이 가능하다면 참가 신청을 우선 하고 개발을 해보려한다. 집에 굴러다니는 Pi 카메라가 있으니까 그걸로 물체를 인식해서 인사하는 기계를 만들까 한다. (나중에 변경될 가능성이 많다.)

Indie Setlist 1차 버전 완성

목표

  1. Python 3.5.1 Flask, MongoDB, Twitter API, YouTube Data API 를 이용하여 Indie Setlist 1차 버전을 완성했다. 현재 구현한 기능은 일정 기간마다 공연 정보 수집, 아티스트의 공연 영상 정보 수집, 공연 정보를 바탕으로 공연 영상 목록 보여주기를 구현했다. 일부 작업(공연 영상 수집을 위한 아티스트 이름 입력)은 수동으로 해야하지만 나머지는 봇이 하도록 구현했다. 목표는 어제 끝내서 동작 영상 만들고 구글핵페어에 참가하는 것인데, 시간을 맞추지 못했다. 아쉽다.

  2. 단순히 Twitter API를 이용해서 공연 정보를 수집하려했지만, 인디스트릿의 트윗 내용으로는 정확한 일자를 알 수 없었다. (내일 공연, 오늘 공연, 토요 공연 등으로 나타나있다.) 그래서 ‘내일’, ‘오늘’ 등의 단어로 정확한 공연 일자를 계산했다. 그러나 새벽 1시~2시 쯤에 작성한 트윗은 정확한 공연 일자를 제공하지 못해서 제외시켰다.

  3. YouTube Data API를 사용하는 건 간단했다. 하지만 검색 결과가 많아서 원하는 결과만 필터링하는 작업이 시간이 좀 걸렸다. 먼저, 6가지 검색 문장을 만들어 유사한 결과를 얻어 목록을 만들었다. 영상 제목에서 날짜 문자열을 정규식으로 추출하여 공연 일자를 얻었고, 공연 장소와 영상 제목의 유사도를 비교하여 임계치를 넘어서면 공연 장소로 확정지었다. 이렇게 구성된 영상 목록에서 아티스트, 공연 장소, 공연 일자로 검색한 영상은 거의 확실한 공연 영상으로 보여준다. 다음으로 아티스트, 공연 일자로 검색한 영상은 아마도 공연하지 않았을까 하는 영상으로 보여준다.

  4. 내가 좋아하는 아티스트의 지난 공연의 셋리스트를 보기 위해 이런 서비스는 없는지 검색해봤으나 국내에는 없어서 직접 만들었는데, 내가 생각한대로 결과를 보여줘서 재밌었다. 앞으로 고도화 작업이 필요하고, 라즈베리파이에 이식하는 작업도 필요하고, UI를 조금 더 편하게 이용할 수 있도록 개선해야한다. 공연 영상 정보를 수집하는 것도 일정 기간마다 봇이 수행하도록 구현해야한다. 나중에 가능하면 각 공연장 공식 채널로 공연 정보를 수집하는 것도 구현해야겠다.

alt 2016-09-19 01

돌고돌고돌아 자체서버(라즈베리파이)

Google HackFair 2016

  1. Google HackFair 2016에 참여하기위해 프로젝트를 개발하고있다. 구글 기술을 많이 쓰면 우대한다고해서 예전에 써봤던 Google App Engine을 다시 꺼내봤다. Google Compute Engine을 쓰기엔 처음부터 세팅을 해야하고, 과금이 될 수도있는 위험을 안기싫었다. 그래서 어느정도 플랫폼이 갖춰져있고, 내가 할 일이 적은 Google App Engine을 선택했다.

  2. Google App Engine 콘솔 화면은 2년 전에 비해 완전히 바뀌어있었고, 뭔가 더 좋아보였다. 하지만 내가 사용할 기술과 잘 연동되는가가 중요했는데, 이것때문에 일주일 정도 삽질했다. 난, Flask에서 Tweeter Search API를 이용해서 트윗을 얻고, YouTube Data API를 이용하여 영상 정보도 얻고싶었다. 로컬에서는 트윗을 잘 얻어왔다!(예이!) 유튜브 영상도 잘 얻어왔다! 하지만 Google App Engine에 붙이자마자 에러를 뿜어냈다. 이런저런 작은 에러들을 해결하다가 결국에는 막혔던 에러는 Socket API 사용에 관한 것이었다. 로컬에서는 얼마든지 socket 모듈을 사용할 수 있지만 Google App Engine에서는 서버에 부하가 걸리니 제한을 걸어놓은 것 같았다. 그 문제를 해결하기 위해서는 과금을 위한 카드 정보를 입력하고 Socket API를 사용하도록 설정해야해서 결국 포기했다.

  3. 그래서 난 돌고돌고돌아 라즈베리파이에 자체서버를 만들기로했다. 현재 서비스 구조를 보니 Ubuntu + Flask + MongoDB + Tweeter API + YouTube Data API 정도만 잘 동작하면 될 것 같다.

p.s. Heroku도 사용해봤는데, 튜토리얼을 따라가는 도중에 생긴 문제때문에 집중력을 잃고 결국 포기…했다. heroku도 좋은 것 같은데…

Pycon APAC 2016 참가 후기

Pycon APAC 2016

  1. 부산에서 소스코드 리딩 모임(주로 파이썬)을 3년째 진행하고있는데, 개발자 페스티벌(이라고 표현하고싶다)을 처음 참가했다. 부산에서도 GDG에서 주최한 행사가 몇 번 있었지만 사정상 참가하지 못해서 아쉬웠다. 기대를 많이했고, 당연히 만족했다. 발표 프로그램 외에 오픈 스페이스 토크 프로그램이 좋았고, 하루의 끝에서 하는 라이트닝 토크도 좋았다. 물론, 가장 좋았던 건 티셔츠였다. 내게 맞는 사이즈가 있을까 걱정했지만, 4XL까지 준비되어있다는 말에 마음이 놓였다.

  2. 가장 인상 깊던 프로그램은 어느 흔한 파이썬 개발자의 집 소개 이다. 올해 소스코드 리딩의 주제가 라즈베리파이로 스마트홈(비스무리한그)을 구축하는 것인데, 우리의 주제의 업그레이드 버전을 진행하다 망한 이야기를 들을 수 있어서 좋았다. (현재 완성이 안된 것을 망했다고 표현했지만 9월 2일에는 완성이 될 것이고, 10월에는 경험담을 공유할 것이라고 한다) 발표가 끝난 뒤 개설된 오픈 스페이스 토크에 참여하여 발표 내용 외에 지식도 공유하고 여러 이야기들을 들을 수 있어서 더욱 좋았다.

  3. 하나 아쉬운 점은 오픈 스페이스 토크 등록을 메인홀 쪽 게시판에서 할 수 있는데, 게시판을 보고 해당 방을 찾아가면 사람들이 없거나 수시로 추가되어 오픈 스페이스 등록 현황을 어디서나 확인 할 수 없어서 불편했다. 잦은 변화가 있고, 참여도를 높이려면 개설이 쉬워야(포스트잇을 붙이는 것으로 끝. 참 쉽죠?)하는게 문제라 웹페이지나 다른 등록 방법을 통해 개설하는 것은 동의하지않는다. 그러나 열린 스페이스 토크를 홍보하고 싶은 사람 혹은 나같은 행인 3이 챗봇(슬랙, 텔레그램, 지터 등등등등등)에 호실, 시간, 주제를 입력하는 것으로 웹서버에 저장된다면 어디서든지 확인할 수 있어서 좋을 것 같다. (오용에 대해 생기는 몇 가지 문제점이 떠오르지만 생략했다)

  4. 기회가 있을 때 다른 개발자 페스티벌을 참가해야겠다.

alt Respect Diversity.

alt 코딩배틀에 참가하여 얻은 라이언 목배게, 내려가는 길에 유용하게 써주겠어.

alt 아쉬움이 남는 라이트닝 토크

p.s. 가능성은 낮겠지만 부산에서도 파이콘이 열린다면 좋겠다. (아무래도 비용이 많이 들겠지)

p.s.#2 13일 저녁 먹고 집에 와서 Flask, Google App Engine, Telegram을 이용해서 봇을 만들어 OST를 확인 할 수 있는 기능을 14일 써보려고했지만, 완성하지 못해서 쓰지는 못했다. 그래도 텔레그램 봇을 만드는 방법, Flask를 Google App Engine에 배포하는 방법, Python으로 NDB를 사용하는 방법을 알게되었다.

p.s.#3 github으로 새 파일을 생성할 때, 제목을 입력하다가 실수해서 백스페이스 혹은 맥의 delete를 누르면 이상한 위치에서 지우기를 수행하는데, 이 부분이 수정된 것 같다. 제목을 입력할 때 부담감을 덜 가져서 돼서 좋다.

PiNVR 기본 버전 완성

PiNVR-Manager

  1. 샤오이 스마트 홈 카메라는 아이폰 앱과 연동하여 충분히 훌륭하게 사용할 수 있다. 놀고있는 라즈베리파이를 활용하고 싶었다. 라즈베리파이에 고용량 MicroSD 카드를 삽입하여 각 카메라당 최소 3 일은 저장할 수 있게하는게 목적이다.

  2. 프로젝트의 요소는 1. RTSP 영상을 받아 메모리에 저장하고, 새로운 RTSP 주소로 분배하는 NVS, 2. NVS를 관리하는 Manager, 3. Manager를 웹브라우저에서 다룰 수 있게하는 Web Server 3 가지다. 무려 삼위일체! 각 모듈을 구현한 언어가 달라 폴리글랏 프로그래밍을 경험했다. 재밌는 경험이다.

  3. NVS는 임성조 님의 도움을 받아 기본 형태의 Qt 소스코드를 받았고, 필요에 맞게 순수 C++로 변환하고 기능을 구현했다. RTSP 주소로 영상을 받은 뒤, 실행 할 때 받았던 저장 위치에 h264 포맷으로 저장하고, 새로운 RTSP 주소 체계로 영상을 분배한다. IDE의 도움 없이 오직 터미널에서 커맨드라인에서 g++로 빌드했는데 재밌는 경험이었다. 명령어에 인수 하나 추가할 때마다 뿜어내는 오류를 스택오버플로우에서 찾아서 잡아냈다. 빌드 후에는 gdb로 터미널에서 디버깅해서 실행 단계의 오류도 잡아냈다. 소스코드는 정리한 뒤에 PiNVR에 푸쉬할 계획이다.

  4. Manger는 Python 2.7 버전으로 구현했다. 새로운 RTSP 주소를 추가하거나, 기존 주소를 삭제할 수 있다. DB에 RTSP 주소 정보를 저장하기때문에 Manager를 재실행 하더라도 NVS를 자동으로 등록해준다. 그 외에 상태 확인 스레드가 각 NVS의 상태(ALIVE, DEAD, ZOMBIE)를 검사하는 기능, DB에 주소를 등록했지만 지금은 NVS를 Disable하는 기능도 사용할 수 있다.(가까운 미래에) 이후에는 해당 주소에 대한 설정 변경 기능을 구현해야 한다. Manager가 표준 출력을 통해 명령어를 입력하고, NVS가 표준 입력을 받아 설정 내용을 변경하는 방법을 이용한다.

  5. Web Server는 Flask로 구현했다. 소스코드는 편의상 Manager와 같이 구현되어있다. Flask를 선택한 이유는 Microframework 때문이다. 쉽게 구현하고 싶고, 페이지가 적고, 가벼운 Web Server를 만들 때는 Flask가 편리하다. 아무나 접근하는 것을 막기 위해 로그인 기능을 구현했지만 계정의 비밀번호 변경 기능은 아직 구현못했다. UI는 semantic-ui 를 이용했다. 이쁘고, 사용하기 편하고, 컴포넌트가 많다. 메마른 감성의 개발자 웹페이지에 단비같은 존재라고 생각한다.

  6. 이제부터 시작이다. 저장 공간이 부족하면 오래된 영상부터 삭제하지만, 북마크한 시간은 삭제 대상에서 제외해야한다. 음.. 녹화 스케쥴도 설정할 수 있으면 언젠가 쓸모있겠지. 여력이 된다면 녹화된 영상 재생기도 만들어야겠다.

alt 2016-08-06 01