2008년 4월 6일 일요일

툴팁이 작업표시줄 뒤로 숨어버릴 때...(tooltip that hidden behind taskbar)

요즘 공부하랴 일하랴 정말 정신이 없습니다.

몇일전 연구소장으로 부임한 연구소에서 개인용 노트북을 하나 지급받았는데요,
후지쯔라이프북 E8140 이 바로 그놈이지요...
적당한 사이즈에 좋은 성능까지... 그리고 후지쯔의 컨셉인 다양한 포트지원 등등...
개발자가 들고다니기에는 더나위 없이 좋은 노트북이라고 할 수 있죠...
그런데 이놈도 치명적인 문제점이 있었으니... 기본 OS 가 Vista 더군요.. 큭..
뭐 Vista에서도 개발은 충분하겠지만, 대략 XP에서 안정적으로 돌아가는것이 더 많고...
윈도우즈 메모리쪽을 연구하는 우리팀에서는 Vista 위에서 작업하기에는 문제가 좀 있더군요...
그래서 XP를 깔려고 시도를 했습니다. 근데 산넘어 산이라고 했나요...
오리지날 XP 설치 시디는... 최신 SATA 드라이버가 없어서... 아예 설치 단계에서 하드를 못잡더군요...
그래서 Fujitsu 홈페이지에 가봤더니... 플로피 디스크를 이용해서 드라이버를 먼저 설치 하랍니다.
근데, 노트북에는 플로피 디스크 드라이버가 없었습니다. 그래서 Black Edition 이라는 Repacking 된
XP를 깔아봤더니 잘 깔리는 겁니다.

사실 전 Repacking 된 XP를 별로 안좋아합니다. 만든 사람의 말로는 성능을 최대화 했다는 둥...
필요한 프로그램을 미리 설치했다는 둥.. 말이 많지만 이부분에 대해서는 상당한 논쟁의 여지가 보이고요
그 중에서도 레지스트리를 마음대로 건들여 놨다는건 정말 이해할 수 없는 부분입니다.

어떤 레지스트리를 건들이던간에 side effect를 고려하지 않는다는것이 큰 문제점이지요...

그래서 불안 불안 했습니다.

기본적인 프로그램을 설치하고 개발도구.. 워드 프로세서 등 거의 세팅이 끝나갈려는 마당에 문제가 또 터진거지요
사실 제 성격이 지랄 맞은지라... 뭐 하나라도 제대로 동작하지 않는다면 계속 신경이 쓰이고...
어떻게 하든 문제를 해결할려고 삽질합니다. 문제점이 뭔고 하니...

태스크바의 툴팁이 글쎄.. 뒤로 숨어서 안보이는 겁니다. 툴팁 말고도 벌룬팁까지 안보이니깐....
그다지 자세히 볼 필요는 없는데 눈에 거슬렸다는 거죠...

그래서 역시... repacking은 안돼라고 생각하면서도.. 이방법 외에는 XP를 깔방법이 없다고 생각했습니다.
괜히 열이 받더군요...  그렇다고 어떤 삽질을 해서라도 깔끔한 XP를 설치하기에는 정신적 문화적 충격이
너무 컸습니다. 그동안 삽질을 생각하니 눈에 물이 차는군요..

이 글을 보시는 많은 프로그래머님들은 다들 한 영어 하실거라고 믿고 있습니다. 물론 이런 엄청난(?) 문제에
직면했을때는 네이버 지식님한테 물어보는 것이 그 첫번째 방법입니다.

제가 네이버에 검색어로 넣었던 것이 "작업표시줄 툴팁" 이었죠... 결과는 아주 만족했습니다.
참 어처구니 없는 결과들이 쏟아져 나오더군요.. 네이버는 왜그런지 몰라도 신문기사에서 검색을 먼저하고
검색하는 사람들에게 정신적 데미지를 입히는것이 전문이더군요... 그래서 전문적인 지식을 검색할 때는
잘 안씁니다.

그래서 찾는것이 구글인데... 이놈의 구글의 문제점이라고 하면 한글 검색을 할경우에... 네이버보다 못하다는거죠
결론적으로 영어 검색을 해야하는데... 저같이 영어 무능력자에겐 참 이럴수도 없고 저럴수도 없고...
대충 아는 영어 때려 넣었다가 이상한 결과를 보게되면 구글의 신뢰도가 떨어질수도 있고요...

그래서 넣었던 검색어는 "tooltip behind taskbar" 였습니다. 참 간결하고도 멋진 검색어가 아닐 수 없네요..
쉬운단어 이면서 저의 문제점을 이렇게 잘 표현한것도 없을듯 하네요...

이제 본론으로 들어가야겠네요... 사설이 너무 길었지요...

먼저 마이크로소프트에 포스팅 된 글이 있었습니다. 참 개발자를 난감하게 하는 글이었지요..
원인 : 시작메뉴에서 마우스 오른쪽 버튼을 누름
해결 : 로그오프 하던지 재시작하던지

하하하.. 웃음밖에 안나옵니다.

그래서 다른글을 찾아봤습니다.
다양한 의견의 글들이 있던데 그중에 가장 마음에 드는 답변이 있었습니다.
tooltip은 항상 topmost로 동작해야 하는데 어찌되서 그렇게 되지 않았다. 그래서 tooltip을 topmost로
만들어줘야 한다라고 얘기하고 간단한 C# 소스가 나와있었습니다.
저같은 C# 무능력자에겐 소용없어서 찾아보니 컴파일한 소스가 있더군요

이 글에 걸려있는 파일을 다운로드 받으시면 tooltip fix 라는 파일이 있습니다. 받으시면 되겠고요..
이 파일을 실행하니 간단하게 되네요

tooltipsfix.rar

tooltipsfix.rar 다운로드


그래서 아주 만족하고 있습니다.

본론을 쓰기 위해서 사설이 길어졌는데요, 읽어주셔서 감사하고...

다음에도 더 좋은 정보를 포스팅 하겠습니다.

2008년 2월 21일 목요일

TCPMP에 스킨을 입히자.

프로그래머 급구, TCPMP 스킨 프로젝트!!!


PDA에서 가장 깔끔하게 돌아가는 동영상 재생 프로그램이라면
바로 TCPMP이다.

2006년까지 개발된 프로그램인데... 정식 릴리즈는 0.72 까지이다.
왜 개발이 중지 되었는지는 정확하게 모르겠지만, Core Player로 이름이 변경되어 상용화 되었다.

CorePlayer를 써보고 내가 받은 느낌은... 한마디로
"괜찮긴 하던데 내스타일은 아니다." 였다.

그리고 한국사람에게 가장 중요한 자막기능이 없었다. 별로 쓰고 싶지 않은 프로그램이다.

깔끔한 디자인에다 어디 좀 좋아졌겠지 라고 생각만 들뿐

그에 비해 TCPMP는 왠지 모르게 딱딱하게 생겨가지고 재생기능만 좋을 뿐... 멋진 PDA에서 돌리기엔
너무 볼품없는 프로그램이다.

이런 TCPMP에 스킨 기능이 있다면 얼마나 좋을까...

내가 TCPMP의 소스를 분석할 결과 이미 개발자가 스킨 기능을 생각하고 있었고, 프로그램 여러군데
스킨에 대한 예외처리가 많이 있었다.

하지만 스킨을 불러오고, 제어하는 함수는 완성이 안되어 있었다.

그럼 이런 함수들을 수정해서 스킨 기능을 넣을 것인가?
스킨 기능이 가능 할건지를 몇일동안에 삽질 끝에 알아냈다.

아래 그림은 TCPMP 소스를 수정하여 스킨 기능을 넣은 화면이다.
참고로 WinCE 4.1 에서 테스트 하였다.

사용자 삽입 이미지


다음 그림은 최대화 했을 때의 모습이다.

사용자 삽입 이미지

지금까지는 스킨이 고정되어 있지만, 삽질을 좀해서 스킨을 바꿀수 있는 프로그램을 만들려고 한다.
물론 혼자 삽질하고 있는것 보단, 여러명이 하는것이 나을것 같아서 얘기하는데...
어디 나랑 같이 삽질할 프로그래 없나?

소스를 분석하다 보니깐 조금만 신경 써주면 Core Player 보다 훨씬 더 깔쌈한 프로그램을 만들 수 있을 것
같은데...

-----------------------------------------------------------------------------------------------------

저와 함께 TCPMP소르를 분석하고 수정해보실 분 트랙백이나 댓글 달아주세요.

2008년 2월 10일 일요일

척 노리스에 관한 진실 세번째 이야기

예전 어떤 블로그에서 척노리스에 관한 진실에 대한 글을 퍼온적이 있었다.

잠깐 생각나서 http://4q.cc/index.php?pid=top100&person=chuck에 가봤더니

척노리스에 관한 잔실이 많이 업데이트 되어 있었다.

그 중에서 해석 가능한 몇가지만 포스팅 해본다.

Some kids piss their name in the snow. Chuck Norris can piss his name into concrete.
어린이들은 눈위에 오줌으로 자기이름을 쓸수 있다. 그리고 척노리스는 오줌으로 콘크리트 위에 자신의 이름을 쓸수 있다.

Chuck Norris once visited the Virgin Islands. They are now The Islands.
척노리스가 언젠가 Virgin Islands(직역하면 처녀섬)을 방문했었다. 그건 지금 Islands(그냥 섬)이다.(척노리스가 갔더니 처녀섬이 그냥 섬이 되었다는 뜻)

If you spell Chuck Norris wrong on Google it doesn't say, "Did you mean Chuck Norris?" It simply replies, "Run while you still have the chance."
만약 당신이 구글에서 "Chuck Norris"라는 스펠링을 잘못 입력했을 때 "Did you mean Check Norris?(당신이 검색하는것이 Check Norris가 맞나요?)라는 답변은 하지 않는다. 단지 "기회가 있을 때 도망쳐라"라는 답변을 한다.

Chuck Norris can do a wheelie on a unicycle.
척노리스는 외발자전거를 뒷바퀴로만 탈수 있다.

Chuck Norris can delete the Recycling Bin.
척노리스는 "휴지통"을 지울 수 있다.

Once a cobra bit Chuck Norris' leg. After five days of excruciating pain, the cobra died.
한번은 코브라가 척노리스의 다리를 물었다. 그 코브라는 5일동안 매우 코통스러워하다 죽었다.

Chuck Norris died ten years ago, but the Grim Reaper can't get up the courage to tell him.
척노리스는 이미 10년전에 죽었다. 하지만 저승사자가 그에게 말을 할 순 없었다.

Chuck Norris does not hunt because the word hunting implies the possibility of failure. Chuck Norris goes killing.
척노리스는 사냥을 하지 않는다. 왜냐하면 사냥이란 단어는 실패할 가능성을 가지고 있기 때문이다. 그래서 척노리스는 살생을 한다.

Chuck Norris can slam revolving doors.
척노리스는 회전문을 닫을 수 있다.

Giraffes were created when Chuck Norris uppercutted a horse.
기린은 척노리스가 말에게 어퍼컷을 날려서 만들어졌다.

Chuck Norris can have both feet on the ground and kick ass at the same time.
척노리스는 땅에 두발을 딛은 동시에 킥을 날릴수 있다.

When Chuck Norris gives you the finger, he's telling you how many seconds you have left to live.
척노리스가 당신에게 손가락을 내민다면, 그건 당신에게 앞으로 살날이 몇초 남았는지를 가르쳐주는 것이다.

Chuck Norris can kill two stones with one bird.
척노리스는 하나의 새로 두마리의 돌을 잡을 수 있다.

Chuck Norris doesn't have hair on his testicles, because hair does not grow on steel.
척노리스의 고환에는 털이 없다. 그 이유는 털은 강철에서 자랄수 없기 때문이다.

Chuck Norris is always on top during sex because Chuck Norris never f**ks up.
척노리스는 언제나 상위섹스를 즐긴다. 척노리스는 절대 f**ks up(알아서 해석)을 하지 않기 때문이다.

Chuck Norris can play the violin with a piano
척노리스는 피아노로 바이올린을 연주 할 수 있다.

Chuck Norris is the only person on the planet that can kick you in the back of the face.
척노리스는 지구상에서 당신의 뒤에서 얼굴을 찰 수 있는 유일한 사람이다.

Ghosts are actually caused by Chuck Norris killing people faster than Death can process them.
유령은 실제한다. 죽은사람에 대한 사후 처리보다 척노리스가 사람을 죽이는 속도가 더 빠르기 때문이다.

Bill Gates lives in constant fear that Chuck Norris' PC will crash.
빌게이츠는 척노리스의 컴퓨터가 뻗을까봐 조마조마해 하며 살고 있다.

Chuck Norris eats the core of an apple first.
척노리스는 사과를 씨부터 먹는다.

Chuck Norris never retreats, he just attacks in the opposite direction.
척노리스에게 후퇴는 없다. 오로지 반대 방향을 공격할 뿐이다.

Chuck Norris is not hung like a horse... horses are hung like Chuck Norris
척노리스는 말(horse)같은데에 매달리지 않는다. 말이 척노리스에게 매달릴 뿐이다.

Chuck Norris once had a heart attack; his heart lost.
한번은 척노리스에게 심장마비가 왔었다. 그 뒤에 그의 심장은 실종됐다.

When Chuck Norris enters a room, he doesn't turn the lights on, he turns the dark off.
척노리스가 방으로 들어가면 불을 켜지 않는다. 단지 어둠을 끌뿐이다.

Chuck Norris can drown a fish.
척노리스는 물고기를 익사시킬수 있다.

When Chuck Norris looks in a mirror the mirror shatters, because not even glass is stupid enough to get in between Chuck Norris and Chuck Norris.
척노리가 거울을 보면, 거울을 자기 자신을 깨뜨린다. 그이유는 유리가 척노리스와 척노리스 사이에 있을 만큼 바보가 아니기 때문이다.

Jack was nimble, Jack was quick, but Jack still couldn't dodge Chuck Norris' roundhouse kick.
잭은 영리하고 빠르다. 하지만 잭은 아직도 척노리스의 돌려차기를 피할수 없다.
(Jack is poor 이라는 속담에서 나온듯...)

The only time Chuck Norris was wrong was when he thought he had made a mistake.
척노리스가 실수 했다고 생각했을 때가 척노리스가 잘못할 때이다.

Chuck Norris doesn't need a miracle in order to split the ocean. He just walks in and the water gets the fuck out of the way.
척노리스는 바다가 갈라지는 기적을 필요로 하지 않는다. 단지 물 앞에서 서면 물을 존나게 도망간다.

Originally Chuck Norris was going to be hired to play the role of Jack Bauer on the show "24". The producers changed their minds when they realized the show would last only 17 minutes.
원래 척노리스가 24시에 잭바우어로 출연할려고 했었다. 하지만 제작진들은 24시가 17분 분량밖에 나오지 않을 것이라 깨달고 그들의 마음을 바꿨다.

더 많은 재미있은 이야기가 있지만 의역하기 힘들어서 못 옮긴것들도 있다.
관심 있는 사람은 해당 사이트 가서 살펴보길 바란다.
그리고 의역한것중 잘 맞지 않는 것이 있으면 댓글좀...

2008년 2월 3일 일요일

잭바우어에 관한 진실

미국드라마 좋아하는 분들 많을거다.

최고의 미국드라마를 뽑으라고 하면 많은 사람들이 아마도 X-File을 말할것 같다.
X-File은 데이빗듀코브니(폭스멀더 역)가 하차하기 전까지는 그당시 최고의 인기를 달리던 드라마였는데,
듀코브니가 하차하면서 이래저래 물건너 가버렸다.

그 다음은... 여러가지 얘기들이 나오지싶은데... 프렌즈, 로스트, 위기의주부들, CSI 등등
그 중에서도 당연 24시(24 hours)가 최고일듯 싶다.

24시는 미국 CTU(대테러부대)에서 벌어지는 각종 사건들을 24시간동안 시간순대로 보여주는 드라마다...
전쟁 영화 좋아하는 사람들 강력히 추천한다. 그리고 아역 배우로 좀 뜨다가 시들시들해진 키퍼 서덜랜드라는 있는둥 마는둥 하는 배우를 스타덤에 올려준 드라마다.

그 드라마에서 키퍼 서덜랜드는 테러리스트 마스터정도로 표현할 수 있는 꽤나 감각적이고 무대뽀 정신이 깃든 특수 요원 잭바우어로 나온다.

구글에서 잭바우어로 검색하다 재미있는 사이트를 발견했다. 내용이 너무 재미있고 척노리스에 관한 진실과 상당히 비슷한거 같아서 해석 가능한 부분만 발췌해서 포스팅 한다.

출처 : http://www.twentyfour.tv/jackbauer/index.php?tophundred

Jack Bauer once stepped into quicksand. The quicksand couldn't escape and nearly drowned.
잭바우어가 한번은 사구(사막에 있는 모래늪)에 빠졌었다. 그때 사구는 빠져나오지 못해서 거의 죽을뻔했다.

There are two hands that can beat a royal flush. Jack Bauer's right hand and Jack Bauer's left hand.
로얄플러쉬를 만들어내기 위해선 손이 두개가 필요하다(속임수로 두사람이 필요하다는 뜻, 또는 운과 실력이 따라워야 한다는 뜻). 하지만 잭 바우어에겐 그의 왼손과 오른손이 필요하다.

When someone asked Jack Bauer if he was afraid of James Bond, he replied "What does 'afraid' mean?"
누군가가 잭바우어에게 제임스본드를 무서워하냐고 물어보면 그는 "두려움"이 무슨 뜻인지 되묻는다.
(일반적으로 제임스본드가 누군지를 되물어야 하는 상황이라고 생각하길 바람)

Most people would need months to recover from 20 months of Chinese interrogation. Jack Bauer needs a shower, a shave and a change of clothes.
보통 사람은 20개월간의 중국인의 고문에서 회복할려면 몇달이 걸린다. 하지만 잭바우어는 샤워하고 면도하고 옷을 갈아 입으면 된다.(24시 시즌6에서 중국감옥에서 석방되자마자 작전에 투입된것을 보고 나온말)

If Jack Bauer had been a Spartan the movie would have been called "1".
만약 잭바우어가 스파르탄영화(영화 300을 의미함)에 나온다면 그 영화은 1이 된다.

Some people see the glass as half full. Others see it as half empty. Jack Bauer see the glass as a deadly weapon.
어떤사람에게 유리잔은 반이 채워진걸로 보이고 어떤 사람은 반이 비워진것으로 보인다. 하지만 잭바우어에게 유리잔은 그냥 살상무기일 뿐이다.

There are three leading causes of death among terrorists. The first two are Jack Bauer, and the third one is heart attack from hearing Jack Bauer is coming for them.
테러리스트의 사망원인이 3가지가 가장 많은데, 첫번째와 두번째는 잭바우어고, 세번째는 잭바우어가 온다는 사실에 따른 심장마비이다.

When bad things happen to good people, its probably fate. When bad things happen to bad people, it’s probably Jack Bauer.
나쁜일이 좋은사람에게 일어난다면 그건 운영이지만, 나쁜 사람에게 나쁜일이 일어난다면 그건 잭바우어 때문이다.

Once, someone tried to tell Jack Bauer a "knock knock" joke. Jack Bauer found out who was there, who they worked for, and where the goddamned bomb was.
한번은 어떤사람이 잭바우어에게 knock knock 놀이를 했었다. 그 즉시 잭바우어는 밖에 누가 있었는지, 누구를 위해 일 하는지, 젠장할 폭탄이 어딧는지 찾아냈다.

If everyone on "24" followed Jack Bauer's instructions, it would be called "12".
24시에 나오는 모든 인원들이 잭바우어의 명령에 따른다면, 12시가 될것이다.

Jack Bauer can torture you into giving up information you do not possess.
잭바우어는 당신을 고문하여 당신이 알지 못하는 정보를 캐낼 수 있다.

Jack Bauer once acted as judge, jury, and executioner; but to save time he now just acts as executioner.
잭바우어는 판사, 배심원, 처형자의 역할을 수행했다. 그러나 지금은 시간을 줄이기 위해 처형자의 역할만 수행한다.

Jack Bauer doesn't miss. If he didn't hit you it's because he was shooting at another terrorist twelve miles away.
잭바우어는 실수하지 않는다. 당신이 총에 맞지 않은것은 12마일 뒤에 있는 테러리스트를 쐈기 때문이다.

Don't ever ask Jack Bauer what is going on. He'll explain in the car.
잭바우어에게 무슨일이냐고 묻지마라. 차에서 설명해줄 것이다.

Jack Bauer set an ordinary flash memory card to self-destruct. Don't ask how he did it, he's fucking Jack Bauer.
잭바우어는 플래시 메모리를 자동삭제가 되도록 세팅할 수 있다. 그 방법을 묻지마라. 그는 망할 잭바우어이다.

Jack Bauer doesn't speak any foreign languages, but he can make any foreigner speak English in a matter of minutes.
잭바우어는 외국어를 하지 않는다. 단지 그는 몇분안에 외국인이 영어를 할 수 있게 만든다.

When Jack Bauer took a stress test, the test failed.
잭바우어가 스트레스 테스트를 받을때, 테스트가 포기했다.

Jack Bauer arm once wrestled Superman. The stipulations were the loser had to wear his underwear on the outside of his pants.
잭바우어가 한번은 슈퍼맨과 팔씨름을 한적이 있다. 그 시합의 룰은 진 사람이 바지 밖에 펜티를 입는것이었다.

Jack Bauer has never caught a cold. How do we know? Colds still exist.
잭바우어는 감기에 걸리지 않는다. 우리는 어떻게 아는가? 추위는 아직 존재하기 때문이다.
(caught a cold 는 감기에 걸리다는 표현인데 직역하면 "추위를 잡다"라고 해석된다.)

Jack Bauer wasn't born, he was unleashed.
잭바우어는 태어나지 않았다. 단지 봉인이 풀린것이다.

Jack Bauer can break anyone and anything, but he will always break the protocol first.
잭바우어는 무엇이든지 파괴할 수 있다. 하지만 제일 먼저 프로토콜(명령, 복종관계, 규칙)을 먼저 파괴한다.

Sun Tzu once wrote, "If your enemy is weaker, conquer him. If he is stronger, join him. If he is Jack Bauer, you're fucking dead."
손자병법에서는 "만약 적이 약하면 제압하고, 적이 강하다면 동조하라, 만약 적이 잭 바우어라면 넌 죽음 목숨이다."라고 쓰여있다.

"You don't know Jack" is a blessing among terrorists.
당신이 잭바우어를 모르는것은 테러리스트에게 축복이다.


----------------------------------------------------------

기록되어 있는 대부분의 사실들이 척노리스의 것과 비슷했다.

이 글을 읽으면서 왜 이런 글이 나왔지는 알고 싶으면 드라마 "24시"를 꼭 보길 바란다.

2008년 1월 24일 목요일

고등학생들에게 전과목 영어 수업이라뇨???

드디어 나라가 미쳐가는 모양입니다.
전 명박이와 그의 쫄들이 단순이 멍청하고 개념이 없는 줄 알았는데... 나라를 궁지로 몰아가는군요... 교육은 한 나라의 백년대계로 교육정책이 바로 서 있어야 나라가 바로 선다는거 명박이를 제외한 모든 분들은 알겁니다.

제가 한 나라의 대통령 당선자를 명박이라고 부르는거 이해 부탁드립니다. 명박이는 아직 대통령이 아니고 대통령 당선자일 뿐이죠..

요즘 인수위가 하는 행동들을 보면 현역 대통령한테 말하는 꼬라지 하고 하는 거 보면 참... 뭐랄까. 이제 상견례 막 끝낸 며느리가 시집에 와서 시부모한테 이래라 저래라 하는 거랑 별 반 다를게 없어 보이는군요...

하나 하나 짚어보자면 마음에 드는구석 하나 없어보이지만...

오늘 참 어처구니가 없는 신문기사를 봤습니다.
고등학교에서 전과목 영어 수업을 한답니다. 우리나라가 언제 America가 된겁니까?
이유도 참 뭐같더군요... 사실 씨발 좃같더군요... 도대체 인수위와 명박이는 생각이 있는겁니까?
영어 사교육비를 줄이자고 전과목 영어 수업을 한다고 하다니... 그리고 많은 이해력이 필요없는 "수학", "과학", "예체능" 부터 시행한답니다.

공학박사 과정을 공부하는 저에게 있어서는 "수학","과학"을 이해력이 필요없는 과목이라고 단정한게 참으로 지탄스럽기 짝이 없습니다. 물론 "예체능"역시 발로하는 과목이 아니지요... 세상 어떤 일이 이해없이 진행될 수 있을까요?

인수위가 정부부처를 개편하면서 정통부를 없앤다고 지랄할때 부터 이것들이 우리 나라를 말아먹겠구나 하고 걱정이 되었었는데... 우리나라 산업을 이끌어온 "과학"을 이해가 필요없는 과목으로 단정하다니요!!! 그래서 인수위가 된겁니까? 정치라는 과목은 이해력이 무지하게 필요한 모양인데 정치라는 과목을 전공해서 하는 정치인들이 상황 이해력이 그거 밖에 안되는 거 보니 고등학교때 정치 과목을 영어로 들었던 모양입니다.

그리고 고등학교 수업을 영어로 한다면 영어 사교육비가 줄어든다고 누가 그럽니까? 고등학교 수업을 영어로 하게 되면 고등학교 수업을 따라가기 위해서 초등학교 중학교 부터 영어 과외를 하는 학생들이 많아진다는 것을 어찌 모릅니까? 결국 유치원생부터 영어로 수업 할 생각입니까? 근본적인 해결 대책을 못 내놓고 땜빵식의 해결책을 내놓으면 어쩌자는 겁니까?
차라리 한글을 없애는게 영어 사교육비를 줄이는 최선의 방법처럼 보이는건 저 뿐인겁니까?

명박이가 대통령에 출마하면서 걸었던 얼토당토 않한 고등학교 수업 전면 영어수업으로 하겠다는 공략 정말 시행할 생각입니까? 그나마 명박이를 손톱의 때만큼이나 믿었던 저는 왜 이렇게 제 자신이 어리석게 느껴지는 것일까요...

제가 이런글을 쓰고는 있지만 저만 이런생각 가지고 있는거 아닐겁니다. 명박이가 아직 대통령이 되진 않았지만 벌써부터 명박이 임기가 끝나길 기대하고 있는건 도대체 왜 그럴까요...

인수위와 명박이는 자기 딴에는 나라를 개편하겠다고 설쳐보이는것이지만 자기들 혼자 개편한다고 어처구니 없는 방법을 꺼내들고와서 설치면 나라가 바뀐답니까?

대안이 없으면 비판도 하지말라라고 했습니다. 사실 이렇게 된 우리나라 뾰족한 대안이 없겠지만 그래도 좋은 방향으로 흘러가야죠. 대통령이 되는건 나라를 잘 이끌기 위해서 대통령이 되야지 자기의 생각을 나라를 대상으로 실험해볼려고 되는건 아닙니다. 명박이 형 정신좀 차리세요.

그리고 인수위... 아직은 노무현 정권입니다. 노무현 대통령이 아무리 삽질을 했어도, 존중해주지는 못할망정 인수위 자신이 차기 대통령 처럼 행동하는건 사실 꼴불견입니다.

좀 알아먹고 수용 가능한 정책들을 들고 나와서 나라에 칼을 대길 바랍니다. 그래도 잘될지 안될지 모르는데 어찌 그렇게 자신있게 얘기하는지 정말 궁금합니다.

2008년 1월 21일 월요일

멜론 파일(DCF)를 MP3로 만들자.. #3

오랜만에 다시 시작한다.
3번째 시간... 멜론 파일(DCF)를 MP3로 만드는데 필요한 것들을 프로그램으로 구현한다.

오늘은 DCF 파일에서 음악에 대한 정보를 추출하는 방법에 대해서 알아보자.
DCF 파일을 메모장으로 열면 다음과 같다.

2 : Rights-Issuer:http://mobile.melon.com/utility/dcfd.jsp
3 : Content-Name:?덇? ?щ뒗 洹몄쭛
4 : Content-Description:1764198 11
5 : Content-Vendor:melon.com
6 : Icon-URI:http://icon.digicaps.com/icon.asp
7 : eTarget:MIN,"SSeID-1/6715B86BE79D2FAA0617"
8 : eCEK:SSKEY-1;cidType=MIN;dMethod=AES128CBC-RFC2630;eValue="4603F2D6713F6DD8E3F13536469706E3A087BA1DC7F847A18FE1E8F539BB2ACE"
9 : Usage-Control:Time-Not-After/20080204235959Z+09,Allowable-Services/00000000;cidType=MIN;eAuthCode="SSeAuth-1/F7FD18EFD6A894E12893"
10 : Meta-Container:KS_C_5601-1992;MENU="mp3";Title="니가 사는 그집 - 박진영";Copyright="widerthan";Length="00:03:47";Codec type="mp3";


앞에 붙은 숫자는 라인번호이다. 중요한 정보는 10번째 줄에 있는데 이부분을 추출하는 프로그램을 만들어 보겠다.
왜 다른건 놔두고 10번째 줄만 추출하는가? 그리고 추출해서 어디에 쓰는가? 라는 질문을 가질수도 있다. 그에 따른 대답은 10번째 줄은 음악의 길이 제목 가수명 등의 정보를 가지고 있고, 그 정보를 이용하여 녹음에 활용 할 수가 있다. 그리고 녹음이 끝난후에 변환된 MP3파일에 ID3태그를 채우는데도 활용이 된다.

정보를 추출하는 과정은

1. 파일을 연다.
2. 10번째의 정보를 읽는다.
3. 필드별로 정보를 가져온다.

이과정을 거치면 된다. 그럼 만들어진 프로그램을 보자
먼저 파일 정보에 대한 구조체는 어떻게 생겼는지 생각해보자.
지금부터 나오는 프로그램 소스 코드에 대한 태클을 사양해줬으면 좋겠다. 이 글을 보는 사람 중에는 나보다 내공이 더 높은 사람도 많을 것이다. 프로그램이 비효율적다. 어처구니 없다. 이런식의 태클은 그냥 생각만 해달라. 내 프로그램을 보고 아이디어를 얻어서 더 좋은 프로그램을 만든다면 그걸로 만족한다.


typedef struct _dcf{
 char Title[100];  //제목
 int  Length;   //음악 길이(초)
 int  SampleRate;  //샘플링 레이트
 char Genre[30];  //장르
 char Album[100];  //앨범
 char Artist[100]; //가수
 int  TrackNum;  //트랙번호
} dcf;



프로그램에 사용될 구조체이다. 이 구조체는 음악에 대한 정보를 담고 있다. 근데... DCF 파일에 있던 BitRate에 대한 정보는 없다. 왜 없을까... BitRate는 MP3에서 사용되는 정보인데, 음악파일(Wav)을 어느정도로 압축할 것인지 결정하는 정보이다. 나는 일단 Wav 로 저장할 것이 때문에 BitRate 정보는 사용하지 않는다.

다음은 DCF 파일에서 정보를 가져오는 함수를 만들어 보자

int getDCFFileInfo(char* FileName, dcf* data)
{
 int i, j, k;
 char* ci, *cj;
 FILE *fp;
 char dummyData[14][500];
 char dummyData2[14][500];

 fp=fopen(FileName,"r");
 if(fp == NULL)return -1;
 for(i=0;i<10;i++)
  fgets(dummyData[0],500,fp);
 fclose(fp);

 j=1; k=0;

 for(i=0;i<strlen(dummyData[0]);i++)
 {
  if(dummyData[0][i] == ';')
  {
   i++;
   k=i;
   j++;
  }
  dummyData[j][i-k]=dummyData[0][i];
 }

 for(i=2;i < 14;i++)
 {
  memset(dummyData2[i], 0, sizeof(char) * 500);
  ci=strstr(dummyData[i], "=\"");
  for(cj = ci+2; (*cj) != '\"'; cj++)
  {
   dummyData2[i][cj - ci -2] = *cj;
  }
 }

 strcpy(data->Title, dummyData2[3]);
 strcpy(data->Genre, dummyData2[10]);
 strcpy(data->Album, dummyData2[11]);
 strcpy(data->Artist, dummyData2[12]);
 data->TrackNum = atoi(dummyData2[13]);
 data->SampleRate = atoi(dummyData2[8]);


 return 0;
 
}



생각보다 프로그램이 길어졌다. 짧게도 만들수 있겠지만 내가 무지한 관계로 프로그램이 좀 길어졌다. 그냥 그렇구나 이해해졌으면 좋겠다.

이 함수는 DCF의 10번째 줄을 파싱해서 스트링 배열에 넣은다음 데이터형에 맞게 변환하여 구조체에 저장하는 함수이다.

여기 까지가 DCF 파일에서 정보를 추출하는 방법이다.
하지만 이 함수를 그대로 가져다 쓰기에는 문제가 좀 있다. 그 이유는 문자셋 때문인데 윈도우즈 프로그래밍을 할 때는 문자셋에 유의해서 프로그램을 작성해야 한다.

예를 들어 char를 TCHAR 로 쓴다던지 strcpy를 lstrcpy로 쓴다던지 하는것인데 이부분에 대해서는 자세히 설명하지 않을것이고, 이에 대한 자세한 정보는 다른 서적을 참고하기 바란다.

다음 글에서는 Wav 파일 녹음에 대해서 알아보겠다.

2008년 1월 11일 금요일

멜론 파일(DCF)를 MP3로 만들자.. #2

다시 구질구질한 이야기를 써보자..
멜론 파일(DCF)를 MP3로 만들자.. #1에서 MP3를 어떠한 순서를 통해서 만드는지를 설명했다.

이번 글 #2에서는 #1에서 제시했던 과정이 왜 필요한가를 알아보자

사용자 삽입 이미지

#2에서 나왔던 그림이다.

1) 재생파일 분석
이 과정은 지금 재생하고자 하는 파일의 정보를 알아낸다. 정보를 알아내는 이유는 MP3 ID3 태그에 들어갈 가수, 제목, 앨범 정보를 얻기 위함이고, 녹을 할때 녹음을 하는 시간을 알아내기 위해서 이다. 정보는 간단하게 찾아낼 수 있다.
DCF 파일에서 음악에 대한 정보는 ASCII로 파일을 열었을때 10번째 줄에 Meta 데이터로 기록되어 있다.

대략 아래와 같은 모습이다.
Meta-Container:KS_C_5601-1992;MENU="mp3";Title="니가 사는 그집 - 박진영";Copyright="widerthan";
10번째 줄에는 위에 보이는 정보 외에도 파일 사이즈, Bitrate, Sampling Rate, 장르.. 트랙넘버
이런것들이 기록되어 있는데 이걸 활용해서 파일을 만든다면 결과가 상당히 좋을것 같다.


2) Melon Player 실행
이건 또 왜 실행 시켜야 하는가?? 당연히 DCF파일을 재생해야 하기 때문이다. 실행하는 방법은
[멜론플레이어 실행파일명.exe] [멜론파일.dcf] 형식으로 실행했을 때 바로 재생된다.
그럼 재생할려고 로딩하는 시간과 재생이 끝나고 난뒤의 여유 시간을 더해서 2초정도.. 그럼 1번 과정에서 얻어낸 시간에 +2초를 하게 되면 총 녹음 시간이 나오는것이다. 이거... 손으로 해도 정확할거 같은데 원래 자동화에 이러한 오차정도는 어느정도 고려해야 한다.

3) 녹음시작, 플레이어 재생
일단 녹음을 어떻게 하는지는 나중에 얘기하기로 하고 멜론플레이어를 실행할 때 DCF파일을 인자로 넘겨주면 바로 재생되기 때문에 2번 과정과 3번과정은 연속적으로 진행된다고 보면 된다. 2번과정에서 얘기한 앞에 2초정도는 플레이어 로딩시간이기 때문에 플레이어를 실행하자 마자 녹음을 시작하면 된다는 것이다.

4) 플레이어 종료
플레이어를 종료시키는 이유는 플레이리스트를 삭제하기 위해서 이다. 멜론 폴더에 자기 아이디로 되어 있는 폴더 안에 플레이 리스트 파일이 있다. 이 파일을 멜론 플레이어가 실행하는 동안에 점유를 계속하기 때문에 이 리스트 파일을 삭제하기 위해서는 플레이어를 강제종료 시켜야 된다.

5) 플레이 리스트 삭제
플레이 리스트는 왜 또 삭제 하나... 그 이유는 원하는 파일을 하나 재생하고 나서 이전에 재생했던 다른 파일의 재생을 막기 위해서이다. 녹음하는데 시간 오차를 많이 줘버릴 경우 후반부의 다음곡이 녹음되어버리는 불상사를 막기 위함이다.


여기까지... 그럼 이걸 프로그램으로 풀어내야겠지?
윈도우즈 프로그래밍 조금 하는 사람들은 벌써 머릿속에서 다 계산이 되어서 몇번 과정에 뭐를 써야 하는지 다 알것이다. 그래도 모르는 사람들이 있으니깐 한번 짚고 넘어가자.

WinAPI를 기준으로 설명한다.
1번 과정 CreateFile, ReadFile
2번 과정 CreateProcess
3번 과정 waveInOpen, waveInAddBuffer
4번 과정 ExitProcess

이정도만 제시해주면 벌써 다 만든 사람 있겠지? 다음 #3 부터는 실제 프로그래밍에 들어가보도록 하자.