Rath World Notes by Jang-Ho Hwang

20Apr/141

주말에는 잉여 개발을

Posted by Jang-Ho Hwang

아내의 학교 프로젝트를 돕기 위해 Raspberry PI를 하나 샀다. Model B 하나에 33.78 유로다. 이 프로젝트에서 Raspberry PI가 해야할 일은 Coin Acceptor 에 동전이 하나 들어오면 이 신호를 GPIO로 받아서 하위 노드들(집에 남아도는 Microsoft Surface RT, Android, iOS 잉여기기들) 에게 신호를 보내 뭔가를 하게 만드는 것이다. 할 일이 거의 없다. Model A로도 충분했다. B 타입 메모리가 512고 A 타입이 256인데 128이여도 널럴할 뻔했다. RPi.GPIO가 단순하기도 하지만 나는 coin counter 포트 하나만 감시하다가 tcp 소켓으로 1바이트 write만 하면 끝나는 거라 목표는 금새 달성되어버렸다.

Raspberry PI로 본 목적을 달성하였으니 이제 잉여를 한다. ARMv6 머신이 생겼다 하하하. 몇달전에 심심해서 구매한 Arduino를 가지고 놀 때는 괜히 led에 불이나 켜고 오오오- 했었는데 Raspberry PI는 그런 맛이 없다. 그냥 펜티엄2급의 리눅스 박스다. 3달전에 올라온 Raspbian 이미지를 썼는데 커널도 3.10.25+고 gcc 4.6, Python은 2.7.3이 기본이지만 Python 3.2도 repo에 있다. Ruby는 1.9.3p194고, Java도 1.7.0_40이 있는데 Hotspot Client VM만 번들된걸보니 X 에서 자바 GUI 돌리려는 목적이 아닌가 싶었다. nginx 최신 버전(1.4.7)을 포함하여 내가 좋아하는 오픈소스들은 컴파일이 다 잘 된다. OS 부터 모든 것이 sd 카드에서 돌아가므로 i/o가 몹쓸 수준인데, 모델 B의 512 메모리를 놀리지 말고 ramdisk로 300메가 정도를 잡아 그 안에서 노는 맛도 솔솔하다. 초간단 http api 서버를 만들 때는 flask를 쓰곤 했는데 Raspberry PI는 느리니까, 괜히 falcon으로 갈아탔다.

노는 HDMI 포트를 주체하지 못해 반정도 억지로 건축학개론을 감상했다. 처음엔 멋모르고 ffplay와 mplayer로 재생을 시도했었는데 얘네들이 GPU를 쓰지 못한다는 것을 깨닫는데는 그리 오랜 시간이 걸리지 않았다. user cpu 100% 먹으면서도 초당 1프레임도 안나왔기 때문. Raspberry PI에서 GPU 활용할 수 있는 플레이어는 omxplayer 밖에 없다고 한다.

Raspberry PI 이야기 끝.

그 아내의 학교 프로젝트로 Microsoft Surface RT 위에서 원격으로 동영상 재생을 해야했다. Surface 2.0 SDK를 받아서 설치를 시도했다. 충격이 대단했다. Visual Studio 2010이 필요하다는 것이다. 나는 2013인데... 좀 어이가 없었다. 하위호환성 잘 지켜주는 Microsoft는 어디로 갔을까. 지가 아무리 Surface 라고 해봐야 ARM Cortex A15 위에서 돌아가니까 어떻게든 되겠지- 하며 Qt 5.2로 개발을 시작했다. 몇시간의 삽질이 필요했고 Qt 위에서 h264 동영상 재생하기를 성공했다. 그리고 또 깨달았다.

"QMediaPlayer 품질은 개똥망이구나."

Windows 7 KN 클린인스톨 (나는 Visual Studio Professional with MSDN 구매자) 후 미디어플레이어도 없는 상태에서 시도하면 QMediaPlayer::ServiceMissingError 가 발생한다. 그래서 윈도우미디어플레이어를 설치하니 잘된다. 그렇다면 QMediaPlayer는 각 플랫폼에서 제공하는 코덱과 서비스에 의존한다는 결론이 나온다. 그런데! 윈도우미디어플레이어에서 잘 재생되는 동영상이라 해도 QMediaPlayer로 하면 재생실패하는 케이스가 엄청나게 많다. QVideoWidget을 붙이기만 하면 QMediaPlayer::ResourceError가 터지는 것. 웃기는건 Qt 사이드에서 비디오 레이어를 꺼버리면 오디오는 잘 재생된다는 것이다. 아무튼 mp4 파일 10개중에 9개는 이런식으로 재생이 안된다. 특징도 모르겠다. 포기.

여기에도 구원자가 하나 있었으니.. 이 거지같은 QMediaPlayer를 참지 못한 어느 오픈소스 개발자가 ffmpeg 백엔드로 QtAV라는 프로젝트를 만들었다. 돌려보니 잘된다. 만세.

Qt는 오늘 하루 나한테 육성으로 엄청나게 욕을 먹었지만, 참지 못할 수준은 아닌 것 같다. 그래서 앞으로도 쭉 써주기로 했다. 이번에 검토하면서 정말 큰 소리로 웃음이 나온 적이 있었는데, Qt 5 부터 icu dll이 QtCore, QtGui만 써도 항상 링크되는 것이였다. 맥이나 리눅스에서는 icu 라이브러리가 어떤 형태로든 os에서 제공을 해줄테니 괜찮지만 윈도우즈에는 그런게 없나보다. 그래서 23KB 짜리 Hello world.exe를 만들어도 의존성이 40MB 정도(icu만 25MB) 된다. 큰 소리로 웃었다. 니가 자바야, 닷넷이야, 왜이래.

신나게 욕을 했지만 나는 개발할 때마다 항상 욕을 하기도하고 QMediaPlayer의 비디오 병맛사건만 빼면 Qt API 스타일도 내 마음에 들고 signal/slot 개념도 괜찮았다. Qt 5부터 새로 등장한 iOS/Android 도 나중에 시간내서 써봐야겠다. 가장 큰 걱정은 배포본 크기인데 요새는 바이너리 사이즈에 둔감한 유저들이 많아졌기도 했고  Ruboto 처럼 사용자한테 Ruboto Core를 따로 설치하게 하는 과정에서 생기는 이상한 경험(해보면 안다. 견딜 수 없다)을 제공하지는 않을테니까 괜찮을 것 같다. Ruboto는 요새 활발히 개발되고 있으니 사용자경험은 많이 나아질거라 기대한다.

Microsoft는 마우스랑 키보드, 그리고 오피스랑 개발툴을 아주 잘 만드는 회사라고 생각한다. 오랜만에 Visual Studio 쓰면서 매우 쾌적하다는 느낌을 받았다. 그래서 맥이나 리눅스용 C/C++ 프로그래밍을 할 때도 Visual Studio를 쓰기로 했다. VisualGDB USD 349

오랜만에 목적없이 글을 써봤다. 내 라이프스타일과 참 어울린다.

31Mar/144

독일로 이사

Posted by Jang-Ho Hwang

5년전 어느 여름 아내와 함께 런던으로 이사했다. 그리고 아내의 학교생활이 거의 끝나 며칠전 독일로 이사했다. 런던에 처음 왔을 때는 1-2개월정도 "나도 취업이란걸 해볼까" 하는 생각이 있었는데 어쩌다보니 원격알바와 앱개발로 생활비가 잘 충당되었기에 취업 생각은 완전히 버렸었다. 아니 생활비가 충당하지 못했더라도 취업은 안했을거다.

내게 회사생활이란 아주 오래된 어떤 것을 그대로 답습하는 것이 되어버렸다. 한마디로 지루하고 재미가 없다. 지루하지 않고 재미있는 것만 하는 회사에 들어가면 되지 않느냐- 할 수도 있을텐데 기업을 그렇게 경영하다가는 초고속으로 망할거다. 그래서 나는 회사라는 곳에 들어가면 내가 통제할 수 있는 모든 내 성향을 죽이고 그들인척 하려고 노력한다. 그러다보니 더 지루해진다. 지루하고 재미없다는 것은 프로그래밍 얘기가 아니다. D라는 지점에 도달하기 위해서는 A, B, C를 반드시 거쳐야 한다. 그렇지 않고 점프하면 오래가지 않아 반발심으로 인해 튕겨나가거나 균형이 깨진 헛똑똑이가 된다. 어떤 특정 분야에서 내가 T 지점에 있다고 치자. 그러면 나는 19단계를 그대로 답습해야 한다. T 까지 가는 길목에서 놓치고 왔던 것들을 다시 되짚을 수 있다고 위로해볼 수 있겠지만 어디까지나 위로일 뿐이다. 게다가 T 까지 왔는데 "이 산이 아닌가벼"를 느끼기라도 했다면 그건 정말 끔찍하다.

그래도 독일에서 취업을 한다면 언어장벽 때문에라도 조금 더 재미있는 회사생활을 할 수 있지 않을까 하는 작은 희망을 가져본다.

Filed under: Life 4 Comments
5Aug/130

습관

Posted by Jang-Ho Hwang

어떤 일을 반복하다보면 그 행동이 습관으로 자리 잡는다. 그 행동이 무엇이든간에 습관이 되어버리면 평범한 행위가 되어버린다. 스트레스를 전혀 받지 않고 할 수 있다. 그 일을 처리하는데 필요한 혈관이 있다 친다면 혈관의 크기가 늘어나게 되는 것이다. 웬만한 혈류랑으로는 혈압 상승이 조금도 일어나지 않게 된다.

그저 반복하기만 해서는 새로운 습관이 자리잡기 어렵다. 그 일을 시작하여 끝나는 지점까지 다른 생각이 끼어들지 않아야 한다. 예를들어 하기 싫은 일은 습관으로 자리 잡기 어렵다. 일을 수행하는 내내 하기 싫다는 생각이 끼어들어 흐름을 끊어버리기 때문이다. 하기 싫다는 생각도 없어야 하지만, 하고 싶다는 생각도 없어야 한다. 아무 생각도 없어야 한다. 아무 생각도 하지 말아야지 하는 생각도 없어야 한다. 그 일을 왜 해야하는지도 생각하면 안된다.

그 일의 규모가 꽤나 커서 생각없이 하기에 무리가 많은 경우, 그 일을 인수분해하여 각 원소들을 처리하는 것을 먼저 습관으로 만들고 이것들을 이어가는 것만 따로 연습하면 된다. 생각없이 로보트처럼 무엇을 하는 것은 명백히 재미없는 일이므로 언제까지 연습해야하는지 아는 것이 중요하다. 끝나는 지점은 다음과 같은 방식으로 간단히 체크할 수 있다. 인간은 (특히 남성은) 멀티태스킹이 거의 불가능하다. 하지만 모두가 알고 있듯 습관으로 자리잡아 의식없이 처리할 수 있는 일들은 멀티가 가능하다. 나는 담배를 입에 물고 양손으로 피아노를 치면서도 지난밤 꾸었던 꿈을 회상할 수 있다. 이 경우 내가 의식적으로 진행하고 있는 일은 오직 지난밤에 꾸었던 꿈을 되씹는 것뿐이고 나머지는 자동으로 진행되는 것이다.  내가 '~하면서도 ~ 할 수 있다' 라는 표현을 하긴 했지만 이러한 일이 일어나는 경우를 돌이켜보면 그저 할 수 있어서 하는 것이 아니라 의식적으로 할만한게 없어서, 너무 심심해서 무어라도 생각하고 싶었던 것 뿐이다. 문장이 좀 길어졌는데 요약하면 습관으로 만들고 싶은 일을 끊김없이 실수없이 반복하면서 다른 잡생각이 떠오르기 시작하면 성공한 것이다.

물론 이것은 어디까지나 특정 습관을 만드는 것이 목표일 때를 위한 글이다. 습관을 만드는 것은 대단히 위험하다. 의식이 끼어들지 못하는 구역이므로 통제가 불가능하기 때문이다.  나이가 들어갈수록 인생이 재미없어지고 아무 일도 안하는 것 같은 느낌이 엄습하더라도 너무 우울해하지 말자. 너무 익숙하니 자기가 무슨 일을 하는지도 인지할 수 없게 되어 기억할 수 없을 뿐이다. 이럴땐 습관을 해체하거나 새로운 것을 공부하면 된다.

습관을 만들 때 주의해야할 점이 또 하나 있다면 처음 연습할 때 아주 천천히 해서 오류가 없어야 한다는 것이다. 앞서 흐름이 끊기면 습관을 만들기 어렵다고 했지만 이또한 반복되다보면 흐름이 끊기는 것조차도 습관의 일부로 녹아들어 항상 같은 지점에서 흐름이 끊기거나 오류가 재생된다. 처음에는 누군가가 말을 걸었다거나 각종 알림 때문에 흐름이 끊겼겠지만 어느새 아무도 말을 걸지 않아도 알아서 흐름이 끊겨버리는 것이다.

습관은 의식을 사용하지 않으므로 기계처럼 죽어 있는 것이며 결코 좋은 것이 아니다. 회사일을 하며 돈을 버는데 사용한다는 등 좋게 활용될 수 있을 뿐이다.

Filed under: Daily No Comments