Rath World » 2008 » July

Archive

Archive for July, 2008

책력(冊力) 그리고 책을 읽는 동기

July 27th, 2008 5 comments

안상헌씨가 쓴 책력이란 책입니다. 처음부터 대작을 만들려고 하지 마세요 글을 쓴 게 지난달이니 최근 몇달동안에는 안상헌씨 책을 많이 읽고 있나봅니다. 지난주에 재미있게 읽었던 문요한씨가 쓴 굿바이 게으름도 괜찮지만, 안상헌씨 책들을 좀 더 좋아합니다.

지금은 140p 정도를 지나고 있는데, 괜찮은 주제를 하나 발견하여 간만에 글을 씁니다.
매사에 목표 중심적인 제게 자극적인 주제~ 당신은 책을 왜 읽나요?

물론 책의 종류에 따라 다르겠습니다. 저 같은 경우 책 읽기를 시작할 때 아래와 같은 몇가지 이유가 있습니다.

– IT 기술서적 (1): 개인적으로 만들려는 것이 있어 공부해야하는 기술이 있을 때
– IT 기술서적 (2): 보다 나은 업무능력을 위해 마음을 정돈하고 프로그래밍과 관련이 없는 수많은 잡념들을 물리치기 위해
– IT 기술서적 (3): 저자의 팬이라 그의 문체가 마음에 들어서.
– 소설: 가까운 사람이 읽어보라고 해서.
– 처세책 (1): 내 자신을 정말로 변화시키고 싶어서
– 처세책 (2): 영혼의 에너지를 재충전해주는 짤막하고 좋은 인용구들을 낚으려고.
– 처세책 (3): 게으름을 방지 하기 위해. 최소한 책을 읽고 1~2일 정도는 말끔한 정신상태를 유지할 수 있기 때문에.
– 남들에게 아직 공유하지 못했던 내 생각들이 저자의 생각과 일치함을 알고 이를 통해 자신감을 얻어 생각을 행동으로 1inch라도 더 옮길 수 있게 하기 위해.

간단히 요약하면 독서하기 전에 이루려던 목표가 있는데, 그것에 대해 직접적인 도움을 얻기보다는 간접적인 도움을 얻기 위해서 읽는 경우가 많습니다. 그래서 극소수의 책을 제외하고는 전체를 다 읽는 경우가 없습니다. 때문에 ‘나는 이 책을 읽었다’ 라고 자랑하거나 내세울 일이 생기질 않습니다.
‘이 책의 내용을 한줄로 요약하라’ <- 는 제게 전혀 가치가 없는 일입니다. 도대체 뭐하러? -_-

소설을 읽더라도 뭔가 느끼고 작가의 컨텍스트에 몰입되기보다는 이런 글을 쓰게 될 정도랄까요. 코엘료 소설들을 읽다보면 전체적인 줄거리를 잡기보다는 평소 고민하고 생각하던 많은 것들에 대한 통찰을 얻고 이를 현실 삶속에서 가용한 에너지로 변환시키는 게 목표입니다.

그런 면에서 볼 때 안상헌씨 책은 제가 사랑하지 않을 수 없습니다. 책 구석구석에 정신적 에너지를 충전해주는 문구들이 가득가득하거든요 :$

저의 이런 독서 스타일에 큰 문제점이라면 독서를 시작하기 전에 목표를 미리 잡고 시작하기 때문에 목표를 달성하는데는 큰 도움을 주지만, medium/small scale의 영감만 얻을 수 있고 large scale의 영감은 얻을 수 없다는 겁니다. 미리 목표가 설정되어있기 때문에 large scale의 영감은 머리속에서 도통 받아들이려고 하지 않기 때문입니다. 이런 류의 에너지는 그 에너지를 얻기 위해 사색이란 고통이 동반되는데 기 설정된 목표가 이미 머리속에 있기 때문에 사고과정에서 오는 고통을 회피하고 슥- 넘어가버리기 일쑤이죠.

문제없는 사람이 어디있겠냐- 라는 마음가짐으로 무장하여 자기비하와 자괴감으로 빠지는 것만은 방지하고 있지만은 그게 언제까지 지속될지는 모를 일이니 슬슬 책 읽는 습관도 바꿔야하겠지요.

그래서 좀 더 마음을 열고 읽고 있습니다. 책력

Categories: Books Tags:

jdk 1.6.0_10 b14: Canvas.getGraphics().setXORMode is too slow

July 15th, 2008 9 comments

야밤을 틈타 옛 생각에 물들어.. 한창 애플릿 클라이언트 만들던 2000-2001년 시절 백업해둔 시디를 뒤져보다가, 겨니와 열심히 만들던 가빠채팅 -_- 을 찾게 되었다.

암튼

java.awt.Canvas 클래스 내 EventDispatchThread (EDT) 안에서 getGraphics로 graphics context 를 가져온 뒤 여기다 setXORMode 를 입히고 fillRect 를 하면 엄청난 성능저하를 볼 수 있다.
(setXORMode를 빼보니 빠르게 동작한다. 다른 부분은 아직 테스트해보지 않았음)

700×24 짜리 fillRect 하는데 2,000 ms 이상 걸린다고 하면 믿을 수 있겠는가 -_-
offscreen buffer 에도 똑같이 setXORMode로 그려본 결과 이 부분에서는 전혀 성능 저하가 없다.
그나저나 2000년에 만든 코드여서 그런지 createGraphics 로 offscreen buffer를 만드는 등의 코드들이 여기저기 널려있는데, JDK 1.4부터 추가된 Canvas.createBufferStrategy 덕분에 createGraphics 는 더이상 쓸모가 없어보인다 -.-;

아무튼 미치고 팔짝 뛰겠다.

내 JRE 버전은 1.6.0_10 b14
위 코드가 멀쩡히 돌아가던 시절의 JRE는 MS JVM 1.1 -_-
참고로 옆 pc 에 깔려있던 jre 1.5 에서는 아무런 문제없이 작동한다.

테스트 코드

import java.awt.*;
public class test extends Canvas
{
public void paint( Graphics g )
{
g.setColor( Color.black );
g.fillRect( 0, 0, 400, 20 );
g.setXORMode( Color.red );
g.setColor( Color.yellow );
g.fillRect( 0, 0, 400, 20 );
g.setPaintMode();
}

public static void main( String[] args ) throws Exception
{
Frame f = new Frame(“-_-“);
f.setSize( 400, 400 );
f.setLayout(new BorderLayout());
f.add( new test() );
f.setVisible(true);
}
}

테스트 결과 jdk 1.6.0_10 계열에서만 생기는 문제인 듯 하다.
1.6.0_07 이하 버전에는 XORMode 가 정상적으로 동작한다.

GWT 1.5 RC1 도 그렇고.. 버전 올라가면서 느려지는 게 왜케 많아;;

Categories: Development Tags:

me2video 개발 후기

July 9th, 2008 12 comments

근 1년만에 me2day 범주에 글을 씁니다.
미투데이에서 평생을 함께할 인생의 반려자까지 찾았는데, 너무 매쉬업이 뜸한 거 아닌가 해서 -_-..

한 때는 매쉬업 토론에도 참여하기도 했지만, 매쉬업에 대해 왠지 모를 사회적 트렌드(?)가 마음에 안들어서 잠시 접어뒀었습니다.
매시업관련 용어 정의는 얼마전 교보문고에서 훑어본 Flickr MASHUPS 에서 말하듯 매시업, 리믹스 등이 있는데, 사실 그런 것에는 전혀 관심이 없고 그저 내가 필요한 거 만들고 싶고, 그거 만들고 사용하는데에 필요한 비용들을 절약해주는 리소스가 있다면 뭐든 끌어다 쓰겠다는 심보입니다.

아무튼 이리저리 돌고 돌아 me2video는 완성되었습니다. 며칠전 uri-mapper 포스트에서 쓰던 스타일로 진행해보겠습니다.

동기

me2photo를 만들었으면 me2video도 만들고 싶은 게 당연한 것 아닐까.
작년 7월경 me2video WIPI 버전 개발 시도를 했었으나 XCE의 냉랭한 대응으로 인해 좌절되고 조용히 뒷전에 묻어뒀다.
그러던 지난 6월말 생일 선물로 받은 새 폰, 모토로라 v9m 럭셔리 에디션을 득템하다.
세상에, 320×240으로 동영상 촬영이 되지 않는가! 뒷전에 묻어놨던 me2video 개발 의욕이 다시 물밀듯 올라왔다.

개발을 시작하기 까지

동영상 몇개를 촬영하여 그것을 미투데이에 올리고 싶어졌다. 네이트 아이스박스와 연동되는 me2video는 조잡해서 내 맘에 안든다. 그렇다면 새로 만들어야지 암.. -_-

내 폰에서 320×240으로 찍은 동영상은 3gp로 떨구는데 (file extension은 skm이라고 해놨지만 그놈이 그놈) audio 부분을 EVRC를 쓴다. 그렇담 EVRC 디코더가 있어야 되는데.. 이런 삽질들을 거듭한 뒤 남자답게 포기했다.

그러던 6월 29일 저녁, 와이프 & kkung과 고기를 먹다가 나만 모르던 사실을 알게 되었다.
전송용 동영상이 있다는 올드한 사실을 orz… 전송용으로 찍어 mms로 보내보니 video=mpeg4, audio=pcm_s16le로 예쁘게 전달해주는 게 아닌가.. -_-
그날 밤, 집에 와서 바로 me2video 개발을 시작했다.

첫 프로토타입 완성

밤 10시부터 미친듯이 작업하여 날이 밝을 때쯤 프로토타입을 구경할 수 있었다.

  1. 휴대폰으로 동영상 촬영
  2. vpost at xrath dot com으로 전송
  3. google apps의 pop3 ssl을 열심히 poll
  4. mms 포맷 + 동영상 detect?
  5. 첨부파일 다운로드 및 mms에 포함된 text parse
  6. ffmpeg으로 볼륨 400% 업. 하는 김에 flv 인코딩도
  7. gdata lib으로 내 YouTube 계정에 업로드
  8. me2day-api for java로 YouTube 링크를 포함하여 미투데이에 포스트

멀티 유저 환경 구성

첫 프로토타입은 내 미투데이 사용자키와 YouTube 계정 정보가 소스코드가 박혀있다. 이러면 내 미투데이 친구들과 함께 쓰는 재미를 느끼지 못한다. 그러므로 멀티유저용으로 전환이 필요하다.

그리하여 미투데이 아이디, 사용자키, 휴대폰번호, YouTube 계정을 DB에 저장해둘 사이트 http://me2video.xrath.com/를 만들었다.

만들고나니 사용자키 입력하는게 너무 귀찮다. 그래서 웹기반 쉬운 인증을 적용하여 사용자는 휴대폰 번호만 입력할 수 있도록 했다. (정보 push 해준 kkung 고맙!)

SKT를 넘어.. KTF/LGT 지원

내 미투데이 친구들 중에는 KTF/LGT 를 사용하는 사람이 꽤 있다. 친구들의 KTF 지원 요청을 어찌 버릴 수 있으랴!
topRay 군의 지원으로 KTF mms 동영상 샘플을 얻을 수 있었고, KTF는 audio 부분에 QCELP를 쓴다는 것을 캐치.
그러나 ffmpeg에서 지원하지 않는 audio codec 이다. 그러나 무한 구글링 삽질과 ffmpeg rebuild 를 반복하여 QCELP decoder를 ffmpeg에 부착하기 성공.

me2video가 QCELP를 지원함에 있어 1등 공신은 ffmpeg-devel 메일링리스트의 이 글인데, ffmpeg을 svn trunk 것을 쓰는 내게 간만에 linux c를 다시 건드리는 삽질이 필요했다. 아무튼 이래저리 빌드 성공했고, KTF에서 올린 동영상도 제대로 지원한다.

KTF는 QCELP만 쓰는 게 아니다

이렇게 KTF/LGT(LGT는 KTF와 동일한 포맷을 쓴다. 실제 코드에서도 1개의 if else 처리밖에 필요로 하지 않는다) 지원을 완료했다고 생각했을 무렵..
YosHi 님의 리포팅으로 새로운 사실을 알게 됐다. 어랏 KTF에서 AMR 코덱도 쓰네?
가볍게 configure 에 –enable-libamr-[n|w]b 넣고 rebuild 하여 지원 성공.

완성도 높이기

사용자가 폰카로 동영상을 찍어 vpost at xrath dot com 으로 올리면 download via pop3 ssl, encode with ffmpeg, upload to youtube upload, post to me2day 가 순서대로 진행된다. 그런데 FLV로 인코딩해서 업로드 했음에도 불구하고 엄-청난 시간이 걸린다. 짧게는 1분 길게는 20분 정도.. 유튜브에 완전히 포스팅 되기 전에 me2day 에 올라가면 길게는 20분동안 사용자들이 동영상을 볼 수 없기 때문에 ‘이거 뭐에요? 까만 화면 나오는데.. sorry 래요!’ 라는 댓글을 받아야 된다.
그럴 순 없으니, 20초마다 youtube public url 에 http request 때리면서 publish 완료됐는지 체크 -_-

마지막 손질

미투데이 만박님, 꽃띠앙님의 초스피드 지원을 받아 프리미엄 제휴 파트너만 쓸 수 있다는 완소 parameter 인 callback_url, icon_url, content_type을 날릴 수 있는 권한을 얻었다.

그리하여~
ffmpeg으로 44×44 크기의 thumbnail을 만들고 이를 thumbnail 서버에 ftp로 밀어넣는 등의 작업을 거쳐 아래와 같은 예쁜 모습을 갖추게 되었다.

아핫핫핫- xrath.com은 미투데이의 프리미엄 제휴 파트너인거야? :$
아무튼 이로서, me2video 개발은 일단락 지어졌다. 요새 나 회사일 무지 바쁘다. 이쯤에서 트랜잭션 끝내야 나중에 롤백 코스트 덜 든다.

MMS로 보내야 된다는데, 휴대폰 요금 왕창 나오는 거 아닙니까

SKT는 동영상 포스트 용량에 관계없이 1건당 100원이다. SKT 만세 :$
KTF나 LGT는 SKT보다 비싸서 그런지 도대체 비용관련 내용을 웹에서 찾기가 쉽지 않은데, 건당 200원이라는 말도 있고 동영상 duration 별 과금표도 보인다. 어찌됐든 패킷 과금은 확실히 사라진 듯 한데 전화해서 물어보지 않았으니 장담할 수 없다.

그럼 me2video 사용해보기< /h3>

  • me2video.xrath.com 에서 휴대폰 번호와 자신의 YouTube 계정정보 입력
  • 폰카로 동영상 촬영 (전송용으로)
  • 받는 사람 부분에 email 입력으로 vpost at xrath dot com 입력
  • 전송~
  • 포스트 완료 알람 sms 수신~

그럼 자신의 YouTube 계정에 동영상이 올라간 것을 확인할 수 있고,
미투에 올라간 포스트의 아이콘을 클릭하면 미투데이에 임베드되어 재생되는 YouTube 영상을 볼 수 있게 된다~

도움주신 분들

linux
ffmpeg
commons-dbcp
commons-net
google apps
gdata-youtube
javamail
me2api-java
rath-sms
elle’s-delicious-food
mysql

이녀석들 덕분에 me2video 소스코드는 아래의 import 구문을 포함하여 600줄 미만으로 마무리지었다.

import java.io.*;
import java.net.URL;
import java.util.*;
import java.util.regex.*;
import java.text.SimpleDateFormat;
import javax.activation.*;
import javax.mail.*;
import javax.mail.internet.*;
import com.google.gdata.client.youtube.*;
import com.google.gdata.data.media.*;
import com.google.gdata.data.media.mediarss.*;
import com.google.gdata.data.youtube.*;
import com.sun.mail.pop3.POP3SSLStore;
import net.me2day.java.*;
import rath.util.*;
import org.apache.log4j.*;
import org.apache.commons.net.*;
import org.apache.commons.net.ftp.*;

매시업이란 이런것? -_-

Next

me2photo와는 달리 me2video는 여러가지 절차를 거치기 때문에 me2video mms 전송 후 미투 포스팅까지 평균 7~8분이 걸린다. 여기의 대부분을 차지하는 YouTube publishing 대기 시간을 제거하기 위해 storage를 구하고, 별도 Flash Player를 만드는 것을 생각해볼 수 있겠다.

그리고.. 토큰 10,000개 받고 미투데이에 팔기 -_-?

Thanks to…

– 신혼인데 밤샘 코딩을 허용해준 사랑스런 와이프 elle (미안해! 앞으로도 그럴꺼야! (L))
– 프리미엄 제휴 파트너 기능 열어주신 만박님, 코디안
– KTF 샘플 보내준 topRay
– KTF 테스트 해준
– LGT 테스트 해주신 똥파리
– EVRC 함께 고민해주며 열정에 불붙여준 이슈타르
– AMR 코덱 이슈를 제기해주신 YosHi
– 그 외 me2video를 자발적으로 테스트해주신 제닉스님, 고이고이님, 펭도님, Ze’s님, 마야님, 쭈라니 누나, PETER님, 백일몽님, 케니군, 핑소년님, 지저깨비님, 유에님, 불타는삼나무님 이 포스트를 빌어 감사의 말씀 올립니다.

Categories: me2day Tags: