Categories
Daily Development

주말에는 잉여 개발을

아내의 학교 프로젝트를 돕기 위해 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

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