Rath World » 2008 » June

Archive

Archive for June, 2008

처음부터 대작을 만들려고 하지 마세요

June 27th, 2008 7 comments

괴테는 그의 비서이자 작가지망생이었던 에커만에게 이런 말을 했다.

처음부터 대작을 쓰려고 하지 마세요. 그런 과욕 때문에 많은 시인들이 고민을 했고 나도 그랬습니다. 그러나 나는 곧 그래서는 안 되며 그럴 수도 없다는 것을 깨달았지요. 만일 내가 이 점을 조금만 빨리 깨달았다면 백 권의 책을 더 쓸 수 있었을 것 입니다.
현재에는 현재에 요구되는 것이 있습니다. 그런데 대작을 구상하고 있노라면 현재의 것이 솟아오르지 못합니다. 그럼으로써 시인의 마음속에 나날이 솟아오르는 사상과 감정은 통로를 잃고 막혀버려서 그의 하루하루는 삶의 즐거움을 잃게 됩니다.
세상은 넓고 풍부하며 인생은 다양합니다. 그러므로 시를 쓸 재료가 없어지는 법은 없습니다. 만일 지금 가능한 것만 생각한다면 시는 모든 기회에서 만들어집니다.
나는 휴른슈타인에게 직조공을 소재로 한 시를 쓰라고 권했는데 나는 그가 성공하리라고 확신하고 있습니다. 그는 그 분야를 잘 알고 있거든요. 그처럼, 아직은 손에 없는 미래에나 가능한 대작을 꿈꾸지 말고, 지금 쓸 수 있는 것을 자연스럽고 순수하고 정직하게 생생하게 써보도록 하십시오.

안상헌 씨의 책 자신감 140페이지에 인용된 글인데요.

저는 시인도 아니고 아티스트도 아닌, 필요하거나 재미있는 무엇을 만들기 좋아하는 프로그래머지만 저에게도 괴테의 저 말은 많은 힘이 됩니다. 무엇인가를 공부하려고 할 때, 프로젝트를 시작할 때, 잡다한 TODO를 처리할 때에도 도움이 되는 내용입니다.

GTD에서 Allen이 말하던 ‘물과 같은 마음’과도 통용됩니다.

Allen has found a way to achieve stress-free productivity, what he calls a “mind like water”, to use a karate analogy. You can do things without worrying about what else is being left undone.

마지막으로 자신감 p142, 인상깊은 구절을 하나 더 옮깁니다.

많은 사람들이 살아가면서 하고 싶은 것들이 많지만 언젠가는 그것을 할 자신감이 생기는 날이 올 것이고 그때는 시도하겠다는 결심을 하며 살아간다. 그냥 살다보면 두려움이 사라질 것처럼 생각하는 것이다. 하지만 두려움은 결코 사라지지 않고 지금처럼 우리를 지배해갈 것이다.

안상헌씨 책은 참 좋아요~

Categories: Life Tags:

iBATIS 접견

June 27th, 2008 5 comments

나는 언제까지 원시인 코딩을 계속 할 것인가.

나는 왜 아직도 extends HttpServlet 을 하여 웹프로그램을 만드는가.
나는 왜 아직도 vim 과 editplus 뿐인가.

spring, hibernate <- 이 두녀석은 요상하게 정이 안가서, 계속 쌩까고 있는 중이다.
내 입맛에 맞는 적절한 entry point 가 있어야 된다. 그게 아니면 그냥 ‘저거 뭐하러 써? 저거 없이도 다 되잖아..’ 하며 회피하기 일쑤.

그러다 Apache Wicket 에 관심이 가서 요리조리 공부중이다.
일단 이녀석은 내 마음에 든다!!!

난 GUI 프로그래밍 출신이 아니였던가. jdk 1.1로 MSJVM에서 awt 가지고 했던 수많은 삽질들..
어린 시절, 지금은 꾸리꾸리하기만한 Swing Metal LNF가 어찌나 맘에 들었는지.. applet 에서 swing을 쓸 수 있는 날이 오기만을 기다린 시절도 있었다.

swing 삽질은 JMSN 개발할 때 삽질 정도가 하늘을 찔렀고, 어느덧 swing 코딩은 내게 뇌없이 GUI를 만들 수 있게 해주는 그런 친숙한 녀석이 되었다. 마침 swing을 중급이상으로 다루는 사람이 거의 없는 대한민국에서는 노력대비 고수익 :$ 프리랜서 프로젝트 거리가 많이도 들어왔었다.

그런데!!! Wicket 코드를 보면 swing 스타일이다 :$ 이게 무슨 얘긴고하니, 첫인상이 좋다는 이야기다.
wicket 문서들을 계속 읽다보니 어느덧 이 웹프레임워크에 매력을 느끼게 되었고, 둘러둘러 보다보니.. wicket 에는 db 코딩 쉽게 해주는? 그런 녀석이 없었다. 그래 기왕 딴놈들이 만든 프레임웍 쓸꺼면 풀세트로 써야하지 않겠나.

Wicket 에서 Spring을 통해 iBATIS를 사용하는 방법을 보다가.. 정말 뜬금없이 iBATIS에 꽂힌 것이다. Hibernate을 선택하지 않은 이유는 iBATIS는 ORM이 아니라서.. 더하기 iBATIS는 code generator인 Abator(지금은 iBATOR로 이름이 바뀌었다)를 제공해줘서 그랬다.

그런 연유로 -_- iBATIS를 공부하게됐다.

iBATIS 사이트의 60페이지짜리 pdf 문서와 iBATIS in action을 읽은 후, iBATIS 훈련을 위해 적용해볼만한 서비스를 고려해보다가. 귓속말이 당첨됐다.

그리하여-

귓속말에 iBATIS를 적용했다. 기존 날코딩 되어있던 SQL을 SqlMap.xml 파일에 빼는 것도 일이지만, #melong:VARCHAR# 같은 거 익히고 include refid로 sql들 잘근잘근 쪼개놓기도 하고 # 열고 # 안닫았다가 NoSuchElementException 나서 완전 당황하기도 하고 -_-; 자꾸 <select> 에서 resultClass 빼먹어서 삽질하질 않나 -.-;;

여튼 80여개의 쿼리가 50여개로 줄었으며, java 소스코드는 정말 화악- 줄어들었다.
이정도의 효과를 보여주면서.. 이렇게 배우기 쉽고 적용하기도 편한 framework 이 있을까 +_+

마지막으로 귓속말에 iBATIS를 적용하기 시작한 지난 새벽 2시부터 마이그레이션 및 테스트를 마친 오후 2시까지 사투의 흔적 -_-

OpenID-Whisper Error mails

Wicket 공부 및 귓속말에 적용하기가 끝나면 그 다음엔 Hibernate과 함께 ORM 고고싱~

Categories: Development Tags:

commons-daemon jsvc 개선

June 20th, 2008 4 comments

첫 회사를 다닐때부터.. 리눅스에서 Java 프로세스 띄울 때 setproctitle 도 먹게 하고 싶기도하고
/etc/init.d/named start|stop 처럼 Java 로 만들어진 데몬들을 제어하고 싶었다.

예전 xrath.com 서버에서 invoker 란 이름으로 자그마한 개인프로젝트를 했었는데, 이녀석은 JNI로 CreateJavaVm 을 실행하고 요짓죠짓을 하는 녀석으로 윈도우면 서비스에 등록하고 start/stop 시그널을 받게 하는 거였고 (한창 resin 2.0 시절에 -install 옵션을 주면 설치되는 멋진 모습도 기억이!) 리눅스면 sigint sigterm sighup 같은 것을 처리하..지는 못하고 그저 jvm 을 실행해주는 native executable을 빌드해주는 정도였다.

이 프로젝트의 가장 큰 문제점은 native executable로 만들 프로그램이 돌 시스템에 컴파일 환경이 구축되어있어야 한다는 것이였다. 필요한 클래스패스나 JVM 옵션들을 설정파일로 빼두긴 했지만 c 코딩이 똑바로 안되던 시절이였기 때문에 필요한 프로젝트 프로퍼티들을 c 코드 템플릿 내에 쳐박고 cl.exe 나 gcc 로 고고싱하는 지금 생각해보면 참 무서운 ;; 녀석이다.

하지만 윈도우즈 서비스 목록에서 Java Launcher <- 라고 나오면 참 자존심 상하지 않겠는가!
Super Fantastic Chatting Server <- 이렇게 등록하고 싶단 말이였다;;

암튼 서론은 끝

미루고 미루다 본 apache jakarta commons daemon 의 jsvc

나름 괜찮은 feature들을 가지고 있지만, 아쉬운 점들이 꽤나 있다.
jsvc의 아쉬운 부분들을 어느 분이 친절히 설명해준 페이지도 있다. 요약하자면,

  • jsvc 를 실행시킬 때, 절대 혹은 상대경로로 지정하는 것만 가능하다. PATH에만 있으면 안된다! 예를 들어 jsvc가 /usr/local/bin 에 있고 현재 디렉토리는 /home/rath/work/xxx 라면 jsvc 가 동작하지 않는다.
  • – jsvc 를 실행하려면 root 권한이 필요하다 -_-
  • – 옵션 -errfile 을 지정하지 않으면 모든 에러메시지들이 /dev/null로 날아가버린다 (이건 뭐.. 지정하면 되지 까탈스럽기는)

하지만 jsvc는 자바 프로그래머에게 sighup 과 sigterm을 처리할 수 있게 해준다!!
그래서 jsvc native c 코드를 좀 건드려서 해결했다.

첫번째 문제는 실행시킨 프로세스를 detach 하는 용도로 execve를 쓰고 있어서 생기는 문제인데 execve의 첫번째 파라미터가 pathname이다. filename이 아니라는 점. 그러니 터미널에서 PATH 에 잡아놨다고 좋아라~ 하고 jsvc -cp xxx test 하면 execve 에서 에러 -_-.
environ을 넘기려고 ve을 쓴 거 같은데, 유연성보다는 편리성을 택하기로 하고 execvp 로 교체하여 해결.

두번째 문제는 비교적 간단히 해결했다. jsvc 실행옵션 중 -user 가 있는데 문제가 -user 값이 넘어오지 않았을 때도 set_cap 을 쓴다. 그저.. user value 가 NULL 일 때는 set_cap 질하는 펑션 모두를 호출하지 않도록 바꿔버렸다.

세번째 문제는.. 사실 별 문제도 아니라고 생각하는데, -outfile -errfile -pidfile 옵션을 주지 않았을 때 디폴트로 현재디렉토리에 stdout.txt stderr.txt pid 란 이름으로 파일을 생성하도록 바꿨다.

마지막으로 jsvc 문서나 jsvc -help 에는 나와있지 않은, setproctitle!

리눅스에서만 쓸 거라면 기냥 argv[0] 건드리면 될텐데 왜 proctitle 고치는 게 없을까? 해서 소스코드를 살펴보니 -proctitle 옵션이 있다! 그런데 무슨 이유인지 옵션처리 if else 에서 골키퍼 else 부분 밑에 코딩되어있다. 뭔가 문제가 있어서 막아두었나 보다. 아무튼 가볍게 copy and paste 하여 활성화했다.

그런데 proctitle에 약간 문제가 있다. 보통 jsvc로 실행하려면

jsvc -cp commons-daemon.jar:my.jar -pidfile my.pid -proctitle MyRomanticDaemon com.xrath.romantic.Launcher

라고 입력하는데 -proctitle 옵션에 MyRomanticDaemon 이라고 입력해봐야 ps 에는

MyRomanticDaemon -cp commons-daemon.jar:my.jar -pidfile my.pid -proctitle MyRomanticDaemon com.xrath.romantic.Launcher

이렇게 나온다는 것 -_-
안이쁘잖아요 ToT

단순히 argv[1] = NULL 이 안먹히는 걸 보니 Unix C는 어려워 어려워 :'(
이 문제가 해결되면 jsvc-src/native/jsvc-unix.c 랑 jsvc-src/native/arguments.c 의 패치파일을 공개할 생각인데, 아직 argv[1] 이하가 안지워져서.. 부끄러워서 공개는 못하고 있다.

욕심같아서는 commons-daemon 자바 인터페이스에 setProcTitle 메서드가 있어서 현재 데몬 상태(proctitle)를 동적으로 바꿔서 sendmail처럼 ps 에서 확인할 수 있게 하는 것인데 JNI 브리지 새로 만들어야하니 천-천-히 해볼 생각.

Categories: Development Tags: