'프로젝트'에 해당되는 글 3건

  1. 2008/05/14 예외 처리는 언제나 확실하게! 1
  2. 2007/12/10 요즘 잠수타고 있는 이유 3
  3. 2007/06/13 자바스크립트 3

예외 처리는 언제나 확실하게!

머리아픈 이야기 2008/05/14 10:06 by daybreaker

정말로 오랜만의 글이로군요. 간만에 재미있는, 그러나 슬픈(...) 삽질기를 하나 들려드릴까 합니다. ㅠ_ㅠ

지금 스웨덴 교환학생의 가장 마지막 관문(?)으로 Musical Communication and Music Technology라는 매우 긴 이름을 가진 과목의 기말 프로젝트를 하는 중입니다. 발표는 오늘(!)이지만 프로젝트 기간 자체가 워낙 짧았던 데다 같이 하는 애들이 지난 주에 시험이 계속 겹치는 등의 이유로 실제 진행은 거의 3일 벼락치기로 하는 중이지요;;;

과목 이름에서 유추할 수 있듯 프로젝트 내용은 상당히 '미디어 아트'적인 내용입니다. 과제로 했던 Lab에서 마지막에 했던 것이 실시간 비디오프로세싱 프로그램인 EyesWeb을 이용하여 사람의 동작을 웹캠으로 찍어 음악을 컨트롤하는 내용이었는데, 그것을 좀더 확장하기로 한 것이지요. 처음엔 막연히 뭘 더 넣을 수 있을까 고민하다가 요즘 한창 유명해진 니코니코조곡 오토마리오 버전 동영상을 보고 실제 몸의 움직임을 추적하여 실제 사람이 연기하는 마리오를 만들면 재밌겠다 싶어서 그쪽으로 방향을 잡았습니다. (그게 어젭니다-_-)

수업 때 소리를 컨트롤하는 프로그램으로 실시간 소리 합성이 가능한 오픈소스 사운드 프로그래밍 툴인 Pure Data를 이용했는데, 이게 사운드 생성은 쉬워도(?) 기존에 녹음된 사운드를 재생하는 것이 난감하더군요.; 그래서 EyesWeb에서 Open Sound Control(이하 OSC)이라는 프로토콜을 이용해 UDP로 쏴주는 메시지들을 직접 받아 소리 재생을 하는 프로그램을 짜면 어떨까 싶었습니다.

자, 서론이 길었습니다.<br/> 제가 요즘 유용하게 이곳저곳 잘 써먹는 Python을 이용하기로 했고, 크로스플랫폼 소리 재생을 위해 pygame 라이브러리를 써서 쉽게 소리 재생을 할 수 있었습니다. 또한 OSC 프로토콜을 파싱해주는 것도 이미 Python으로 구현되어 있었기 때문에 그 라이브러리를 가져다 쓰니 통신도 금방 구현할 수 있었지요. 근데 갑자기 어느 순간부터, EyesWeb에서 계속 쏴주고 있는 UDP 데이터를 못 받고 block되어버리는 겁니다.

EyesWeb 문제인가 싶어서 데이터 전송 속도를 줄여보기도 하고, 파일을 새로 만들어보기도 했고 윈도우 문제인가 싶어서 방화벽에 UDP 포트 추가도 해보고 심지어 패킷스니핑 프로그램까지 썼습니다.;; 또 OSC 라이브러리 문제인가 싶어서 멀티쓰레드로 된 구현을 싱글쓰레드로 바꿔보기도 하고 별의별 짓을 다 해봤지요. 일단 혐의(?)는 소켓 쪽에 문제가 있을 것으로 생각하고 있었습니다.

근데 여기가 스웨덴이다보니, 저보다 Python을 잘 하시는 퍼키군님과 같은 다른 사람들의 도움을 요청하자니 다들 자고 있을 시간이더군요. -_-; 혼자 힘들게 구글링하며 온갖 삽질을 다 하다가, 결국 가장 원시적인 디버깅 방법, 즉 print 찍어보기를 해봤습니다. 그리고 1분만에 좌절했습니다. (........)

원인은 세 가지였습니다.

  • pygame.mixer.get_busy()를 이용해 현재 재생 상태를 알아내는 부분이 있는데, is_busy()라는 잘못된 이름의 함수를 썼습니다. (이건 전적으로 제 잘못입니다..orz) 근데 이 부분이 항상 실행되는 게 아니고, 받아온 모션캡처 데이터에 따라 반랜덤하게 실행되는 곳이었죠.
  • OSC 라이브러리가 멀티쓰레드로 돌며 제가 지정한 핸들러 함수를 호출해주는 방식이었습니다. 따라서 그 안에서 뭔 일이 발생하여 죽더라도 프로그램은 죽지 않았습니다.
  • OSC 라이브러리 내부 코드에서 핸들러를 호출하는 부분을 try-except 구문이 둘러싸고 있었는데, 그 except 구문에 어떤 예외를 받을지 지정이 되어 있지 않았습니다. 즉, 모든 예외를 다 받겠다는 것이었죠.

자, 이쯤에서 무슨 일이 벌어졌을까요?

잘못된 이름의 함수를 썼으니 당연히 예외가 발생하여 프로그램이 죽어야 할 것입니다. 하지만 그 예외를 라이브러리 코드 내에서 먹어버렸고, 불행히도 그 try-except가 소켓 데이터를 읽는 while 루프 바로 바깥이라서 루프가 종료되고 결과적으로 해당 쓰레드는 아무 일 없었다는 듯 '정상 종료'를 했습니다. 하지만 메인 프로그램은 계속 돌고 있었죠. 화면에는 아무것도 나오지 않습니다. 게다가 그 잘못된 함수를 호출하는 순간은 제가 카메라 앞에서 어떤 동작을 하느냐에 따라 달라지니 에러가 랜덤하게 발생하는 것처럼 보였던 겁니다. (위에서, 싱글스레드로 바꿔보기도 했다고 썼는데, 이 경우에도 랜덤 발생으로 보였던 겁니다. 게다가 프로젝트 듀가 급하니 마음도 급했던지 차분하게 생각하지 못했던 것도 문제였죠.)

그래서......인생이란 삽질인 것입니다. OTL

여러분, 저같이 애꿎은 사람 희생시키지 마시고 예외 처리할 땐 어느 예외를 받을 것인지 항상 확실하게 지정하는 습관을 들입시다~ ㅠ_ㅠ

필자
author image
Daybreaker(아침놀)입니다. 현재 KAIST 전산학과에 재학 중이며 전산 외에도 물리, 음악, 건축 등에 관심이 많습니다. Needlworks 내에서는 각종 홈페이지 제작 및 서버 관리 등과 함께 Textcube 개발에 참여하고 있습니다.

홈페이지 : http://daybreaker.info

2008/05/14 10:06 2008/05/14 10:06

요즘 잠수타고 있는 이유

머리아픈 이야기 2007/12/10 14:01 by daybreaker

....랄까, 역시 전산과에서 빡세기로 소문난 운영체제 과목 플젝이 주 원인입니다. 이거 때문에 수리물리 숙제도 매번 딜레이하고.. ㅠ_ㅠ 이른바 Heisenbug의 세계를 아주 그냥 몸소 체험하고 있습니다.;

긴 말은 필요 없을 것 같고 스크린샷 한장으로 대체합니다.;

프로젝트 작업 화면

대망의 Virtual Memory 구현 중

....요즘 24인치 하나 더 사서 듀얼 구성하면 어떨까 하는 생각이.... -_-;;;;
필자
author image
Daybreaker(아침놀)입니다. 현재 KAIST 전산학과에 재학 중이며 전산 외에도 물리, 음악, 건축 등에 관심이 많습니다. Needlworks 내에서는 각종 홈페이지 제작 및 서버 관리 등과 함께 Textcube 개발에 참여하고 있습니다.

홈페이지 : http://daybreaker.info

2007/12/10 14:01 2007/12/10 14:01

자바스크립트

즐거운 이야기 2007/06/13 23:49 by inureyes

물리학이 전공인데 자바스크립트를 죽자살자 붙잡고 있는 중입니다. 수강중인 DR (Data retrieval 또는 information retrieval이라고 하는 분야입니다) 과목의 프로젝트를 구현하기 위해 자바스크립트 의존적인 클라이언트? 를 짜고 있기 때문입니다. 재미있는 아이디어의 프로젝트입니다. IR의 한 분야에서는 middleware 등에서 조건에 맞는 요소를 뽑아내는 부분에 대한 것을 다룹니다 -top-k query라고 합니다-

프로젝트로 제안하고 만들고 테스트하고 있는 것은 관점을 좀 바꿔본 top-k query 방법입니다. 보통 서버에 키워드를 날리면 서버에서 처리한 결과가 날라오고, 그에 따른 카테고리를 선택하면 또 서버에 쿼리가 날라가고 돌아오고는 하는데, 그 과정을 전부 클라이언트로 옮기게 됩니다. 이 과정의 장점중 하나는 개인의 검색 성향을 서버에 제공해주지 않을 수 있다는 것입니다. 그러면서 검색에 대한 개인화 구현이 가능하게 되지요.

이런 부분을 실제 서비스 업체들은 그다지 안 좋아할 수도 있습니다만, 전 필요하다고 생각하고 있습니다. 응용이 별 것 없을 것 같이 보입니다만 생각해보면 다양합니다. 전 로그인이 참 귀찮습니다. 그렇지만 뭘 보고 싶은지 잘 모르는 상태에서 서비스를 사용하거나 쇼핑을 할 때, 저절로 자신의 관심사로 검색 결과들이 포커싱되는 것은 로그인없이 구현하기가 어렵지요. 이 프로젝트는 그걸 가능하게 해줍니다. 자세한 것은 귀찮아서 생략하고 페이퍼 나오면 붙이도록 하겠습니다.


그런데 이 과정에서 해당 클라이언트를 activeX로 짜면 우선 제가 못 씁니다. 그래서 서버와 상호통신하고 top-k 계산 과정을 수행하는 클라이언트를 통째로 자바스크립트로 짜고 있습니다. 참 상반된 느낌을 받으면서 짜고 있습니다. 하나는 '자바스크립트가 이렇게 강력한 언어였나' 하는 것이고 다른 하나는 '뭐 이딴 언어가 다있냐' 는 것입니다. ajax가 때늦게 각광받는 이유도 동시에 배우고 있습니다.

맘잡고 써 본 자바스크립트는 굉장히 객체지향적입니다. 게다가 각 객체들을 웹페이지 구성요소와 붙이는 것에 있어서는 페이지와 동시에 독립적으로 로딩된다는 점 때문에 다른 방법으로는 흉내낼 수 없는 것들을 해 볼 수가 있습니다. 적당한 프레임웍과 희한한 자바스크립트 notation에 대한 이해와 노가다가 합체하면 생각한 것은 대부분 해 볼 수가 있을 듯 합니다.

하지만 동시에 '호환성'이 문제가 됩니다. 브라우저마다 다르게 돌아가는 (자바스크립트 파서가 다르기 때문이지요) 자바스크립트를 생각하면 무작정 생으로 짜다가는 activeX 못지 않은 변태 스크립트가 등장할 수 있습니다. 게다가 JSparser가 잘 뻗습니다. 좀 잘못짰다 싶으면 테스트 중에 브라우저가 수많은 친구 탭들을 안고 사망합니다. (왜 사냐건 울지요) 게다가 (이건 이제서야 JS활용이 극대화되는 이유중 하나이기도 할텐데) 느립니다. 정말 느립니다....

php로 구현한 서버측 드라이버들을 제외하면 원하는 기능을 구현한 자바스크립트 모듈은 천 줄 정도밖에 안됩니다만, 하부에 dojo framework의 컴포넌트 일부를 연결했기 때문에 필요한 기능만 잘라 왔다고 하더라도 실제로는 크기가 좀 됩니다. 제가 무식한 것들을 요구해서이기도 하겠습니다만, 속도가 잘 안 나옵니다. (그래서 온갖 편법을 동원하여 속도를 늘리려고 했습니다만 여전히 느립니다.[footnote]예를 한 번 들어보면 이런 것도 있습니다. string을 number로 변환하려면 앞에 + 붙이는 것이 가장 빠른 방법입니다. 여러가지 방법 중 parseInt는 가장 느린 방법이지요.[/footnote]) 그래서 구현한 결과가 컴퓨터 사양을 탑니다.


쉽게 쓴다고 썼는데 쓰다 중간에 위를 읽어보니 더 쓰면 안 되겠다는 생각이 드네요. -_-;
그래도 즐거운 이야기로 붙이렵니다. ~


덧) 일주일째 테스트 데이터베이스를 셋팅하고 있는 프로젝트 공동 진행자 모 분은 끝없이 좌절하다가 막 자러 갔습니다. 검색 엔진 구현을 위해 word relation 측정을 위한 웹문서 샘플링과 카테고리 저장을 하는데 DB가 벌써 60기가가 넘어가네요. 단일 mysql에서 50기가 넘는 데이터베이스를 핸들링 하는 것은 실제로는 처음 봤습니다. (보통 분산하면 했지 이렇게는 잘 안하지요)

필자
author image
inureyes 입니다. 하고 싶은 일과 해야 할 일의 균형 맞추기를 하며 즐겁게 살고 있습니다. N/W에서는 구성을, TC에서는 교리 전파? 및 사회자?를 맡고 있습니다. 오전과 오후에는 물리학을, 저녁 시간에는 코딩을 하며 삽니다.
http://forest.nubimaru.com

2007/06/13 23:49 2007/06/13 23:49