System Compleat.

외국인 노동자

Stories

(younjin.jeong@gmail.com, 정윤진) 

일요일 아침이다. 우연한 계기로 해외의 은행에서 일을 시작한지 어느덧 5개월째에 접어든다. 지난 5개월은 무수히 많은 일들의 연속이었다. 너무나도 새로운 일의 환경, 회사는 싱가포르 로컬이지만 영국, 호주, 인도, 포르투갈, 중국, 베트남 그리고 싱가포르 사람들까지 정말 다양한 국가의 사람들과 함께 일하고 있다. 

새 직장

어떤 사람은 은행에서만 20년 넘게 일하고 있고, 또 다른 사람은 얼마전에 스타트업에서 성공을 이끌던 사람도 있으며 실리콘밸리에서 일하다가 넘어온 사람도 있다. 같이 일하는 모두가 하나하나 살펴보면 정말 명석한 사람들이다. 간혹 이렇게 명석한 사람들 사이에서 내가 일해도 되나 하는 생각이 들기도 한다. 

최근 10여년간 다녔던 회사들에서는 어떤 일을 진행하기 위해 누구에게 반드시 승인이 필요한 적은 없었다. 아마도 어떤 새로운 일을 시작하게 될때는 그것이 새로운 일이기 때문에 종전의 일들과 크게 관계가 없기 때문이기도 했으며, 보통 필요한 권한을 위임 받는데 큰 문제가 없었기 때문이기도 했으리라. 

하지만 그야말로 엔터프라이즈에서 일을 하기 시작하니 모든것이 다른 사람들과 연결되어 있다. 단순한 내부 임직원 대상 설문을 돌리는데도 설문을 위한 질문을 시스템에 등록하는 사람 따로, 그 설문 결과를 볼 수 있는 사람 따로, 그 설문에 쓰여진 질문이 맞는지를 검토해야 하는 사람들 따로, 뭐 그런 식이다. 가설을 세우고 실험을 해서 결과를 얻는다는 것이 이전 회사들에선 그토록 간단했는데 큰 회사에서는 그것마저 쉽지 않다. 

아마 설문 시스템을 담당하는 일로 그 사람을 채용했을리는 없을 것이다. 이것이 사실 더 심한 문제라고 볼 수 있는데, 각 개인은 항상 다른 어떤일로 바쁘다. 무언가 다른 일로 바빠하는 사람에게 설문의 결과가 어떻게 진행중이냐고 묻고 다시 응답을 받는 것 자체가 서로에게 딜레이가 되는 상태가 된다. 동시에 왜 그런지도 이해한다. 

우리는 서비스와 애플리케이션 구조에 있어 간결함을 유지하고 핵심 기능에 집중 해야한다는 말에 익숙하다. 지난 십년간 클라우드를 기반으로 발전해온 여러 테크 회사들의 성공사례 뒤에는 어김없이 이 내용이 뒤에 숨어 있다. 보통은 공개되지 않는 그런 내용을 넷플릭스가 블로그와 코드를 공개함으로서 마이크로서비스라는 이름으로 널리 알려지고 있다. 

하지만 우리는 문화를 이야기하는 것에 익숙하지 않다. 그리고 그 문화 없이는 저런 테크 컴패니들이 이루어낸 성과를 내는 것이 힘들것이라는 점을 배우는 중인것도 같다. 스스로 할 수 있어야 하는 일에 누군가의 승인이 필요하다는 것 자체가 시스템과 서비스간 의존성과 다르지 않다. 한줄의 코드를 바꾸기 위해 누군가에게 설명을 들어야한다는 상황 자체가 눈에 보이지 않는 의존성과 다름없다. 

의존성은 신기한 녀석이다. 애초에 무언가 분리되지 않는다면 다른 것에 의존할 필요가 없다. 그는 그의 일을 하고 나는 나의 일을 하기에 필요한 경우 그에게 무언가를 요청해야 하는 원시적인 의존성이 발생한다. 하지만 시간이 흐를 수록 이런 의존성이 많아지고 복잡해짐에 따라 하나의 변화가 힘들어지고 그 변화에 따른 위험도가 높아지기에 의존성은 점점 골치아픈것이 되어간다. 

셀프-서비스라는 말을 많이 사용한다. 어떤 일을 처리하기 위해서 필요한 것은 스스로 공급 받아서 스스로 준비하여 결과를 딜리버리하는 것을 의미한다. 셀프 서비스가 가능하기 위해서는 기능만을 딜리버리 하기위해 집중하던 것과는 다른 훈련을 필요로 한다. 내가 만든 무언가가 다른 사람에 의해 ‘셀프 서비스’의 방법으로 처리될 수 있어야 한다는 것이다. 

컨벤셔널 커밋 메세지, 브랜칭 전략, 테스트, 코드 스타일, 재 사용 가능한 코드, 설정의 분리, 코드 저장소의 읽기 권한 공개등 많은 컨셉들이 코드를 잘 쓰는 것 외에도 필요한 팀 내의, 아니 팀 외부로도의 공통 분모일 것이다. 

자연스럽게 발전한 오픈소스 생태계는 보통 이런 방식에 매우 익숙하다. 이미 구조적으로 잘 짜여진 협업의 방법과 의존성 발생으로 인한 위험을 낮추는 다양한 해법들이 존재한다. 그리고 이것은 시간이 지남에 따라 더욱 발전하고 있다고 생각한다. 

인터넷이 온전히 개발자에게 열려있어 어떠한 도구든 사용할 수 있는 상태와 그렇지 않고 인터넷에서 필수적인 것들만 내부에 별도로 준비해서 운영하고 있는 시스템 안에 있는 개발자들은 분명히 다른 상황에 처했다고 볼 수 있다. 이런 갭이 있는 상태에서 필요한 것은 무엇인가. 

예를 들어 많은 엔터프라이즈들이 내부에 별도의 넥서스를 운용한다. 이 운용의 방법은 보통 매우 매뉴얼이다. 새로운 버전의 무엇이 필요하면 어떤 승인지가 있고 이를 통과하는 프로세스가 존재하며 이 모든 것들이 지나야 무언가가 넥서스에 준비된다. 그것이 라이브러리든 패키지든 도커 이미지던간에 다르지 않다. 

사용하는 개발자의 입장에서는 일단 손봐야 할 것이 많다. 문제는 이 손봐야 할 것들이 인터넷이 열려져있는 환경에 있던 개발자라면 매우 생소하고 처음보는 것들이라는 점이다. “원래 메이븐은 그냥 돌아가는거 아니야?” 아니다. VSCODE의 플러그인을 설치할 수 없는 상태라면? 인텔리제이 아이디어에 프락시 설정을 넣어야 한다면? 

다른 사람들은 그냥 사용하는 것을 어딘가에서는 그냥 사용하지 못한다. 이것은 의존성과는 또 다른 큰 문제의 축이다. 익숙한 도구를 즉시 사용하지 못한다는 것은 꽤나 불편한일이 아닐 수 없다. 

당장 프락시와 넥서스의 엔드포인트에 대한 정보를 누군가 알려주지 않으면, 어딘가 정리되어 있지 않다면, 아니 항상 업데이트되고 있는 스크립트가 제공된다면 좀  더 편리할지도 모르겠다. 

다만 더 쉬운 방법으로 모든 개발자가 그런 설정을 할 필요가 없게 리버스 프락시 하나 제대로 준비해 주면 어떨까. 

요새는 이런 일들에 집중하고 있다. 수천명의 개발자들에게 보다 편리한 환경을 제공해 주는 일. 매일 매일이 전쟁같고, 작은 하나를 바꾸는데도 많은 사람들의 도움이 필요하다. 그리고 그 사람들에게 나를 누군가 먼저 소개해 주기 이전에는 내가 그 사람에게 메일을 보낼 명분조차 없다. 

하지만 조금씩 바뀌고 있다. 시간을 투자하고, 신뢰를 얻으면 그것이 미래의 자산이 될 것임을 믿어 의심치 않는다. 올바른 일을 하고 있다고 믿고 베짱있게 추진하다 보면 죽던지 살던지 둘중의 하나는 답이 나오겠지. 

싱가포르 생활은 한국 생활과 크게 다르지는 않다. 워낙 라이프스타일이 집회사 집회사지만, 한가지 크게 변한게 있다면 여기서는 집에서 얌전히 마신다는 것. 

COVID-19이 아니었다면 벌써 한국에 몇번 날아가서 누군가에게 징징댔겠지만, 그런 재미도 없어져버려 강제 적응 중. 

모두가 이 험난한 시국을 잘 버티어내고 결국에는 행복이 다다르길 바란다. 

의존성, 개발환경, 클라우드 아마도 난 올해 좋은 목표를 세우고 있는것 같다. 

 

(younjin.jeong@gmail.com, 정윤진) 

 

 

 

 

 

 

 

과거, 현재 그리고 미래

카테고리 없음

(younjin.jeong@gmail.com, 정윤진) 

 

바람이 거센 가을이다. 엘레베이터에서 내려 공동 현관문을 나서면 기다렸다는듯 차디찬 바람이 얼굴을 때린다. 그런 바람을 맞으며 계단을 걸어 내려가 아파트 단지 사이의 길을 따라 편의점으로 향하다 보면 싸늘한 추위가 자켓안으로 스며든다. 

편의점에서 한동안 끊었던 담배를 한갑 산다. 2019 11  무엇을 하고 있는가. 커리어에 대한 고민으로 년초부터 이곳 저곳면접을 보았더랬다. 어떤 회사는 스타트업 어떤 회사는 대기업, 어떤 회사는 전에 다니던 외국계 회사들 이었다. 사실 즐겁지만은않았다. 지금 다니고 있는 회사가 나의 장래와  이상 합치 되지 않는다는 사실은 괴로운 자각 같은 것이었달까. 

훌륭한 회사지만 내가 무엇을    있는가를 생각해 보면  앞이 어두웠다. 좋은 동료들이 많아 어떤 일을 성공으로 이끌어 내기에 충분하기도 했지만, 동시에 그런 동료들이 생기기 전에 했던 일들의 많은 부분을 덜어내기도 해야 했다. 

단순한 이분법으로 나누어 보자면, 회사에서 일하는 개인들은 무엇을 팔거나 또는 무엇을 만드는 일로 나뉜다. 2013 이전의 나는 무엇을 만드는 사람이었으며, 2013 이후로 나는 만든 경험을 바탕으로 파는 일을  왔다고   있다. 

파는 사람은 언제나 어떤 상품이나 서비스에 대해 좋은 부분만을 이야기하게 된다. 대부분의 판매직에 있는 사람들은  상품이나 서비스가 가진 취약점이나 문제에 대해 먼저 언급하지 않는다. 당연히 누구도 판매에 문제가 발생할 만한 행동은 하지 않게 마련이다. 

하지만 그런 서비스나 상품을 구매한 측에서는 언제나 문제에 마주한다. 그것이  제품에 대한 몰이해에서 비롯된 것이건, 제품자체의 문제에서 발생한 것이건 간에 문제와 마주한다. 이런 문제와 마주한 고객을 대하는 것에는 여러가지 기술이 필요하다. 

마찬가지로 그런 문제가 발생한 경우, 내가 고객의 입장에서  문제를 해결할 방법을 궁리해야 하는 것도 필수적인 부분이다. 어떤 기술이 원하는 기능은 구현했지만, 원치 않았던 부차적 문제를 함께 가져오는 것은 매우 일반적인 일이기 때문이다. 

개인적인 커리어에 대한 고민은 여기서 시작이었다. 예전에 무언가를 만들고 매일매일 발생하는 문제를 해결하는 위치에 있었을때에는  많이 배울  있었는데, 무언가를 파는 입장에서는 매일매일 새로운 기술을 배워 시장에 알리는 일만 하지 않는가 하는그런것이었다. 

새로운 무언가를 배우는 것은 사실 나쁜것은 아니다. 누구보다 빠르게 해당 기술을 배우고, 익혀서 소개하는 것은 적절한 시점에 이루어진다면 매우 뿌듯한 일이다. 하지만 간과해서는 안되는 것이,   기술이 새로 발생했으며 어떤 사업적 이유에서 필요했기 때문에 등장했는가에 대해서는 수동적일수 밖에 없다는 점이다. 

거꾸로 어떤 서비스를 직접 개발하고 운영하는 경우에는 기술에 대한 필요가 간절하다. 매일 해결해야 하는 문제에, ! 이런 기능이 있었다면! 하고 생각하는 경우가 많기 때문이기도 하고, 어떤 기술에 대한 깊이 자체가 다를수 밖에 없다. 어떤 이유에서 어떤 기술이 필요했는데 이제 생겼네! 하는 필요와 충분의 조건에 다름아니다. 

그러한 이유들로 인해 직접 개발하고 운영하는 서비스에 대한 욕심이 점점  커졌다. 내가 직접 만들고 고쳐야지, 내가 직접 문제들을 해결해야지 하는 욕심들 말이다. 하지만 이미 판매를 주로하는 직업을 가진 상태에서 나를 받아주는 회사들은 별로 없었다. 실무는  떼신지 오래 되었네요, 매니저 경력은 도드라지지 않네요,   할수 있으시겠어요? 

나는 내가 언제나 쓸모가 있는 기술자이기를 바랬다. 어디서나 필요한 사람이고 싶었다. 그런 바램이 항상 무언가를 배워야한다는 강박으로 이어지고는 했다. 사실  젊을때는 새로운 무엇을 배우는 것이 강박이 아니라 즐거움이었다. 하나를 알고,  하나를 알기 위해 수많은 것들을 배우고 그래서 다른 하나를 새로 아는 과정은 괴로움이기보다는 즐거움이었다. 

하지만 어느 순간 나는 많은 조직으로부터 필요한 사람이 되고 있지 않았다.  사실이 너무나 괴롭고 즐겁지 않았으며, 해법을찾지 못하는 상태에 이르렀다. 나는 어떻게 되고, 나의 미래는 어찌될 것인가 하는 고민들이 겹치고 현재의 상태에 만족하지 못하며  이상 발전할 수는 없는 것인가 하는 고민들이 매일의 나를 괴롭게 만들었다. 

결론부터 말하자면 오늘의 나는, 2019 11월의 나는 다른 나라에서 완전히 새로운 직업을 가지게 되었다. Senior Vice President of Technology & Operations in Development Bank of Singapore, Group Consumer Banking and Big Data Analytics Technology  라는 길고도  타이틀과 직급이다. 

장장 5개월의 면접, 오퍼, 그리고 비자까지 매우  기다림의 시간이었지만 동시에 설렘과 흥분으로 가득차 있기도 하다.  개인으로서는 거의 10년만의 서비스 운영, 그리고 수많은 개발팀에 필요한 도구의 제작, 그리고 동시에 내가 가장  하는 분야로의다른 나라에서 완전 새로운 도메인에 대한 도전이기 때문이다. 

사람들은 좋은 직장을 원한다. 물론 나도 그러했다. 월급 80만원 받으며 공공기관의 석고보드 천장을 뜯고 카테고리 5 랜케이블을 던지며 몰딩하던 시절에도 커널을 버리지 않았다. 나는 내가 80만원짜리 인생이기를 원한적이 없다. 

생각해 보면 재미있는 것은 한달에 80만원을 벌고, 120만원을 벌고, 200만원을 벌고, 다시 300만원을 벌고 하던 성장의 단계다. 나는  성장의 단계가 나에게는 하나하나 소중했으며 격렬한 투쟁의 결과라고 생각했지만 사회에서는 그렇지 않았다는 것이다. 소중했던 성장의 과정이 언제나 행복했던것 만은 아니었던것 같다. 물론 그도 그럴것이 위에는 언제나  위가 있으며, 나는 생태계에서 계급의 착각만을 반복했던것 같다. 

어쨌든 이제  새로운 길에 들어섰다. 새로운 시대에, 새로운 나라에서 새로운 사람들과 새로운 경험을 하게 된다. 처음 서비스를 맡아 개발할 때에도 그랬고, 생전 처음 보는 문제들을 반드시 해결해야만 하는 상황들도 있었고, 수백의 사람들 앞에서 처음발표를 해야 했을때도 그랬으며,  발표를 다시 영어로 해야 할때도 그랬다. 저지르고 보는 나의 성격은  결과의 성패와 관계없이 저돌적이었고 무지렁이 같았으며, 그래서 겁나기도 하고 가슴이 두근거리기도 했다. 

 모든 과정을 함께할  있는 반려자가 있었으면 했다. 하지만 거꾸로 그런 반려자가 있었다면 이토록 무모할  있었을까. 지독한 혼자의 길을 항상 치유받기를 원했다. 하지만 그런일은 발생하지 않았고,  지독함은 결국 새로운 도전으로만 연결되는것이 아닌가 싶다. 

나는 앞으로도 항상 필요한 사람이 되고 싶다. 어디서나, 내가 위치한 자리 그리고 내가  했던것을 누군가에게 필요당하고 싶다. 그것이 기술이건, 아니면 다른것이건 말이다. 그러나 그렇게 되지 않는 때가 온다면 보통의 슬픔으로는 표현할  없는 좌절과 마주하게  지도 모르겠다. 

나는 내가 슬픈 사람임을 깨달았다.  외로움은 앞으로도 해결되지 않을 것이며, 인생의 동반자는 없을 것이다. 따라서 나는 좋아하는 것에 더욱 집중하고 더욱 강렬한 도전을 멈추지 않을 것이다. 인생의 원동력이 슬픔이라는 것은 다소 안타까울지 모르나, 도전과 실패의 총합은 나를 필요한 사람으로 만들어  것이라고 믿는다. 

진정으로 나를 사랑해 주었던 사람에게 고마워보는 밤이다. 그리고 지난 모든 사람들에게도. 

나의 미래는 고독과 외로움 위에 명예롭기를 바란다. 

그냥 그렇다고. 

새 직장 주소.

https://www.dbs.com/

(정윤진, younjin.jeong@gmail.com) 

마이크로 컴퓨터와 RC (Remote Control) - 1편

Hobbies

(정윤진, younjin.jeong@gmail.com)

약 10여년 전, 인터넷 검색을 하다가 우연히 어린 시절에 원격 조종 자동차나 비행기를 엄청 하고 싶었던 기억이 떠올랐다. 어린시절 용돈으로 감당하기엔 그 벽이 너무 높았던 장난감, 이제 성인이 되어 직장도 다니고 하니 하나 사서 가지고 놀아 보는 것도 괜찮겠다 싶었다. 

당시에 이미 다양한 중국산 제품들이 생각보다 저렴한 가격으로 홍콩의 하비킹이란 사이트를 통해 판매되고 있었다. 개인적으로 기술도 그렇고 놀이도 그렇고 뭔가 빨리 발견한다는 느낌인데, 그때 그런 느낌이었다. 발사라는 매우 가벼운 나무로 만들어진, 그리고 조종을 실패하면 상당한 파손 비용을 감당해야 했던 것들과는 다르게, 강화 스티로폼으로 만들어진 비행기들이 주력을 이루었다. 입문용 비행기는 16만원 선으로, 추락해도 본드칠로 고치면 되겠다는 생각에 누구 가르쳐 주는 사람을 알아볼 생각도 없이 무조건 질렀다. 

최초로 구매한 무선 조종 비행기. 여러번의 추락으로 이미 많이 아프다...

검색에 검색이 꼬리를 물다 보니, FPV라는게 눈에 띄었다. First Person View라 불리는 것으로 이제는 많은 사람들이 알고 있듯이, 무선 조종 비행기나 자동차 앞에 카메라를 달아서 실시간으로 영상을 보면서 즐기는 장치들이었다. 이거 대박인데? 하는 생각과 관련 시스템들을 알아보기 시작했다. 다양한 주파수로 동작하는 영상 신호 전송 및 수신 모듈, 수신 받은 영상을 실감나게 볼 수 있는 고글, 그리고 고글에 자이로를 달아 여기서 나오는 신호로 비행기에 붙은 카메라를 조절해 고개를 돌리면 카메라도 돌아가는, 마치 실제 비행을 하는 느낌을 주는 시스템, 그리고 OSD라 불리며 배터리로 동작하는 비행기의 남은 전략 상태, 고도, 속도, 배터리 잔량 등을 영상에 오버랩 해 주는 장비까지 정말 끝이 없었다. 

무선 영상 전송 카메라와 OSD 선 정리에 영 소질이 없... - FatShark

 

이쯤 되다 보니, 비행 안정 장치가 있지 않을까 하는 생각도 들기 시작했다. 아니나 다를까 EagleTree라는 회사에서 만든 자이로가 달린 마이크로 컴퓨터 기반 장치를 무선 조종 수신기와 서보 사이에 연결하면 바람의 영향으로 발생하는 자세의 흔들림을 보정했다. 게다가 그라운드 스테이션 컴퓨터도 있어, 이 장치에서 송신되는 텔레메트리 정보를 모으고, 더 장거리 비행을 위한 지향성 안테나를 날고 있는 비행기의 위치에 맞게 조절해 주는 장치도 있었더랬다. 

당시에 한가지 더 대두되었던 기술 중 하나는 바로 오픈 하드웨어, 최근엔 라스베리 파이나 아두이노로 알려진 프로그램 가능한 마이크로 컴퓨터들이었다. 코드를 통해 움직이는 무언가를 만들 수 있다는 것은, 그리고 그렇게 할 수 있는 장치들이 십만원 이상을 넘지 않는다는 것은 꽤나 충격적인 변화였다. 2000년대 중반만 하더라도 ARM기반의 학습용 보드들은 쉽게 천만원대를 넘고는 했으니까. 

특히 비행 제어 장치 부분에, 당시에는 꽤나 소규모 회사였던 DJI의 장치들이 달린 유튜브 영상들이 매우 충격적이었다. 매우 정밀한 포지셔닝, 그리고 강한 바람에도 흔들림 없는 자세를 유지하던 DJI의 RC용 컴퓨터들은 그 예쁜 디자인 만큼이나 꽤나 고가였다. EagleTree 같은 장치가 20-30만원 할때, DJI의 비행 제어 장치들은 당시에도 100만원을 호가하고는 했었다. 

취미와 토이 프로젝트를 통해 기술을 배워 보자 하는 생각을 시작한 것은 그때 쯤이었던것 같다. 아두이노 보드를 사고, GPS를 사고, 자이로를 사고 하며 서보와 연결하고 코드를 쓰고 하면서 꽤나 즐거웠던것 같다. 하지만 뭔가를 잘 하는 것에는 시간이 필요하고, 만들고 싶은 결과물은 너무나 거대했다. 

ArduPilot을 사용한 시험 기체. 활주 없이 이륙하기엔 너무 무거워 첫 비행에 손을 떠나자 마자 꼬꾸라 졌다고 한다. 힝. 

그러는 동안 국내 통신사의 클라우드 서비스를 만들고, 큰 외국계 기업에 입사하게 되고 하면서 취미를 통해 배우는 일은 매우 시간을 내기 어려운 것이 되었다. 거실의 티비 뒷쪽에는 윙스팬 2.5미터의 거대한 글라이더가 조립만을 기다린채 먼지만 쌓여갔고, 부모님 댁에 놓아두고 온 스핏파이어 발사 비행기는 아버지의 단골 핀잔거리였다. 

그렇게 세월이 흐르는 동안 FPV와 비행제어 시스템들은 날로 발전해 드론 레이싱이라는 취미까지 발전하게 된다. 예전에는 320 240 해상도만으로도 감지덕지 했던 것들이 이제는 상당한 해상도로 실시간 전송된다. DJI는 취미를 넘어 항공 촬영이라는 분야로 전문성을 넓혔고, 이것은 그 회사의 상당한 사업적 성공을 가져왔다. 한동안 4차 산업 혁명의 선두 주자 같은 이미지까지 확보하게 되었으니 허허 하는 웃음이 자연히 나는 것도 어쩔 수 없다. 

세월의 흐름에 따라 기술의 발전은 끝이 없다. 머신 러닝을 지나 딥 러닝과 비전 컴퓨팅이 등장했다. 카메라로 들어오는 영상 정보를 분석하고 분류하며 이 정보를 바탕으로 다양한, 그야말로 너무나도 다양한 것들을 할 수 있는 시대가 되었다. 오픈 하드웨어를 통해 열린 새로운 세상에는 그와 함께 사용 할 수 있는, 심각하게 저렴한 센서들도 함께 세상에 나오게 했다. 오늘날 Adafruit, Sparkfun 을 비롯한 수많은 몰에서 저렴하게 센서를 구매해서 마이크로 컴퓨터에 연결 할 수 있다. 수년 전에 AVNet과 같은 페이지에서 센서를 구매하려면 상당한 가격과 센서의 스펙을 달달달 읽어 보아야 했던 것과는 매우 다르다. 접근이 편하고, 바로 사용할 수 있는 라이브러리들이 존재하고, 저렴하기에 관심만 있다면 즉시 아이디어를 구현 할 수 있게 된 것이다. 

비글 보드를 필두로 라즈베리 파이가 등장했고, 아두이노보다 더 강력한 컴퓨팅 성능을 가진 컴퓨터들이 등장하기 시작했다. 심지어 이것들은 우분투와 같은 리눅스가 올라가 있다. 즉, 성능 좋은 마이크로 컴퓨터들을 위해 리눅스들이 포팅되기 시작했고, 이제 어지간한 규모의 코드들은 손쉽게 돌릴 수 있는 환경이 된 것이다. 심지어 표준이라 불릴만한 생태계를 이루어, 카메라를 구매할 때도 CSI, MIPI 같은 인터페이스의 규격을 모르더라도 '아두이노 호환' '라즈베리 파이' 호환과 같은 설명을 보고 구입해도 실패가 없을 지경이다. 

Nvidia의 Jetson TX2 보드. 당시로서는 GPGPU가 탑재된, 구매 가능한 가장 저렴한 보드였다. 현재 1:5 스케일 차에서 열일중.

이것은 이제 필시 넋 놓고 보기만 할 상황은 아닌 것이다. 심지어 이 분야, 즉 컴퓨터, 코드, 서비스와 관계된 일을 업으로 하면서 이런 기술을 배우지 않으면 안되겠다는 위기감이 들기도 했다. 그래서 다시 취미를 통해 새로운 기술을 배운다는 목표를 세우고 실행해 보기로 했다. 

이전의 실패중 하나는, 제어의 대상을 무선조종 비행기로 했다는 점이다. 첫째로 무선조종 비행기는 사실 일정 크기가 넘어가면 사람, 특히 어린 아이에게 매우 위험할 수 있다. 그리고 그 특성상 전신주나 전깃줄이 많은 지역, 도심 지역에서는 날리는 것이 불가능하다. 마이크로 컴퓨터를 비행기에 얹기 시작하면 그 무게가 있어 일정 규모 이상이 되지 않으면 안된다. 이러한 종합적 문제들로 인해, 비행기를 포기하고 자동차를 선택했다. 

무선 조종 자동차는 의외로 비행기보다 가격대가 높다. 취미로서 무선 조종 자동차는 그 역사가 상당하고, 쉬운 접근성으로 인해 마니아층이 상당해서 그런지는 몰라도, 대부분의 무선 조종 자동차들의 기본 구조는 실제 자동차의 것을 그대로 가져다 만들었기에 부품의 종류와 양이 많다. 뭐 어쨌든 자동차로 하기로 했다. 

1:5 스케일은 정말 더럽게 크다. 배터리도 무시무시함. 사진에 보이는 배터리는 단지 수신기와 서보용.

멍청했던 것 중의 하나는 컴퓨터가 올라가려면 좀 커야지! 하는 생각에 1:5 스케일의 자동차를 구매했다는 점이다. 사실 이것은 인터넷을 통해 접하게된 '오토 랠리'라는 조지아 공대의 프로젝트를 보고 따라하려다 보니 그렇게 된 것이다. 이 오토랠리 프로젝트에는 마이크로 컴퓨터가 아니라, 실제 itx 사이즈의 메인보드를 기반으로 한 컴퓨터가 들어간다. 이들의 깃헙에 소개된 부품 리스트들을 보면 그 종류에 입이 떡 벌어지고, 그 가격의 총 합에 턱이 빠지게 된다. 

필요한 센서와 부품들은 보다 낮은 등급, 즉 보다 낮은 정밀도를 가진 것들로 대체해서 해결 한다지만, 일단 가까운 곳에 트랙을 찾을 수 없는 것이 더 큰 문제였다. 자동차를 만들어도 굴릴데가 없다는 말이다. 1:5 스케일의 자동차를 본 적이 있는지 모르겠지만, 무게가 킬로그람 단위로 나가는 물건이 시속 80킬로미터 이상으로 달릴 수 있다면 이것은 비행기와 맘먹는, 아니 어쩌면 비행기보다 더 위험한 장난감이 될 수 있기에 다시 안전한 장소를 찾아야 했고, 그런 안전한 공터는 생각보다 많지 않다. 

Team Losi의 DBXL-e 차량과 ZED 스테레오 캠 등.

그러는 사이에 또 일년이 지났다. 아마존 웹 서비스에는 '딥 레이서' 라는 장난감과 서비스가 출시되었다. 취미를 통해 배우는 것이 좋다는 것을 아마도 아마존이 알아버렸나보다. 대량으로 생산할 수 있는 적절한 성능과 규모의 자동차와 많이 사용하는 소프트웨어 도구들을 쉽게 얹을 수 있는 딥레이서를 보자마자 나는 또 아차 싶었다. 

사실 그동안의 세월이 아무 소용이 없었던 것은 아니었다. 모든 분야가 그렇듯이 하나를 알기 위해서는 그 주변에 연결된 것들을 함께 알아야 할 필요가 있다. 지난 두번의 시도들은 많은 것들을 배울 수 있게 했지만, 일과의 직접적인 관계가 없었기에 충분히 집중하지 못했다. 일을 하다 식사시간에 스마트폰으로 검색하고, 퇴근하다 문득 생각나 검색하고 했던 느슨한 공부들이 어느순간 갑자기 연결되기 시작했다. 그리고 지난 세월 동안 투자했던 시간과 장비들을 모아모아 이번에는 기필코 무언가 완성하겠노라, 그래서 내가 아는 모든 것들을 되짚어 보고 새로운 것을 배워 익히겠노라 하는 다짐을 하게 되었다. 

 

하여 언제든 가까운 곳에서 가지고 놀 수 있고, 위험하지 않으며, 가격도 비교적 저렴한 "컴퓨터가 탑재된 무선 조종 자동차"를 기획했다. 목표는 다음과 같다. 

  • 무선 조종기의 스위치 조작을 통해 컴퓨터 제어와 직접 조종을 즉시 변환 할 수 있다. 
  • 마음대로 제어가 되지 않는 상황에서는 버튼 하나로 즉시 정지할 수 있어야 한다. 
  • 트랙 내에서 가능한 고속으로, 그리고 스스로 주행하도록 하는 것이 목표이다.
  • 주행중 수집된 데이터는 분석을 위해 모아서 저장할 수 있어야 한다. 
  • 수집된 정보는 원하는 경우 실시간으로 클라우드 서비스에 스트림으로 보내 저장하여 다양한 목적으로 사용한다. 
  • 스마트폰을 통해 달리고 있는 자동차에서 전송되는 정보를 다양한 그래프와 게이지로 확인할 수 있어야 한다.  

이 목적을 이루기 위해서 지난 수년간 검색한 결과를 토대로 다음과 같은 리스트를 만들었다. 

  • 무선 조종 자동차, 1:10 스케일 
  • Nvidia Jetson Nano // WiFi 및 블루투스 익스텐션 // 전용 레오파드이미징 MIPI 카메라 
  • Arduino Uno 와 데모 보드 
  • 무선 조종기 / 수신기 
  • 야외에서 사용 가능한 무선 공유기 
  • 오차 범위가 센티미터 단위인 GNSS 와 안테나 
  • 9축 가속도와 나침반을 포함한 센서 - 9DoF IMU 
  • 자동차의 바퀴 속도를 수집하기위한 Hall Effect 센서와 바퀴에 장착할 자석  
  • 각종 저항과 연결 실험을 위한 브레드 보드 
  • 자동차와 컴퓨터들에 전력을 공급할 전원 분배 장치 - Matek Duo 
  • 서보 케이블, 마이크로 USB 케이블 등 케이블 류 
  • 3D 프린터 
  • 6각 렌치 세트를 비롯한 각종 공구 
  • 납땜을 위한 인두 

 

이렇게 새로운 프로젝트는 다시 시작되었다. 이번에는 필시 끝을 보리라... 

Sparkfun의 9DoF IMU 센서 

 

다음편에는 1:10 스케일 차량을 포함한 부품들의 구매, 그리고 무선 조종 제어를 위한 PWM 시그널의 이해와 코드를 살펴보기로 한다. 한번에 쓸 수 있다면 MPPI 에 대해서도 간략히 설명을... 언제 또 블로그를 쓸 수 있을지 모른다는 것은 안비밀. 

 

(정윤진, younjin.jeong@gmail.com) 

국민 청원 및 제안 - 정부 전산 시스템

Stories


쓸때마다 답답한거 청원 한번 넣어 보았다. 

https://www1.president.go.kr/petitions/142901?navigation=petitions 


이로인해 고통받는 국민들이 얼마나 많을까. 

전자 정부 프레임워크도 스프링 부트로 좀 올리고 유닉스 같은거도 좀 그만쓰고 제일 중요한건 좀 브라우저에서 별도 설치 없이 돌아가게 좀. 쪼오오옹오옴 




ffmpeg를 자막 입히기, 자막 위치 조정

Hobbies


(younjin.jeong@gmail.com, 정윤진) 


간혹 이런 저런 목적으로 유튜브에 비디오를 자막과 함께 올리는데, 유튜브의 경우 특정 자막이 포함된 링크를 생성하는 것이 불가능하여 아예 자막을 영상에 구워서 업로드 하는 방법을  사용하고 있다. 관련해서 매우 많은 다양한 도구가 있지만, 편의상 사용하는 방법은 아래와 같다. 


  1. ClipGrab 과 같은 도구를 사용해서 원하는 영상을 다운로드 받는다. (저작권 문제는 논외) 
  2. Youtube 에서 제공하는 "Creator Studio" 를 사용하여 원본 영상을 올린다.  
  3. Creator Studio 에 보면, "새로운 자막을 생성" 옵션에서 자막을 신규로 만들어 넣을 수 있도록 기능을 제공하는데, 이걸 사용해서 자막을 제작 한다. 
  4. 자막을 만들고 나면, "Action" 버튼에서 만들어진 자막을 srt 외 몇가지 포멧으로 다운로드 받을 수 있다. 
  5. srt 로 다운 받는다. 
  6. ffmpeg 로 ass 포멧으로 변환한다. 
  7. .ass 자막 파일을 열어 자막의 위치를 원하는대로 수정한다. 
  8. ffmpeg 로 자막을 비디오에 입힌다. 


Youtube Creator Studio 


.srt 자막을 .ass 로 변환하는 커맨드는 다음과 같다. 

ffmpeg -i input.srt output.ass


output.ass 파일을 열면 아래와 같은 포멧이 나타난다. 

[Script Info]

; Script generated by FFmpeg/Lavc57.24.102

ScriptType: v4.00+

PlayResX: 384

PlayResY: 288


[V4+ Styles]

Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding

Style: Default,Arial,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0


[Events]

Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text

Dialogue: 0,0:00:00.00,0:00:01.04,Default,,0,0,0,,피보탈 | 마이크로 서비스

Dialogue: 0,0:00:01.22,0:00:05.60,Default,,0,0,230,,마이크로 서비스는 거대한 서비스가 각각 독립적인 코드로 구성된 작은 서비스들로 이루어진 것을 말합니다.

Dialogue: 0,0:00:05.66,0:00:08.68,Default,,0,0,270,,개발자들은 마이크로 서비스를 새로운 앱을 개발할때 적용하거나

Dialogue: 0,0:00:08.88,0:00:12.88,Default,,0,0,270,,기존의 소프트웨어를 다수의 파트로 나누어 구성하기도 합니다.

Dialogue: 0,0:00:12.96,0:00:17.26,Default,,0,0,250,,마이크로 서비스 아키텍처는 소프트웨어의 빠른 릴리즈를 도울 뿐만 아니라

Dialogue: 0,0:00:17.38,0:00:20.94,Default,,0,0,250,,팀을 작은 규모로 유지하여 더 나은 업무 프로세스를 만들 수도 있습니다.

Dialogue: 0,0:00:21.06,0:00:24.84,Default,,0,0,250,,이런 마이크로 서비스 접근은 팀이 변화의 요구에 부응하며

Dialogue: 0,0:00:24.84,0:00:26.84,Default,,0,0,250,,새로운 기능을 고객에게 전달할 수 있도록 합니다.

Dialogue: 0,0:00:27.06,0:00:30.84,Default,,0,0,250,,마이크로 서비스 아키텍처는 작은 규모의 소프트웨어를 독립적으로 운용 함으로서

Dialogue: 0,0:00:30.90,0:00:35.36,Default,,0,0,250,,개발과 혁신의 속도를 높여주는 핵심 엔진입니다.

Dialogue: 0,0:00:35.56,0:00:37.56,Default,,0,0,0,,피보탈 | 세상이 소프트웨어를 만드는 방법을 혁신 합니다.


여기서 Events 부분의 Format 을 살펴보면, MarginL, R, V 의 값이 있다. 상단과 하단의 조정은 V 값을 변경해서 적용한다. 변경 적용이 완료 되면 파일을 저장하고 ffmpeg 를 사용해서 비디오에 자막을 입힌다. 이때, ffmpeg 에는 자막 관련 라이브러리를 사용해서 컴파일이 되어 있어야 한다. 

커맨드는 아래와 같다. 

ffmpeg -i INPUT_VIDEO.mp4 -vf subtitles=INPUT_SUBTITLES.ass OUTPUT_VIDEO_NAME.mp4



그러면 아래와 같은 화면이 출력되며 신나게 인코딩을 수행한다. 

ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers
  built with Apple LLVM version 7.3.0 (clang-703.0.29)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.0 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libxvid --enable-libass --enable-vda
  libavutil      55. 17.103 / 55. 17.103
  libavcodec     57. 24.102 / 57. 24.102
  libavformat    57. 25.100 / 57. 25.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 31.100 /  6. 31.100
  libavresample   3.  0.  0 /  3.  0.  0
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'What are Microservices.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 2017-05-08 22:20:16
    encoder         : Lavf54.6.100
  Duration: 00:00:38.10, start: 0.000000, bitrate: 2137 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 2029 kb/s, 24 fps, 24 tbr, 90k tbn, 48 tbc (default)
    Metadata:
      creation_time   : 2017-05-08 22:20:16
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
      creation_time   : 2017-05-08 22:20:16
      handler_name    : SoundHandler
File 'What-are-Micro-Services-KR-sub.mp4' already exists. Overwrite ? [y/N] y
[Parsed_subtitles_0 @ 0x7fb1dc500a60] Shaper: FriBidi 0.19.7 (SIMPLE) HarfBuzz-ng 1.2.4 (COMPLEX)
[Parsed_subtitles_0 @ 0x7fb1dc500a60] Using font provider coretext
[libx264 @ 0x7fb1dc80de00] using SAR=1/1


완료되면 비디오를 열어 확인한다. 

AEGISSUB 와 같은 좋은 도구가 많지만 웬지 커맨드 라인이 더 익숙해. 


(younjin.jeong@gmail.com, 정윤진)