Linux x86-32 bit http://www.oracle.com/technology/tech/oci/instantclient/index.html
http://www.ubuntuforums.org/showthread.php?t=189381&highlight=tora
http://www.benpinter.net/article.php?story=20051208034638928

sh: dpkg-source: command not found
압축 풀기 명령 'dpkg-source -x tora_1.3.18-4ubuntu1.dsc' 실패.
Check if the 'dpkg-dev' package is installed.

apt-get source tora 전 dpkg-dev 설치

apt-get install build-essential
apt-get install flex zlib1g-dev docbook-xsl

xlibmesa-gl-dev / libglu1-xorg-dev
Posted by xHuro
,
이전 포스트(http://www.kid.pe.kr/tt/387)에서 간단히 ati에서의 XGL 설정법을 포스팅했었다.
어제 하루종일 XGL 세팅을 이전 포스트에 있는 참고 페이지를 보고 시도했으나, 이상하게도 계속 실패하였다.
저녁동안 계속 삽질하고 (새벽 3시까지 삽질했다. 젠장) 여기저기 알아본 결과.

compiz 0.0.13.57로 업데이트 되면서 더이상 gconf-editor의 plugins를 세팅하지 않는다는 것이다. gconf-editor에서 확인하면 알 수 있다.

더이상 존재하지 않는다. 설치 잘못했다고 울지마시라~


이전 포스트의 참고페이지에 있는 repository를 추가하고 업데이트를 하면 다음과 같이 synaptic에서 확인할 수 있다. 만일 compiz-manager가 설치되지 않았다면 설치하도록 하자. 이번 업데이트에서 XGL을 구동하기 위한 핵심이다.

전과 다르게 꽤나 많은 것들이 업데이트된다


참고 페이지에 있던 startcompiz 대신 compiz-manager를 세션의 시작 프로그램에 등록한다.

이 녀석이 삽질의 주원인이었다


다음은 ATi 그래픽 카드를 가진 나의 /usr/bin/startxgl.sh이다.
Xgl :1 -fullscreen -ac -accel glx:pbuffer -accel xv:pbuffer & sleep 2 && DISPLAY=:1

# Start GNOME
exec gnome-session

XGL을 설치하고, gnome 세션으로 들어가거나, XGL 세션으로 들어가면 tray에 조그마한 빨간 박스가 떠있을 것이다. 이것이compiz-manager다. 여기의 select Window Manager에서 Compiz를 선택하면 XGL을 사용할 수 있다.

아래는 compiz decorator를 설정할 수 있는 CGWD이다. 이전부터 존재했는지 모르겠지만, 꽤나 다양한 decorator들을 사용할 수 있다.

XGL을 위한 window decorator


간단히 설정할 수 있는 Compiz Setting Manager도 있다. 단축키도 설정할 수 있고, 몇몇 기능만 선택할 수도 있다. 자신의 컴퓨터와 그래픽 카드 성능이 좋다고 생각된다면 설정을 모두 켜놓고 해봐라. 엄청 화려한 UI를 구경할 수 있다. 단지 느려질 뿐....

XGL의 여러 설정을 할 수 있다


p.s XGL이 잘 구동되지 않으면 홈디렉토리의 .xsession-errors를 확인해보고, 구글 등 여러 사이트에서 그 해답을 찾는 것이 좋다. (나처럼 안된다고 지우고 다시 설치하는 멍청한 짓을 하지 않았으면 한다.)

p.s2 세팅을 기본으로 돌리려면 .compiz/csm_settings 파일을 지우고 다시 reload 하면 기본 설정으로 돌아간다.

p.s3 막간을 이용해 만든 스크린샷!
012
Posted by xHuro
,
일하는 도중 짬짬이 들리는 ubuntuforum.
최근에 방문했을 때 귀여운 배경화면이 있어서 당장 바꾸었다. 꽤 오래전 Gallery에 올라왔던데 (1년 전쯤) 잠깐 소개한다.

ubuntu-tan

바쁜 프로젝트 속에 이 배경을 보는 순간 다시 힘이 쏟구치는(?) 묘한 마력을 가진 배경화면이다. (난 모에-_-?)
OS-tan중 하나인듯한데, 원본 파일을 다운받으려면 요기로.
다른 OS-tan에 대해 알고 싶거든 요기로.

자 덤으로 한라산을 배경으로 듀얼모니터 샷~

Posted by xHuro
,
012

원래 노트북에 Ubuntu와 Window 설치되어 있었다. 저번 주말, Window가 요즘 통 느려져서 한번 포멧을 하고 재설치할 때 실수로 Linux 파티션까지 날려버리는 삽질을 해버렸다. 이왕 이래된 거 Kubuntu를 설치해보자 싶어서 일요일에 설치하고 오늘까지 세팅하여 겨우겨우 한글입력 및 여러가지 설정을 마쳤다.

Kubuntu에서 한글 설정은 KDE에서 SCIM 설정 정리 를 참고하면되는데, 주의할 사항은  /etc/X11/Xsession.d/ 75custom-inputmethods 이 부분은 건너뛰어야한다. (내 경우에는 이상하게 저 파일때문에 KDM 로그인 화면에서 넘어가질 않았다.) 대신 다음과 같이 scim-hangul 파일을 복사하고 X-Window를 재시작하면 한글을 잘 사용할 수 있다. (이 포스트도 Kubuntu의 파이어폭스에서 작성하고 있다.)
cp /etc/X11/xinit/xinput.d/scim-hangul ~/.xinput.d/default

덤으로 맑은고딕까지 설정해서 현재 아주 원활히(?) 한글 사용할 수 있다.

다음 도전꺼리는 How to Get Vista-ish Effects in (K)(X)Ubuntu이다. nVidia 그래픽카드 계열만 설명되어 있는데, ati 그래픽카드 계열은 조금 까탈스러워서 꽤나 삽질 예상 중이다. (회사 프로젝트 마감이 얼마남지 않았는데, 큰일이다. 안그래도 월요일 시사회 끝나고 간단히 소주 2병 술한잔하고 화요일에 죽쓰니... 프로젝트 마감까지 금주령까지 내려진 상태인데;;)
Posted by xHuro
,
드뎌~ Kubuntu CD가 도착했다. 여기저기 블로깅해봐도 Kubuntu CD를 신청한 사람은 없어보이던데 (굉장한 희소가치... 신청만 하면 다 주는데 ㅋ), 기분 좋게 주위 사람들에게 나눠주고 있다.
012
자켓에 ubuntu 특유의 사람들이 손잡고 다정하게 있는 모습이 Kubuntu에는 없었다. 조금 밋밋하다고나 할까나. 그리고 아쉽게도 Kubuntu 스티커는 없었다^^

포스트가 너무 허전해서 내 자리 뒤편도 함 찍어봤다.

사수가 감독하고 내가 만들고 있는 프로젝트

이걸 본 팀장님 왈
"여기에 흰색이 안보이면 프로젝트 끝나는 거지?"
Posted by xHuro
,
어제 황당한 경험을 했다. 썬더버드에 저장되어 있던 지난 6개월 간의 메일이 모조리 날라가버린 것이다.
그것도 오전까지 멀쩡하던 것이 점심먹고 와서 보니... 내가 설정해놓은 폴더에 메일이 하나도 없는 것이다.
이게 무슨 일인지? 하면서 썬더버드 커뮤니티를 기웃거려본 결과, 버그일 가능성이 높다라는 결론을 내렸다.
버그이냐 아니냐가 중요한 것이 아니라 과연 데이터가 살아있는가, 복구는 가능한가가 문제였다.

일단 윈도우용 썬더버드로 여러가지 테스트를 한 결과.
1. C:\Documents and Settings\Administrator\Application Data\Thunderbird\Profiles 에 기본설정으로 잡혀 메일이 저장된다.
2. 썬더버드는 Profiles 하위 디렉토리 중 Local Folders에 mbox 형식으로 이메일을 저장한다.
3. Local Folders 안에 확장자가 없는 파일들은 썬더버드의 편지함과 대응된다.
받은 편지함 -> Inbox
보낸 편지함 -> Sent
지운 편지함 -> Trash
임시 보관함 -> Drafts
보낼 편지함 -> Unsent message

4. Local Folders 안의 msf 확장자는 각 편지함에 대한 썬더버드의 index file로 추정된다.
5. 다른 메일 계정에서 mbox 파일을 가져와 Local Folder에 넣고 썬더버드를 재실행.
- 썬더버드 개인 폴더 하위에 mbox 폴더가 생성
- 썬더버드에서 mbox를 선택하면, Local Folder에 mbox.msf가 생성되면서 썬더버드에서 메일 내용확인 가능
6. 내 Inbox는 어떻게 해도 읽혀지지가 않음. 즉, Inbox 파일 자체가 깨졌다고 유추
7. 복구 불가능... OTL...

저넘 땜시 어제 오후 내내 연구, 삽질했다.

거기다가 POP3로 사용하니, 메일 서버에는 이미 내용은 지워졌고...(디폴트가 가져온 메일 삭제이다.)
누구를 탓하랴? 백업과 POP3, 썬더버드에 대해 부주의했던 내가 문제지.

오늘의 교훈.
POP3에 대해 잘 알고, 반드시 백업 생활화 하자.
Posted by xHuro
,
Ubuntu System 튜닝firefox에서 음악 듣기 관련 Threaed를 소개한다. (인터넷이 되니 주말에 집에서 이것저것 하느라 즐겁다?)

Improve performance in Ubuntu
5.10 breezy 버전의 Thread이다. 하지만 6.06에서 대부분 사용할 수 있는 내용들이다. 아직 Disable uneeded services from starting 항목밖에 해보지 않았고, 실질적으로 비교는 해보지 않았지만, 꽤 유용하게 쓸 수 있다.

Tutorial - How to Install ALL those Required Plugins in Mozilla Firefox
01

Ubuntu에서 사운드 카드를 잡았도 mp3를 플레이가 제대로 되질 않는다. 특히 웹브라우저에서의 음악듣기란 더 어렵다. 신기하게도 위의 Thread에서 mozilla-mplayer만 설치했는데도 제대로 음악이 나왔다. w32codecs는 다운로드 에러가 계속 떴다. 직접 접속해보니 해당 디렉토리가 사라지고 없어졌다^^;;
Posted by xHuro
,
오늘 저녁, 드디어 숙소에 인터넷을 설치했다. 그런 기념으로 예전에 설치해놓은 Ubuntu로 열심히 가지고 놀다 좋은 쓰레드를 발견했다.

여기저기 흩어져있던 Mac Theme를 모아서 집대성(?)한 Pack을 소개하고 있다. Boot Splash, Login, Splash Screen, Menubar, Themes, Cursor, WallPaper, Application Launcher(gdesklet)까지...
Pack을 다운받으려면 상당히 귀찮기 때문에 따로 링크를 걸었다. [Pack 다운로드]

파일 압축을 풀면, 여러 Theme들이 있는데, 각 디렉토리안의 install.txt 를 차근히 읽어보면서 설치하면된다. Ubuntu 시스템이나 Gnome에 익숙하지 않은 사람들은 설치하면서 시스템을 이해하는 데 조금이나마 도움이 된다^^

마지막으로 내가 설정한 Ubuntu Mac OS-X 스크린샷이다.

Mac OS-X 닮았는가?

Posted by xHuro
,
6월 7일에 신청했던 Ubuntu CD가 어제 도착했었다. 저번에 20장 신청하고도 남아서 이번엔 10장만 신청했었다. 이번 CD 자켓에는 5명으로 늘었는데, 여전히 우리나라 사람은 없다.... (당연한건가?)
300

ubuntu 6.06 CD 도착

  이번에는 Live CD와 install CD가 따로 있는 것이 아니라 한장에 포함되어 있다. 이미 데스크탑과 노트북에 설치가 되어 있기 때문에 따로 설치하지 않았다. 참, 그리고 ubuntu 로고가 박혀있는 스티커 3장도 우편물에 동봉되어 왔다. 한글 지원도 마음에 들고 (물론 한국 ubuntu 커뮤니티에서 열심히 뛰었던 탓이겠지만) 나처럼 데스크탑에 이클립스와 터미널만 잔뜩 띄워놓는 사람에게는 딱 좋다. (사운드 카드도 잘 잡히고, mp3 플레이어도 잘 나오니...)

01
덤으로 스크린샷 한방! 얼마전까지 배경화면이 ergo proxy 였는데, 저번주에 스즈미야 하루히의 우울을 전편 독파하고 매니아 아닌 매니아가 되어 배경화면으로 박았다. 가끔 작업하다가 스즈미야를 보면 힘이 난다는... (난 모에?)

6월 20일에 KUbuntu도 배송신청했는데, 2주 후에나 오겠네...
Posted by xHuro
,
생성 날짜로 보니 어제쯤에 4.1 SNAPSHOT이 release 된 거 같다. 라이브러리 저장소가기
요즘 메시지 큐를 프로젝트에 적용하고 있는데 며칠동안 삽질한 결과, 만족할만한 결과가 나오길래 포스팅해도 될꺼 같다는 판단하에 남겨놓는다.

● 개발환경
  - H/W : Dell insprion 6400
  - OS : Windows XP
  - Platform : JDK 1.5
  - IDE : Ecilpse 3.1 + WDT

● 사용라이브러리
- 꽤나 많다. 대부분 activeMQ 라이브러리 안에 포함되어있다. 포함되지 않은 것들만 소개한다.
- activeMQ 4.1 SNAPSHOT
- jakarta commons
  - net 1.4.1
  - collection 3.1
  - dbcp 1.2.1, pool .12 (DB 사용시에 필요^^)
- xercesImpl (XML 파서)
- geronimo : Geronimo 시작하기(activeMQ 내부적으로 사용되는 라이브러리기 때문에 굳이 읽을 필요는 없다)

● 참고문서
- 라이브러리 안에 간단한 예제를 보면 이해하기 쉽다.
  -  examples이라는 폴더 안에 있다.

● 선수지식
- AciveMQ 홈페이지 가서 최소한 JMS의 내용이라도 이해하고 있어야 쉽다.

● 구조
- example과 다른 것은 없지만, 약간 변경했다.

역시 이클립스다.


● 설명
- 어설프지만 개념은 요렇다! 자세한 건 AciveMQ 홈페이지에서...
- kr.pe.dada.main.ActiveMQSample.java : 다운로드
main 클래스. 먼저 Broker(Queue)를 생성한 다음, Consumer를 생성하고, Producer를 이용해서 5개의 메시지를 Broker에게 넘긴다. Thread.sleep이 사용된 이유는 각각 라이브러리를 로딩하는 데 시간이 걸리기 때문이다.

- kr.pe.dada.broker.ActiveMQBroker.java : 다운로드
지정된 xml 설정파일을 xbean 이용해서 읽는다. 굳이 xml 설정파일을 읽지않고 쓰려면 example의 예제처럼 BrokerService를 생성하고 하나하나 setter 메소드로 설정해주면 된다 :)

- kr.pe.dada.broker.ActiveMQProducer.java : 다운로드
Message를 보낼 목적지(Destination)을 설정하고, 현재 시간을 Message에 실어 Broker로 보낸다. (send 메소드) session 생성시에 유의할 점이 있는데, 나중에 간단히 설명하도록 하겠다.

- kr.pe.dada.broker.ActiveMQConsumer.java : 다운로드
Producer가 Broker에게 던지면, Broker가 다시 Consumer에게 Event(MessageListner를 통해서..)를 알린다. 역시 Producer와 동일하게 Destination을 정하고(같은 Destination을 사용해야한다.), Listner 2개를 등록한다.

- activemq.xml : 다운로드
Broker에 대한 전반적인 설정 xml. 내용이 많으니 Xml Configuration을 참고하자. 내가 만든 예제는 JDBC를 이용하여 Queue를 DB로 이용한 예제다. DB말고 메모리, 파일로도 사용가능하니 꼭 읽어봐야한다^^

● 포럼
- nabble

● 삽질기
  1. Ack 문제
- 버그인 듯한데...  Producer와 Consumer에서 session 생성시 다음과 같이 되어있다.
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
여러가지 장애처리를 염두해두느라, Producer와 Broker를 돌리고 있는 도중 Consumer를 죽여봤다. 즉, Message가 계속 Queue에 쌓이는 상태에서 Consumer를 따로 실행하면, 일단 Message를 잘 받는다. 하지만, 다시 죽이고 실행하면 이전의 Message를 또 받는 것이다. (dequeue가 제대로 되질 않는다. nabble 포럼에서는 AUTO_ACKNOWLEDGE의 버그일 꺼라 추측하고 있다. 자동으로 ACK을 날려주는 옵션인 듯한데, 자동으로 ACK을 날려주지 않는다!)

포럼에서는 여러가지 해결책을 제시하고 있는데, 나의 경우는 다음과 같이 처리했다. Consumer와 Producer 동일하게 처리한다.
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

그리고 Message를 주고 받을 때, 다음을 호출한다. Consumer에서는 OnMessage 메소드에서 Producer에서는 Send 메소드 호출후, acknowledge를 하면, 양쪽으로 ACK을 날림으로써 Message주고 받은 것을 알려준다.
message.acknowledge();

  2. mysql InnoDB engine 문제
- DB에 Table 생성시 에러가 발생
Table 'messagequeue.ACTIVEMQ_ACKS' doesn't exist

innoDB를 사용함으로써, PK의 데이터 사이즈(bytes)가 초과되어 발생하는 문제다. 아래 페이지를 참고해서 다음과 같이 처리한다. Unable to create ACTIVEMQ_ACK table
<persistenceadapter>
<journaledjdbc usejournal="false" journallogfiles="5" datadirectory="../activemq-data" datasource="#ds">
<statements>
<statements stringiddatatype="VARCHAR(128)" msgiddatatype="VARCHAR(128)" containernamedatatype="VARCHAR(128)">
</statements>
</statements></journaledjdbc>
Posted by xHuro
,
http://castor.codehaus.org/
http://www.geocities.com/sireenmalik/details.html
Posted by xHuro
,
http://users.utu.fi/ljtaim/ubuntuosx.php
http://www.ubuntuforums.org/showthread.php?t=31928&highlight=gdesklets
Posted by xHuro
,
전에 구입했던 노트북에 ubuntu를 설치했었다. 실컷 설치하고 나니 X-windows가 뜨지 않는 것이 아닌가.

부랴부랴 Ubuntu Forum에 가서 열심히 쓰레드를 찾아보았다.
HOWTO: Xgl/compiz ATI/Gnome guide (04/30/2006) (내 노트북의 그래픽카드가 Ati mobility x1300이다)
이왕 설치하는 거 xgl도 설치하자 싶어 이 쓰레드를 보고 그대로 따라했다^^

약간 주의할 점이 있다면, 원문 글에서는 sudo apt-get update후 sources.list를 편집하고 바로 필요한 라이브러리를 설치하는 데, 그러면 repository에서 못 찾는다고 에러를 내뱉는다.

다음과 같은 순서로 해결하자.
1.sudo apt-get update
2./etc/apt/sources.list
3.sudo apt-get update (다시한번 실행)

이후는 원문과 동일하다. 라이브러리 설치할 때 폰트에 따라서 l과 1이 헷갈릴 수도 있으니 잘 확인하고 타이핑하면 된다. 계속 1024x768의 해상도가 나올 것이다. 터미널에서 sudo dpkg-reconfigure xserver-xorg 명령을 내린 후 fglrx 그래픽 드라이버를 선택한 후 재부팅하면 1280x800의 해상도를 볼 수 있을 것이다.

예전에 xgl 데모를 직접해보는 재미가 있지만, 뭔가 아직도 불안정하다(원문에도 나와있지만, 기본 세션으로 쓰기에는 아직 부족한 듯^^)

Gnome with XGL



이제 무선랜도 잡아보자. 역시나 쓰레드를 열심히 뒤지니 나왔다. 중요한 건 유선랜은 잡혀있어야 한다는 것이다. (여러 잡다한 라이브러리들과 디바이스 드라이버를 많이 받아야하기 때문에)
intel pro wireless 3945 이 페이지 중간부분에 보면, wheelspin이란 사람이 만들어 놓은(?) script가 있다. 다운받아서 그대로 설치하면 된다. 설치도중에 에러가 나는 경우가 있는데, 이럴 경우에는 그 앞 페이지의 justhamade란 사람이 써놓은 순서대로 설치하면 된다.

또하나 디바이스 드라이버를 적재해도 eth1(Wireless Lan)이 안잡히는 경우가 있는 이때는 재부팅하여 CMOS 셋업에서 마지막 항목인 Wireless Hotkey를 off로 설정하고 리눅스 부팅하면 잘 잡힌다. (내가 10분정도 삽질했다)
Posted by xHuro
,
회사에서 XMLRPC를 사용할 부분이 생겨서 간단하게 테스트용으로 만들었다.
v3.0이 나온지 얼마되지 않고 v2.0과 다른 부분이 많기 때문에 삽질을 꽤나했었다. (아직 홈페이지에 가면 v2.0의 jar 파일을 다운로드 받을 수 있다) 이번 테스트는 웹 애플리케이션용으로 만들어졌다.

● 개발환경
  - H/W : Dell insprion 6400
  - OS : Windows XP
  - Web Server : Tomcat 5.0.28
  - Platform : JDK 1.5
  - IDE : Ecilpse 3.1 + WDT

● 사용 라이브러리
  - Apache XML-RPC
  - ws-commons-util-1.0-SNAPSHOT.jar

● 참고문서
  - http://ws.apache.org/xmlrpc/server.html
  - http://ws.apache.org/xmlrpc/client.html
  - http://www.petrovic.org/blog/?p=127 (상당히 많이 참고했다.)

● 선수지식
  - 웹 프로그래밍 (Servlet 프로그래밍)

● 구조

이클립스에서 캡쳐했다.


● 서버
  - Server.java : 다운로드
  소스 내용은 진짜 간단하다. XmlRpcServlet을 상속받는 것밖에 없다. 그 외에는 보통의 Servlet 클래스와 다른 면이 없다.

  - XmlHandler.java : 다운로드
클라이언트에 의해 호출될 Class다. add 메소드는 간단히 두 수를 넘겨받아 더한 후 그 값을 리턴하는 메소드다.

  - XmlRpcServlet.properties : 다운로드
위의 두 클래스를 연결해 주는 properties 파일이다. 단순히 Client가 호출할 이름과 XmlHandler.java만 쓰여져있다. 이것이 v2.0과 큰 차이점 중 하나인데, 이전 버전에서는 setHandler라는 메소드를 통해서 mapping되었다면, 이번 버전에서는 상위 클래스에서 자동적으로 이 파일을 읽어서 알아서 mapping해준다.
주의할 점은 org.apache.xmlrpc.webserver 안에 존재해야 한다는 것이다. (임의로 디렉토리를 만든 다음, 이 파일을 넣어주면 된다)

● 클라이언트
- Client.java : 다운로드
안에 보면 상당히 간단하다. 위의 참고 문서(apache에서의 Client 설명)를 보면 설명이 잘 되어있다. xmlServer를 설정한 후, 위의 properties에서 mapping한 이름의 메소드를 호출하면서 parameter를 넘겨준다. 그 후 XmlHandler에서 리턴하는 값을 출력하도록 되어있다.
Posted by xHuro
,
◆ 잡담
  사수의 휴가로 인해 할일없이 눈치만 보고 있다가, 사수가 휴가때 연락이 와서 해란다. 음... 드디어 삽질의 시작인가... 참고 도서는 jUnit in Action이고, 항상 그렇지만 이론보다는 예제 위주이다. (항상 그래왔다. 이론은 책이나 웹사이트를 부지런히 찾아다니면 얼마든지 많다. 뭐... 예제도 많이 있지만, 한번 해보고 이해하자는 나의 성격상 이론은 일단 해보고 익힌다.)

◆ 개발환경
  + CPU : Pentium 4 3.20GHz
  + RAM : 1GB
  + 운영체제 : Windows XP Service Pack2
  + 언어 : jdk 5 (Tiger)
  + IDE : Eclipse 3.1 (with WEB tool)
  + DB : mysql 4.1
  + WAS : tomcat 5.0.28

◆ 필요한 라이브러리
  + ant : http://ant.apache.org
  + dbunit : http://www.dbunit.org
  + cactus : http://jakarta.apache.org/cactus
  + commons-beanutils : http://jakarta.apache.org/commons/beanutils

◆ 실습
  + 이번에 참고한 책은 junit in Action 이다. ant, db 설치및 설정은 완료된 것으로 간주하며, 단순한 형태로 만들 것이다. 또한 java web application(servlet programming)에 대한 이해도 하고 있다고 간주한다.

  1. 먼저 tomcat의 server.xml에 DBCP를 하나 설정한다. DBCP 설정하는 이전 포스트를 참고해서 만들면 된다.

  2. 디렉토리 구조를 이클립스 프로젝트에서 다음 그림처럼 만들었다. (책의 디렉토리 구조와 거의 비슷하다.)
    + conf : 여러가지 설정 파일을 넣기 위한 디렉토리(여기서는 table 생성을 위한 sql 파일 하나만 들어간다.)
    + src/java : Jdbc로 DB에 연결할 DBCP 생성 및 Query 처리를 담당하기 위한 소스 디렉토리
    + src/test : dbunit과 cactus를 사용하여 unit test할 test 소스 디렉토리
      + data.xml : DB에 데이터를 insert할 data xml 파일
    + 나머지 디렉토리는 일반 Java Web application 구조와 동일하므로 생략한다.

  3. 예상외로 소스 코드는 간단하다.
DataAccessManager.java
package kr.pe.dada;

import java.util.Collection;

public interface DataAccessManager {
    Collection execute(String string) throws Exception;
}

JdbcDataAccessManager.java
package kr.pe.dada;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.commons.beanutils.RowSetDynaClass;

public class JdbcDataAccessManager implements DataAccessManager {
   private DataSource dataSource;

   public JdbcDataAccessManager() throws NamingException {
       this.dataSource = getDataSource();
   }

   protected DataSource getDataSource() throws NamingException {
       InitialContext context = new InitialContext();
       DataSource dataSource = (DataSource) context.lookup("java:comp/env/DefaultDS");

       return dataSource;
   }

   public Collection execute(String sql) throws Exception {
       ResultSet resultSet = null;
       Collection result = null;
       Connection connection = null;

       try {
           connection = getConnection();
           resultSet = connection.createStatement().executeQuery(sql);
          
           RowSetDynaClass rsdc = new RowSetDynaClass(resultSet);
           result = rsdc.getRows();
       } finally {
           if (resultSet != null) {
               resultSet.close();
           }

           if (connection != null) {
               connection.close();
           }
       }
       return result;
   }

   protected Connection getConnection() throws SQLException {
       return this.dataSource.getConnection();
   }
}
   * JdbcDataAccessManager는 Tomcat의 DBCP을 사용한다.
  - context.lookup("java:comp/env/DefaultDS") 부분 - 특별히 하는 일은 없고, Connection을 얻어오고, sql문을 실행하여 그 결과를 return하는 역할을 한다.

TestJdbcDataAccessManagerIC.java
package kr.pe.dada;

import java.util.Collection;
import java.util.Iterator;

import javax.naming.InitialContext;

import kr.pe.dada.JdbcDataAccessManager;

import org.apache.cactus.ServletTestCase;
import org.apache.commons.beanutils.DynaBean;
import org.dbunit.database.DatabaseDataSourceConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;

public class TestJdbcDataAccessManagerIC extends ServletTestCase {
   protected void setUp() throws Exception {
       IDatabaseConnection connection = new DatabaseDataSourceConnection(
               new InitialContext(), "java:comp/env/DefaultDS");

       IDataSet dataSet = new FlatXmlDataSet(this.getClass().getResource(
               "data.xml"));

       try {
           DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
       } finally {
           connection.close();
       }
   }

   public void testExecuteOk() throws Exception {
       JdbcDataAccessManager manager = new JdbcDataAccessManager();

       Collection result = manager.execute("SELECT * FROM CUSTOMER");
       Iterator beans = result.iterator();

       assertTrue(beans.hasNext());
       DynaBean bean1 = (DynaBean) beans.next();

       assertEquals("John", bean1.get("firstname"));
       assertEquals("Doe", bean1.get("lastname"));
       assertTrue(!beans.hasNext());
   }
}
   * Cactus의 Servlet
   data.xml
<dataset>
   <customer firstname="John" lastname="Doe">
   </customer>
</dataset>
Posted by xHuro
,
Posted by xHuro
,

이번 프로젝트를 진행하면서 사용한 프레임 워크를 나열해보았다.
조만간(언제일지 모르지만) 따로따로 분해를 해보는 포스트를 작성해야겠다.

View : Velocity-Tools &Struts-Tiles
Presentation : Struts
Business : Spring
Persistence : Ibatis

Cache : OS-cache
Logger : Log4j

Posted by xHuro
,
eclipse의 어떤 설정을 건드렸는데, 뭘 건드렸는지 몰라도 계속 access denied 예외가 떴었다.
4시간 동안 삽질하다가 그냥 프로젝트를 새로 만들고 Copy & Paste 하니까 잘 돌아간다.

tomcat의 DBCP를 사용하기 위해서는 총 3군데에서 수정하고, 코드에 한 부분을 추가해야 한다.

server.xml에서의 설정은 다음과 같다.(자세한 설명은 http://tomcat.apache.org/tomcat-5.5-doc/index.html 부분을 참고하도록 한다.)
<GlobalNamingResources>

...
<Resource name="jdbc/dada_db" auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="username" password="passwd" driverClassName="org.gjt.mm.mysql.Driver"
url="jdbc:mysql://localhost:3306/dada_db?autoReconnect=true"/>

</GlobalNamingResources>


eclipse에서 war를 만들지 않고 바로 톰캣에 올릴 때는 $CATALINA/conf/Catalina/localhost/xxxxx.xml 파일안을 다음과 같이 편집한다. (xxxxx는 context명으로 되어있다.)
<Context path="/test" reloadable="true" docBase="D:\test\test" workDir="D:\test\test\work" >
<ResourceLink name="jdbc/dada_db" global="jdbc/dada_db" auth="Container" type="javax.sql.DataSource"/>
</Context>


war를 만들었을 경우에는 server.xml 안의 Host 태그를 다음과 같이 편집하면 된다.
<Context path="/test" reloadable="true" docBase="D:\test\test" workDir="D:\test\test\work" >
<ResourceLink name="jdbc/dada_db" auth="Container" type="javax.sql.DataSource"/>
</Context>


두 개의 차이점은 global 속성에서 차이가 난다. 마지막 설정은 어플리케이션의 web.xml에서 편집한다.
마지막 부분에 다음을 추가해준다.
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/dada_db</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>


마지막으로 자바 소스 코드에서 Connection을 얻어올 때 다음과 같이 처리한다.
Context ctx = null;
DataSource dataSource = null;
Connection con = null;
try {
ctx = new InitialContext();
dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/dada_db");
con = dataSource.getConnection();
} catch (NamingException e) {
System.out.println("Naming : " + e.toString());
} catch (SQLException e) {
System.out.println("Connection : " + e.toString());
}
Posted by xHuro
,
http://jakarta.apache.org/velocity/tools/struts/

  • 기본 라이브러리를 WEB-INF/lib에 복사
    velocity-1.4.jar
    velocity-tools-1.2.jar
    velocity-tools-generic-1.2.jar
    velocity-tools-view-1.2.jar

  • web.xml에서의 velocity 설정부분
    <servlet>
    <servlet-name>velocity</servlet-name>
    <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
    <init-param>
    <param-name>org.apache.velocity.toolbox</param-name>
    <param-value>/WEB-INF/toolbox.xml</param-value>
    </init-param>
    <init-param>
    <param-name>org.apache.velocity.properties</param-name>
    <param-value>/WEB-INF/velocity.properties</param-value>
    </init-param>
    <load-on-startup>10</load-on-startup>
    </servlet>
    ...
    <servlet-mapping>
    <servlet-name>velocity</servlet-name>
    <url-pattern>*.vm</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
    <welcome-file>index.vm</welcome-file>
    </welcome-file-list>

  • Velocity Configuration (velocity.properties)
    velocimacro.library = /WEB-INF/VM_global_library.vm
    velocimacro.permissions.allow.inline = true
    velocimacro.permissions.allow.inline.to.replace.global = false
    velocimacro.permissions.allow.inline.local.scope = false
    velocimacro.context.localscope = false
    ※ 좀 더 많은 설정은 Velocity User's Guide 참고
  • Posted by xHuro
    ,
    Linux 프로그래밍할 때, qt 기반 위에서 항상 한글처리가 골치였다.
    즉, euc-kr과 utf-8 인코딩 방식의 차이때문에 한글이 깨지곤 했는데,
    오늘 1.0 클래식 업그레이드 하면서 다시금 언급된 euc-kr과 utf-8.

    그 인코딩 방식의 차이를 알아보고자 자료를 구해봤다.



    참고 페이지
    Kain님의 블로그 : 한글 코드와 유니코드
    뉴젠님의 블로그 : 유니코드의 UCS와 UTF
    Posted by xHuro
    ,