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 부터는 실제 프로그래밍에 들어가보도록 하자.

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

이 글을 읽는 여러분들은 컴퓨터를 언제 가장 많이 쓰는가?
사람들 마다 답이 다르겠지만, 나는 아마도 음악을 듣는데 가장 많이 쓴다고 답변할 것이다.

그것도 그런것이 공부할 때, 작업할 때, 개발할 때, 문서 작업 할 때..
따지고 보면 게임 할때를 제외하고는 계속 컴퓨터에서 음악이 흘러 나온다.
시간으로 따지고 보면 음악 재생 프로그램이 가장 오랜 시간동안 동작한다.
그럼 음악을 재생할 때는 어떤 매체를 이용하는가?

CD라고 생각하는 사람들이 있겠고.. 십중팔구 MP3라고 대답할 것이다.
LP라고 대답하는 사람은 없겠지? 카세트 테이프?? 오지마라..

MP3 파일은 어디서 구하는가? 어둠의 경로?
몇개월전에 벅스뮤직에서 월 15000원인가 10000원인가에 MP3 무제한 다운로드 서비스 열었다가
저작권 때문에 한방 맞은것을 기억한다.
요즘 가장 뜨는 음악 사이트는 아마 멜론이 아닐까..
멜론에서 MP3파일을 받을 수 있는가?? 정답은 No.
멜론에서는 DRM(Digital Rights Management) 형식의 DCF 파일을 다운로드 받을 수 있다.
DCF 파일에 대해서 간단히 얘기하자면... 기간과 재생 장치가 정해져 있는 MP3파일이다.

얼마전인가 DCF파일에서 MP3로 변환하는 방법을 알아낼려고 무지하게 애를 썼었다.
결국 알아낼 수 없었다. 지금 깨달은 거지만... 앞으로도 알아낼 수 없을 것이다.
아니지 언젠가는 크랙이 되겠지만. 가까운 미래에는 불가능 할 것이다.

그럼 멜론의 DCF의 재생방식에 대해서 알아보자.. 이부분은 순전히 내 추측으로 쓰는것이다.
(태클 환영합니다.) 내 추측이니 그냥 그런갑다 생각해주면 너무 고마울것 같다.

사용자 삽입 이미지


서버에 음원파일이 있고 Melong Player를 통해서 DCF 다운로드 또는 스트리밍을 한다.
음원파일은 WAV가 될수도 있고 MP가 될수도 있는데 멜론서버를 통해서 날짜와 아이디를 이용하여 암호화 된다. 물론 휴대폰이나 MP3플레이어로 전송될때는 날짜와 플레이어 고유 ID를 통해서 암호화 되는걸로 보인다.
결론적으로 다운로드 된 파일은 DCF 파일이며 MP3플레이어에서는 날짜와 휴대폰으로 복호화 해서 재생을 하게 된다.

자 그럼 이걸을 어떻게 분석할 것이가...

이렇게 생각하는 사람들 분명히 있을것이다. 그럼 날짜와 MP3플레이어 아이디 이용해서 복호화 시키면 바로 MP3 파일로 변환할 수 있겠네... 라고 생각하는 사람...
그게 진작 되었으면 멜론은 망했다라고 하자...
물론 불가능한건 절대 아니다... DVD도 크랙되었고. WMV도 크랙된 적이 있다.
이것도 언젠가는 크랙되겠지... 그래서 한번 해볼까 하고 DRM 스펙이라던지 뭐.. 별별 자료는 다 찾아 봤지만 결론은 힘들다 였다.
그리고 크랙이 되었을 경우에... 멜론에서 가만히 있지 않는다. 암호화 방식을 약간 변경한다던지 키 값 생성방법을 다르게 하면 또 분석해서 크랙해야 된다.
결론적으로 저것을 기획한 사람이 아니면 원천 봉쇄적인 크랙은 안된다는 것이다.

이에 관련 자료를 웹사이트에서 찾아봤더니
대부분 멜론플레이어를 재생하고 루프백으로 녹음하는 방법을 사용하더라.
뭐 이 글에서도 그런 방법을 사용할것이다. 이 문장 읽고 실망하시는 분들 좀 더 읽어보던지
아니면 그냥 돌아가던지...

그럼 내가 쓰는 이 글이 다른글하고 무슨 차이가 있어? 라고 생각하는 사람들 있을것이다.
그런 사람들은 내 블로그 이름을 다시 한번 살펴보고..

난 앞으로 쓰여질 이 글에서 재생, 녹음, MP3을 어떻게 하면 자동화 시킬것인지에 대해서 논하겠다. 이 글을 읽을려면 윈도우즈 프로그래밍에 대한 약간의 기초적인 지식이 있어야 할것이다.

작업 순서는 다음과 같다.
사용자 삽입 이미지

위의 그림은 멜론 플레이어를 충분히 분석한 뒤에 나온 그림임을 알아두길 바란다.
1 번부터 5번까지는 프로그램을 직접 작성해 자동화 되는 방식으로 진행된다.
3번이 두개인 이유는 3번 과정이 동시에 진행되어야 하기 때문이다.

그럼 다음 글에서는 위의 같은 순서가 왜 필요한지 짚어보도록 하자..

퍼가길 기대하지 않지만 퍼가시는 분들은 출처를 꼭 밝혀주시기를 바랍니다.

2008년 1월 5일 토요일

Tomcat5 + Mysql + Apache + PHP 한글 신경 안쓰고 설치하기(대박)

Apache의 Tomcat ... 젠장
완전 깡패(Apache)에 양아치(Tomcat:여자뒤를 졸졸 따라다니는 남자)같은 놈들이다.
이놈들과 씨름한지 사흘째... 결국 결론을 찾았다.

첫째날..
Tomcat5를 Fedora6에 설치했다. Manager까지 띄우고 나서 설치할려고 하는 Web Application이 컴파일이 안되서 하루를 잡아먹었다.... 결국 컴파일 성공

둘째날
설치한 Web Applicaion과 MySQL 사이에 한글 에러가 나서 하루를 잡아먹었다.... 결국 GG...

셋째날
한글문제를 해결할 방법을 찾아내다... 여러분 더 이상 고민하지 마라... 간단한 길이 있다...
정답은 바로... Redhat... 그것도 9..   Enterprise Edition 아니다.  Redhat9.. kernel 2.4

지금 부터 설명하는건 회사 웹서버 설치 방법이 아니다....
그냥 개인적인 서버 돌릴때나 써먹어라..
그리고 redhat9 쓴다고 비웃는 사람들... 다시는 내 블로그 오지마라.

그럼 시작해볼까..

Step1. Redhat9 을 설치한다. kaist 서버에 가면 있다. 속도도 빠르고... CD 3장 밖에 않한다.
설치 옵션은 webserver + ftpserver + 편집기 + 개발용도구(gnu-java 제외) + mysql
그렇다... 기본적인 mysql 쓴다. 3.x 버전인데 쓸만하다. 서브쿼리는 안되지만...
위에도 말했듯이 개인적인 서버 꾸밀때 쓰는 방법이다. 물론 노력하면 4.x 버전으로 설치 할 수 있다. 그건 다른 사람이 쓴 글 보고 연구하기 바란다.

Step2. 세팅 시작
-- 리눅스의 한글 설정 확인 vi /etc/sysconfig/i18n
-- 첫번재 줄에 LANG="ko_KR.eucKR" 로 설정되어 있다면 pass 그렇지 않다면 설정하고 저장
-- setup에 가서 mysqld, vsftpd, httpd 을 시스템 서비스 자동시작으로 바꿔준다

Step3. JAVA SDK 설치
-- java.sun.com 으로 가서 jdk-6u3-linux-i586.bin을 다운로드 받는다. 버전에 따라 파일명이 약간 다를 수 있다.
--  /usr/local/src 로 jdk-6u3-linux-i586.bin을 복사한다.
-- %cd /usr/local/src
-- sh jdk-6u3-linux-i586.bin
-- 압축이 다 풀리면  %cp -R jdk1.6.0_03 ../jdk

Step4. ant 설치
-- www.apache.org 로 가서 apache-ant-1.7.0-bin.tar.gz 다운로드
-- Ant가 뭔지 궁금한 사람은 따로 찾아보도록 하고 java에서 쓰는 make 라고 생각하면 된다.
-- /usr/local/src로 복사
-- %cd /usr/local/src
-- %tar xfz apache-ant-1.7.0-bin.tar.gz
-- cp -R apache-ant-1.7.0 ../ant

Step5. tomcat 설치
-- www.apache.org로 가서 /apache-tomcat-5.5.25.tar.gz 다운로드
-- /usr/local/src로 복사
-- %tar xfz apache-tomcat-5.5.25.tar.gz
-- %cp -R apache-tomcat-5.5.25 ../tomcat

Step6. 환경변수 설정
자 여기까지 왔으면 벌써 5개 설치됐다. httpd, mysqld, jdk, ant, tomcat....
명령 몇개 쳤는데 벌써 다 됐다. 이제 환경변수 설정해줘야 한다.
우리가 하는건 편한 윈도가 아니고 리눅스이기 때문에 이런거 다 해줘야 한다.
귀찮으면 윈도 써라... 처음부터 끝까지 마우스로만 설치해도 되는거 많다.
% vi /etc/profile
가장 아랫 줄로 가서
JAVA_HOME=/usr/local/jdk
export JAVA_HOME
ANT_HOME=/usr/local/ant
export ANT_HOME
CATALINA_HOME=/usr/local/tomcat
export CATALINA_HOME
PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin
export PATH
CLASSPATH=$CLASSPATH:$JAVA_PATH/lib:$CATALINA_HOME/common/lib
export CLASSPATH
추가 한 다음 저장하고 나온다.
환경변수 적용 : % source /etc/profile

Step7. Tomcat 설정
cd /usr/local/tomcat/conf
vi tomcat-user.xml
<tomcat-users> 태그 안에  
<user name="admin"  password="admin"  roles="admin, manager" /> 추가
이렇게 추가하면 tomcat manager 에 admin//admin 으로 로그인 가능하다.
저장하고 나와서 톰켓을 실행한다.
$CATALINA_HOME/bin/startup.sh
경로들이 제대로 나오면서
http://server_ip:8080 으로 접속해서 tomcat manager 화면이 나오면 성공
----------------------------------------------------------------------------------
정리하면서...
Tomcat 자체가 너무 생소했고... 아파치 http 와는 차원이 다른 한글문제 등으로 오랜동안
좌절했다... redhat9 의 경우 설치부터 eucKR 로 설치 하기 때문에 unicode -> eucKR 에서 생기는 문제점을 해결 가능하다. 하지만 커널 버전이 낮기 때문에 사람들이 선호하지 않는다.
근본적으로 한글 문제를 해결하기 위해서는 모든 페이지를 unicode로 만드는 것이다.

지금 설정으로는 80포트로는 php, 8080 포트로는 jsp 서비스가 가능하다. 80 포트로 php와 jsp 동시에 서비스 하기 위해서는 jakarta-connection 설정을 하면 된다. 이부분에 대해서는 각자 찾아보길 바란다. 내 생각으로는 방문자가 많지 않은 홈페이지에서는 아파치 서버와 꼭 연결할 필요없이 tomcat을 80으로 세팅해서 쓰는 방법도 괜찮을것 같다. 사람들이 말하길 아파치가 성능이 좀 좋다고 하는데 그거야 엄청난 방문자들이 들어올때 이야기고 아파치가 jsp를 처리한다고 해서 tomcat이 돌지 않아도 된다는 얘긴 아니다. 그리고 한 서버에서 php와 jsp를 동시에 돌리는 것은 별로 좋은 방법이 아니라고 본다.

2008년 1월 4일 금요일

javax.servlet.jsp does not exist 문제해결

톰캣을 설치하고 나서

몇날 몇일을 고생하게 만들었다.

다음과 같이 해결

JAVA_HOME=/usr/local/jdk1.6.0
ANT_HOME=/opt/SDK/lib/ant
CATALINA_HOME=/usr/local/apache-tomcat-5.5.25
export CATALINA_HOME
export ANT_HOME
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:
                  $CATALINA_HOME/common/lib/servlet-api.jar:
                  $CATALINA_HOME/common/lib/jsp-api.jar:
                  $CATALINA_HOME/webapps/ROOT/WEB-INF/classes

Set Default JAVA with SUN JAVA in Fedora 5,6,7

Fedora Core developers make it rather hard to install and properly configure Sun’s JVM. All said and done Sun’s JVM (comes with JDK) is the best JVM implementation out there; not to mention that it is the reference implementation. Here is how you can easily install JDK 6 / Java SE 6 in 5 minutes or less. Here are the steps:

1. Login as root

2. First you need to download it from here. This works fine from GUI browsers like Firefox, Internet Explorer or Safari. However Sun makes it very hard (from java.sun.com) to download it for Linux console users (like those trying to install on their dedicated web server). You cannot access the download link from text based lynx browser. Fortunately there is a way. I found a secret location for you to easily download JDK 6 using wget or curl (console apps). This is also very useful if you are planning to use any download accelerators. The current binary (32 bit version) is here. This link will surely change with time so it is better to browse to the link above and then access this link from that page.

Download it using wget or curl. The command, for example, today will be:
wget http://www.java.net/…/jdk-6u2-ea-bin-b02-linux-i586-12_apr_2007-rpm.bin

Note: The link has been truncated for brevity, however it is hyperlinked to the actual link.

3. Now change the permission of the downloaded file to 755 like this:
chmod 755 jdk-6u2-ea-bin-b02-linux-i586-12_apr_2007-rpm.bin

4. Then run it:
./jdk-6u2-ea-bin-b02-linux-i586-12_apr_2007-rpm.bin

You will need to type yes to indicate your acceptance to their agreement and the installation will complete on its own. Unfortunately you are not yet done. Type java -version on the command line and you will see that it still points to the crappy old JVM from gcj.

5. Now you need to find the actual location of your JDK installation and indicate to Fedora to accept your choice.

Type the following:
updatedb;locate javac |grep bin

You will see an entry like this:
/usr/java/jdk1.6.0_02/bin/javac

Here /usr/java/jdk1.6.0_02 is the actual JAVA_HOME for your machine. Note this as you will need it to run the future commands.

Now you need to run the alternatives command to instruct Fedora to recognize Sun’s JVM.
alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_02/bin/java 100
alternatives --install /usr/bin/jar jar /usr/java/jdk1.6.0_02/bin/jar 100
alternatives --install /usr/bin/javac javac /usr/java/jdk1.6.0_02/bin/javac 100

You can do this for other Java executables too, should you need them, following the same pattern.

Note: If alternatives is not in your path then use locate alternatives to locate it.

Finally you should configure alternative to use Sun’s JVM as the default JVM. To do this type:
/usr/sbin/alternatives --config java

This will present you with at least 2 options. Choose the one for Sun’s JVM. Similarly repeat the process for other commands.

Now you are done configuring Fedora for the most part. Type java -version and you should see something like this:

java version “1.6.0_02-ea”
Java(TM) SE Runtime Environment (build 1.6.0_02-ea-b02)
Java HotSpot(TM) Client VM (build 1.6.0_02-ea-b02, mixed mode, sharing)

Note: This works for most part, except Tomcat. The default installation of Tomcat has been hardwired to use GCJ. I changed the configuration file and it didn’t help. My solution for Tomcat is to ditch Fedora’s version and install directly from site. It works like a charm. Set JAVA_HOME to the value we found above and you are done.

FC6에 APM+Oracle+Tomcat+Resin 설치

어제 하나로 IDC 가서 페도라6 으로 갈아 치웠다.
대략 14시간의 삽질 끝에 모든 설치를 성공하고 이렇게 글을 남겨 본다.
Apache2.2 + PHP5 + MySQL5 + Tomcat6 + Resin3.1 + Oracle10g + JDK1.6 설치 가이드.
아마 가장 최신의 패키지들을 설치한것이 아닐까 하는 생각이 든다.
거두 절미하고 본격적으로 시작하니 잘 따라해보자.

모든 설치는 putty, realvnc를 이용하여 설치했다.
realvnc 설정 가이드도 있으니 무시하지 끝까지 보고 따라해보자.


1. APM 설치
Apache2.2 + PHP5 + MySQL5 는 RPM 패키지로 설치한다.
아마 대부분 설치가 됐을것이므로 자세한 가이드는 패스한다.

2. 페도라6 처음 설치시 해주면 좋은것들..
bash$> updatedb

mlocate를 사용할때 캐쉬를 이용한다.
페도라6 처음 설치 시 이 캐쉬파일이 없어 locate가 동작하지 않을것이니 앞으로의 편의를 위해 캐쉬를 만들어주자.


3. 필요없는 자바, 톰캣 관련 패키지 삭제
우리는 현재 최신버전의 JDK 1.6 을 설치할 것이다.
하지만, 페도라6 는 GNU 버전의 JDK1.4.2 를 기본 패키지로써 제공하고 있다.
구버전은 안키운다. 삭제해주자.
또한, 페도라6에서 기본적으로 설치되는 톰캣은 5.5 다.
구버전은 안키운다. 삭제해주자. (-_-)

bash$> yum -y remove tomcat\*
bash$> yum -y remove \*java\*

톰캣을 삭제하면 종속성에 의해 이클립스가 삭제된다.
뭐 필요없다 페도라6 에서 제공하는 이클립스는 3.1 이다.
이클립스 3.2 는 나중에 따로 가이드를 올리겠다.
앞에 \ 는 역슬러시다 java 라는 단어가 들어간 패키지명은 모두 삭제한다.
조금 시간이 걸릴것이므로 느긋하게 기다린다.


4. 필수 패키지 설치
앞으로 진행을 편히하기 위해 필요한 모든 패키지를 설치하고 가자.

bash$> yum -y install httpd-devel php-mysql libXp-devel libXp perl

httpd-devel: apxs mod_jk의 동적 모듈 컴파일을 위해
php-mysql: php에서 mysql에 연결하기 위해
libXp, LibXp-devle: 오라클 설치 때 필요한 openmotif 패키지 때문에..
perl: 펄은 대부분 설치 되었겠지만 없으면 설치해야한다.

-y 옵션은 모두건 yes 한다는거다.
뭐뭐 설치되는지 구경하고 싶으면 -y 옵션을 빼자

우선 필요한 패키지들을 설치해준다.
이젠 openmotif21-2.1.30-14.i386.rpm 를 설치해야 한다.
첨부된 파일을 다운로드 받고 압축을 풀면 openmotif21-2.1.30-14.i386.rpm 파일이 나온다.
적당히 서버에 업로드하고

bash$> rpm -Uvh openmotif21-2.1.30-14.i386.rpm

이젠 오라클 설치에 필요한 패키지를 설치해야한다.
아래 패키지는 꼭 설치해 주도록 하자.

bash$> yum -y install setarch-\* tcl-\* libXau-devel-\* libXp-\* compat-db-\* compat-db-\* compat-libstdc++-33\* compat-libf2c-34-\* compat-gcc-34-\* libaio-* compat-gcc-34-c++-\* compat-libstdc++-296\* compat-libgcc-296\*

여기서 중요한건 띄어쓰기다. 잘보고 한줄에 모두 입력하도록 한다.
너무 길어서 쓰기 힘들면 긁어다 입력하자. 다시한번 말하지만 \ 는 역슬러시다.

필수 패키지 설치가 끝났다.
이제 본격적으로 설치에 들어간다.


5. JDK 1.6 설치
첨부된 파일 중에 jdk-6-linux-i586.bin 이 있다.
이상한 사이비 사이트에서 받은것이 아닌, sun사 홈페이지에 직접 다운로드한 jdk 1.6 이므로 안심하고 설치하자. 뭐 못믿겠으면 직접 sun사 홈페이지가서 받아도 된다.

적당히 업로드하고 실행시켜서 설치해준다.
중요한건 설치할때 해당 경로에서 jdk1.6.0 이란 디렉토리를 만들면서 설치 된다.
그러니 반드시 내가 설치를 원하는곳으로 파일을 이동시켜서 설치하자
본인은 /usr/local 로 이동시켜서 아래 명령을 실행했다.
본인의 jdk 경로 (JAVA_HOME)은 /usr/local/jdk1.6.0 이 되겠다.

bash$> sh jdk-6-linux-i586.bin

요래요래 해주면 일단 jdk 가 설치 된다.
이제 각종 환경 변수들을 쌔려 줘야 한다.
글로벌하게 적용되야 하니 /etc/profile 맨 마지막에 적당히 추가해주자.

bash$> vi /etc/profile

JAVA_HOME=/usr/local/jdk1.6.0
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib
export PATH

여기서 JAVA_HOME, CLASSPATH 를 자신이 JDK를 설치한 경로로 적어줘야한다.
먼말인지 모르겠다면 앞으로 이 가이드를 따라올 수 없는것이니 일찌감치 포기하자.

추가해 줬으면 이제 putty 를 종료하고 다시 서버로 접속한다.
그래야만 위 환경변수가 적용된다.



5. Resin 3.1 설치
이제 레진을 설치해보자.
레진 또한 첨부 파일에 보면 resin-3.1.0.tar.gz 파일이 있다.
참고로 레진이랑 톰캣은 소스가 아니라 바이너리다.
즉, 압축만 풀면 바로 쓸 수 있는것이다.
하지만 약간의 설정이 필요하니 잘 따라오도록 하자.
본인은 /usr/local/etc 로 resin-3.1.0.tar.gz 파일을 이동시키고 압축을 풀었다.

bash$> tar xvzf resin-3.1.0.tar.gz

뭐 압축풀면 끝이다.
하지만 아파치와의 연동을 위해 환경설정과 컴파일을 한번 때려줘야 한다.
레진 디렉토리로 이동 후..

bash$> cd resin-3.1.0
bash$> ./configure --with-apache=/usr/include/httpd

요로코롬 해준다.
이게 뭐냐면 레진이 아파치랑 연동하기 위해 아파치 라이브러리를 참조하기 때문이다.
완료가 되면 아래 명령을 바로 때려주자.

bash$> make all
bash$> make install


요래 해주면 caucho_module.so 동적 라이브러리 모듈이 생성되고 자동으로 httpd.conf 에 넣어준다. 레진이 이래서 조낸 좋은거다.

이제 httpd.conf 파일을 열어서 추가가 됐는지 확인해보자

bash$> vi /etc/httpd/conf/httpd.conf

파일 맨 마지막에

LoadModule caucho_module /usr/lib/httpd/modules/mod_caucho.so
ResinConfigServer localhost 6802
CauchoConfigCacheDirectory /tmp
CauchoStatus yes

요렇게 추가가 된게 보일것이다.
하지만 바로 지워준다.

왜? 아래 따로 include 해서 쓸것이기 때문이다.
싫으면 걍쓰도록한다. 하지만 나중에 다른 버철호스트에도 레진이 영향을 받아 웹페이지가 안열리는 현상이 발생할 수도 있다.
그러니 왠만하면 본 가이드를 그대로 따라하자
본인은 다 나중에 편하고, 좋자고 하는것이지 막 각종 편법들을 남발해가면서 일단 설치만 되면 땡이지 하는건 딱 질색이기 때문이다.

이걸로 바로 사용할 수 있지만.. 간단하게 버철호스트랑 레진의 호스트와 차후 톰캣 설치 시 mod_jk 와 손쉽게 바꿔가며 사용할 수 있게 하기 위해 별도의 conf 파일로 만들어 준다.
아래처럼 따라해보자.

bash$> cd /etc/httpd
bash$> mkdir conf.custom
bash$> vi resin.conf


따로 include 해서 레진과 톰캣을 손쉽게 바꿔가면 쓰기 위한것이다.
vi resin.conf 한다음 아까 위에 지웠던 내용을 입력해준다. (-_-) (방금 욕하는 소리가 들렸다.)

LoadModule caucho_module /usr/lib/httpd/modules/mod_caucho.so
ResinConfigServer localhost 6802
CauchoConfigCacheDirectory /tmp
CauchoStatus yes

요래 하고 저장해주자.
설마 저장하는 법을 모르는 사람이 있을까봐 알려준다.
vi 편집기 상태에서  :wq! 라고 입력하고 엔터치면 된다.

참고로 아래 버철호스트는 newal.net 의 예제 이다.
자신에게 맞게 적당히 수정해주는 센스가 필요하다.
newal.net 이 돌아가는 DocumentRoot 는 /home/newal/www 이다
이 디렉토리 안에 index 파일이 존재한다. (에이 보안상 안좋은데.. 그래도 다 알려준다.)

NameVirtualHost 222.237.78.65

<VirtualHost 222.237.78.65>
   ServerAdmin newal@newal.net
   DocumentRoot /home/newal/www
   ServerName newal.net
   ServerAlias www.newal.net
   DirectoryIndex index.jsp index.php index.html index.htm
   ErrorLog logs/error_newal.net
   CustomLog logs/access_newal.net common

  # 레진을 사용하기 위해..
   Include conf.custom/resin.conf

  # 테터툴즈 사용을 위해..
   <Directory /home/newal/www>
       Options FollowSymLinks
       AllowOverride FileInfo
   </Directory>
</VirtualHost>

자 Include conf.custom/resin.conf 보이지 않는거 바로 이 버철호스트에서만 레진을 쓰겠다는것이다.

다른 버철호스트에도 레진을 적용하고 싶으면 그냥 Include conf.custom/resin.conf 요 문구만 갔다 붙여넣기 해주면 된다. 조낸 좋지 않은가?

자 이제 레진의 호스트를 잡아줘야 한다.

bash$> cd /usr/local/etc/resin-3.1.0/conf
bash$> vi resin.conf


아래 부분을 추가해줘야하는데 어디다 하는지 모를것이다.
자세하게 알려주겠다.
대략 250번째 라인을 보면 Configuration for the web-tier/load-balancer 주석이 보인다.
뭐 약간 틀릴 수도 있으니 +- 20줄 내에서 잘 찾아보자.

이 주석 바로 위에 </cluster> 가 보일것이다.
</cluster> 위에다가 추가해주면 된다.
아래가 아니라 위에다 추가하는것이다. 잘보고 추가 하자.

    <host id="newal.net" root-directory=".">
      <web-app id="/" root-directory="/home/newal/www"/>
      <web-app id="/resin-admin" root-directory="${resin.home}/php/admin">
        <prologue>
          <resin:set var="resin_admin_password"  default=""/>
          <resin:set var="resin_admin_localhost" default="true"/>
        </prologue>
      </web-app>
    </host>

잘 보면 root-directory 가 아파치에서 적은 DocumentRoot 와 일치하는것을 볼 수 있다.
당연하지만 레진이 도메인이 newal.net 일때 /home/newal/www/index.jsp 파일을 읽을 것이다.

자 이제 끝났다.
레진을 시작시켜 보자.

bash$> cd /usr/local/etc/resin-3.1.0/bin
bash$> sh httpd.sh start


요래 해주면 레진이 시작 된다. 뭐 한줄 나오고 끝이다.
이제 바로 아파치를 재시작 해준다.

bash$> /etc/init.d/httpd restart


이제 /home/newal/www 디렉토리에 index.php 파일을 만들고 파일 내용은 아래처럼 한다.

<?
phpinfo();
?>

또하나 index.jsp 파일을 만들고 내용은 아래처럼 한다.

<%
out.println("Hello World");
%>


위와 같이 대충 만들어놓고 브라우저에서 접근해보자

http://newal.net/index.php
http://newal.net/index.jsp

php정보가 나오고, Hello World 가 뜨면 성공한것이다.



더 쓰고 싶은데 귀찮아서 여기까지 쓰고 나머지는 다음에 쓰겠다..



출처 : http://newal.net/

2008년 1월 2일 수요일

We are the world - USA for Africa

FLV Player(wearetheworld.flv (16.76 MB))

라이오넬 리치]

There comes a time When we heed a certain call
우리가 어떤 부름을 새겨 듣을 때가 왔어요

[라이오넬 리치&스티비 원더]

When the world must come together as one
이제 이 모든 세계가 하나로 합해져야 할 때가 온거예요

[스티비원더]
There are people dying 많은 사람들이 죽어가고 있어요

[폴 사이먼]

And it"s time to lend ahand to life 지금이 바로 구원의 손길을 건네줄 때에요

[폴 사이먼&케니 로저스]

The greatest gift of all 모두에게 가장 위대한 선물을 말이죠

[케니 로저스]

We can"t go on pretending day by day
우린 매일같이 더 이상 위선의 모습만 보일 수는 없어요

[제임스 잉그램]

That someone,somewhere will soonmake a change
누군가가,어딘가에서 머지 않아 변화가 일어날겁니다

[티나 터너]

We are all part of god"s great big family
우리 모두는 한결같이 신의 거대한 가족의 일원이랍니다

[빌리 조엘]

And the truth,you know, love is all we need
여러분도 알다시피,우리 모두에게는 진실과 사랑이 필요한겁니다

[마이클 잭슨]

We are the world, we are the children
we are the ones who make a brighter day so let"s start giving
우리 모두는 하나(한 가족)입니다 우리 모두는 똑같은(신의)한 자손들입니다
우리 모두는 더 밝은 미래를 만들 역군들인겁니다
그러니 이제 나누어주기 시작합시다

[다이아나 로스]

There"s a choice we"re making we"re saving our own lives
우린 지금 선택의 기로에 놓여 있습니다 우린 우리 자신의 생명을 구하고 있는겁니다

[마이클&다이아나 로스]
It"s true we"ll make a better day just you and me
바로 당신과 나 우리가 진정으로 더 나은 미래를 만들겁니다

[디온 워윅]

Send them your heart so they"ll know that someone cares
그들에게 당신의 마음을 보내 주세요
그럼 그들은 누군가에게 자신들을 보살피고 있다는 사실을 알 게 될겁니다

[디온 워윅&윌리 넬슨]

And their lives will be stronger and free
그리고 그들의 생명은 더 강해지고 자유로와질거구요

[읠리 넬슨]

As God has shown us by turning stones to bread
신은 우리에게 돌을 빵으로 바꾸는 가능성을 보여주고 있습니다

[알 제로우]

So we all must lend a helping hand
그러니 우리 모두는 도움의 손길을 내밀어줘야합니다

[브루스 스프링스틴]

We are the world, we are the children
우리 모두는 하나예요 우리 모두는 한 자손입니다

[밥 딜런]
We are the ones who make a brighter day so let"s start giving
우리 모두는 더 밝은 미래를 만들 역군들인겁니다 그러니 이제 나누어주기 시작합시다

[시카고]

There"s a choice we"re making
we"re saving our own lives
it"s true we"ll make a better day just you and me
우린 지금 선택의 기로에 놓여 있습니다
우린 우리 자신의 생명을 구하고 있는겁니다
바로 당신과 나 우리가 진정으로 더 나은 미래를 만들겁니다

[마이클 잭슨]

When you"re down and out, there seems no h­ope at all
당신이 빈털털이가 되어 쓰러져 있을 땐 전혀 아무런 희망도 없는 것처럼 보이지요

[루이 휴이스]

But if you just believe there"s no way we can fall
하지만 우린 결코 쓰러질 수 없다는 진실을 믿어주기만 한다면

[신디 로퍼]

Well,well,well,well let us realize that a change can only come
그래요,그렇다면 분명히 어떤 변화가 꼭 올 수 있을거라는 사실을 우리 같이 실감해보자구요

[킴 칸스]

When we stand together as one
바로 우리가 하나되어 함께 서있을때 말이죠

**[모두 함께]
We are the world we are the children
we are the ones who make a brighter day so let"s start giving
there"s a choice we"re making we"re saving our own lives
it"s true we"ll make a better day just you and me
우리 모두는 하나예요 우리 모두는 한 자손입니다
우리 모두는 더 밝은 미래를 만들 역군들인겁니다
그러니 이데 나누어주기 시작합시다 우린 지금 선택의 기로에 놓여 있습니다
우린 우리 자신의 생명을 구하고 있는겁니다
바로 당신과 나 우린 진정으로 더 나은 미래를 만들겁니다

2008년 1월 1일 화요일

남아당자강(사나이는 자고로 강해야 한다.)

FLV Player(c_Clip_황비홍1.黃飛鴻.(이연걸).1991.AC3.5.1Ch.CD1[(009748)12-05-42].flv (8.36 MB))

남아당자강