목요일, 10월 29, 2009

몇일 전에 드려 인텔 80G SSD를 구매했습니다. 그리고 X200T타블렛도요.
타블렛도 확장할수가 없을 정도로 확장되어 있는 아이구요.
액보와 키보드보호까지 되어 있는 상태이고, 배터리도 4셀 8셀 둘다 있습니다.
램도 4기가 이지요. 지금으로서는 궁극의 머신이라고 생각하고 싶습니다.

그러나, 희성이가 타블렛 펜촉을 빼버리고 손으로 놋북을 몇번 쳐서인지 상태가 좋지는 못하지만...
몇년은 걱정없이 쓸수 있을듯 합니다.

회사에서 사용하고있는 데탑정도의 성능을 보이는 듯합니다. SSD를 달아줫더니 그런 느낌이 듭니다.


아아.. 이제보니 요새 jface TableViewer로 무언가 할 것이 있어서 하고 있는 데요. 감탄사 나옵니다.
멋 진넘의 자식들입니다. 감마형 짱입니다.

일요일, 10월 25, 2009

지난 주는 희성이 돌 이었습니다.

지금 살고 있는 곳에 이사온지 5년(?) 째 인듯합니다. 그래서 인지 동네에 친하게 지내는 가족들이 몇몇 분 되십니다.

희성이 돌이라고, 옷이나 돈 선물이나 챙겨 주시는 것들때문에 행복 합니다. 그분들의 관심과 환대에 흐뭇 합니다. 사실 몇몇가정은 사는 형편이 그리 현실적이지 못합니다.

편모가정과, 나이가 아주 많으신 은퇴하신 목사님 가정과, 아저씨가 쓰러지시고 한 아이는 지체아인 가정 등, 딱히 고정 적인 수입이 없는 분들도 계십니다.

근데요, 희안하게 그분들은 평소에 항상 우리에게 무언가 싸들고 오십니다. 김치나 떡이나 과일이나... 받는 저희로는 많이 부담스럽네요. 어디를 봐도 우리집이 가장 부유(?) 한 것으로 느껴집니다.
희성이 대모 되는 집사님 가정은 어느 모로나 좋으시고요. 옆집에 사시는 은진이네 집도요.
은퇴하셔서 딱히 수입도 없으시고 힘드실텐데도 맛있는 김치를 주시는 사모님에게도 무언가 죄송할 따름이지요.

그러게요. 우리가 할 수 있는 거라고, 수입이 좀더 있을때 돈 몇 만원 혹은 죄송한 마음 조금이 다 일텐데요. 넘치게 주시는 그분들에게는...

멀리있는 가족보다 가까이 사시는 그분들이 오히려 더 친근하고 가까울지도 모르겠습니다.

목요일, 10월 22, 2009

JSON-lib의 '\' 문제

JSON-Lib를 사용하여 json을 java object로 변환하여 잘 사용하고 있습니다.

특수문자 '\'를 설정한 부분은 ' '으로 java object에 설정되어 있습니다.
좀 당황스럽기도 합니다. 소스를 분석해보다가 중간에.. 내가 왜 분석하고 있을까... 라며 관두고..

오늘도 쉬운 방법을 선택했습니다.
미리 '\'를 검색하여 '/'로 바꾸어주었습니다.

jsonContent = StringUtils.replace(jsonContent, "\\", "/");

ㅠㅠ

금요일, 10월 16, 2009

역시나 개발자의 제1의 덕목은 사람됨 입니다.
좋은 분석, 설계, 개발, 테스트 이것도 중요하겟으나.. 말입니다.
이런 일을 하는 사람이겠습니다.
능력이 좀 떨어져도 사람됨이 되었고 노력했다면 좋다고 봅니다. 누군가 자신이 최고라고 말한다면, 하늘의 하늘이 있으니 장난하지 마시라.

이미 화두가 된 '애자일 방법론'의 핵심에대해 고민할때가 있습니다. 내가보는 제일 중요한 것은 '사람'인데, '방법'으로 초점을 맞추어보는 것들을 볼때 내가 잘 못알고있나도 싶네요. 무슨 방법으로 했더니 일이 더 잘되서 그 방법을 한다느니.. 이런 주재는 사실은... 책을 당장에 덮고 다른것을 고민해봐야합니다. 책에서 말하고 싶은것은 그것이 아닐것입니다.

7년전 직장 팀장님에게 몇달 몇년(?)에 한번 씩 툭툭 던지는데, 질문에 내가 고민하는것처럼 이야기 해주시고, 조언해주시는 분이야 말로 최고일거라 싶네요.
초딩 한탱이에게는 무엇보다 중요한 말일지라.
내년에 무엇을 어떡할지 고민을 끝낸 상태에서 이제는 즐기면 되겠습니다. 무언가 결정하니 마음이 가볍네요.
사람은 누구나 자기 자신 편에서 어떤 사물, 사건에 대해 생각하는건 당연합니다.
그래서 평양감사도 저 싫으면 그만 이라는 옛말이 있는가 봅니다.

그 것이 진실의 여부를 떠나서 말입니다.

어떤 사건에 자신을 좀더 객관화 시키는 것...
생각해 보니 그건 컴퓨터나 가능하다는 생각이 듭니다.

목요일, 10월 15, 2009

web.xml파일 삭제사건

고객 시스템 장애가 발생하여 담당엔지니어에게 전화가 왔습니다.
원격지원으로 들어가 보았는데..

로그중에 web.xml파일이 없다는 메시지가 보입니다.
누가 삭제했거나, 해킹이거나...

다른 파일은 다 있는데, web.xml파일만 안보입니다.
여러개 context가 있는데, 특정 context 하나만 그러네요.

이번이 두번째인데...

엔지니어에게 시스템 문제 발생하면 복사해 덮으라고 말해 주었는데 말이죠.
해킹이거나 누군가 장난 친건데 말이죠.

어떤 똥꼬냐?

일요일, 10월 11, 2009

Eclipse RCP를 RAP 프로젝트로 옮기기 혹은 호환성 유지하기

Eclipse RCP 프로젝트를 Eclipse RAP프로젝트로 옮기거나 두 프로젝트의 호환성을 유지하는 방법은 무엇일까요?

가장 쉬운 방법은 RAP로 개발해서 RCP로 옮기는 방법일수 있겠습니다.
하지만, 슬픈 현실이죠.

가능한 기능별로 프로젝트를 잘게 쪼개어야 겠습니다. 쪼개서 개발할수 있는 만큼 쪼개는 것이죠. 어디 하나를 없애버려도 돌아가도록 말입니다. 의존관계를 최소화 하는것을 말합니다. 이런면에서 이클립스는 최고의 포인트를 제공해주니 더 이상 말하면 입아프겠습니다.

이번에 큐브리드를 옮기면서 몇가지 아이디어가 있습니다.(맥주를 조금 먹고쓰는거라 정신이 없네요. 지금안쓰면 못쓸것 같아서 쓰는 것이기도 하니 양해를 구합니다)

우선 생각해보아야할것이 RCP가 앞이고 RAP가 뒤입니다. RAP는 RCP를 항상 따라가 가는 상황입니다. 그래서 문제가 있는 것들은 뒤로 미루죠. 어려운 것들도 뒤로 미룹니다. 기회가 되면 혹은 아이디어가 생기면 개발 되어서 나오게 됩니다. 1.2 Stable에서 org.eclipse.help를 지원하지 않았지만, 1.3 m2에서는 help를 지원합니다.

그래서 현재 RAP가 지원하지 않는 것은 주석으로 막아버릴 문제가 아닙니다. 나중에 구현되었을때라 던가 .. 이런 종합적인 계획이 필요한것이죠. 전체를 쫒아 다니면서 주석을 풀어(?)주어야 하는 사태가 발생합니다.

저는 RAP에서 구현되지 않느 클래스를 제가 새롭게 구현(?)하는 방법을 생각했습니다.



그리고 다른 프로젝트에는 Cubrad같은 경우 com.cubrad.cubradmanager.ui 프로젝트의 dependencies에는 다음과 같은 의존과계를 설정합니다.


기능이 없으니 동작을 안할것이고 적당한 의도에 맞게 여기서 주석과 구현을 실행하면 되겠습니다.

CubradManager를 1.3m2에 맞게 새롭게 구현하고 있으나 개인적으로는 너무 바쁘네요.
CubradManager 개발팀에서 조만간 바꿀계획도 있으신것 같기도하고요. Cubrad에서 의지가 있다면 조인해보던지 해야겠습니다.

작업했던 소스를 올리려다 쪽팔려서 ... 이기도 합니다.
주석 막은 곳에 적절한 코멘트를 하지 않고 돌아가게만 주석을 막아버린이유입니다.
음음음...

꿈나라로 가야겠습니다. 적고 싶은 내용은 많은데, 적는 다는것 자체가 시간을 엄청나게 소모하게 되고 그렇네요. ㅠㅠ

토요일, 10월 10, 2009

이번달 작업해야 할 내용3

"이번달 작업해야할 내용2" 이어서, 그럼 어떻게 어제의 대략적인 개념들을 구현으로 옮길것인지요.
전체 모양을 대강 정의 했다면 그 다음에 해야 할 작업은 무엇일까요?

만드려는 Agent를 좌우할 환경 파일을 정하는 것이라 생각 됩니다.


json으로 환경 파일을 정했습니다.
데이터를 주기적으로 검사할 것을 SEND_TYPE에 설정해 놓았습니다.
TYPE, MAKE_OUT_CLASS는 클래스를 지정하도록 하였습니다. 물런 정의된 클래스는 인터페이스를 구현해야합니다. 그러면 내부에서 정의된 클래스를 인스턴스화 시켜서 동작시키는 구조 입니다.

"TYPE" : "com.study.Agent.agent.capture.file.FileMonitoring"
는 파일을 모니터링하는데, "c:/temp/log0.txt,c:/temp/log2.txt",를 모니터링 하고, 모니터링하는 결과가 나온다면, 출력은 : "com.study.Agent.agent.capture.makedata.AgentFileGlobalMake" 애가 처리해 줄려고 합니다. 10초간격으로 이런것을 처리 한다는 것이죠.

영업이나 기술지원팀의 요구에 따라서 이런 아이들이 들어나도 메인이 되는 SENDER는 수정하지 않고 특화된 타입을 추가 하려고 합니다. 물런 받아주는 아이가 포함할수 있어야 하지만 말입니다.

받아주는 아이도 이런식의 개념을 사용하려고 합니다. RECEIVE_SERVER:TYPE에 따라서 보내는 것들을 유연함을 주려고 했습니다.

Agent_LOG에 LOG4J의 로그환경을 넣을 생각입니다.

환경은 이렇게 생각해 보았습니다.
이것의 장점은 유연함에 있겠습니다. 여차하면 더 추가하고 SENDER나,RECEIVER를 수정할수있습니다.
단점은 무엇을까요? 환경파일의 정의 자체가 단점일수 있겠습니다. 정의된 JSON을 벗어 날수가 없게 되겠습니다. 중간에 환경설정을 할수 있도록 구멍을 뚤어줄까 싶기도 합니다만, 그러다 보면 산으로 갈듯도 싶습니다. 위에서 적어서 고민하는 것이 이것의 단점입니다. 어디까지 정의할 것인지에따라 복잡도가 증가 합니다. 증가하면 설명하고 관리해야할 팩터가 많아지고, 산으로 갈 가능성도 있기 때문입니다.

PS) 환경설정 이름이나 클래스명이 좀 이상한데, 회사명이나 업무명을 가리기위해 일괄로 수정했습니다.
JSON은 http://json-lib.sourceforge.net/를 사용했습니다. 제가 원하는데로 JSON을 JAVA Object로 잘 변환 해주었습니다.

금요일, 10월 09, 2009

온라인 서점에가면 책 제목만 봐도 읽어버려야 할듯합니다. 호기심을 자극해서 사놓은 책들이 쌓여서 엇그제는 그 책들을 책장에 꼽아 놓았습니다.

그 호기심 책들을 구매하는 것을 참아야합니다.
아주 편하게 원서로 읽어주마... 이넘시끼들...

생각해보니 그런다고 다른걸 많이 하고있는것도 아니네요

이번달 작업해야 할 내용2

어제에 이어 오늘은 어제보다 좀더 구현에 가까운 개념입니다.
json의 환경설정에 의해 어떤애를 어떻게 보낼것인지 정의하고 싶었습니다.
그래서 중간에 매니저들을 두었습니다. 실제 데이터를 취합하는 애들은 데이터를 취합하겟지만, 애내들을 관리하는 매니저가 적절하게 시작하거나 종료해 줄것고요.
상위에 인터페이스와 abstrace클래스가 공통인터페이스와 공통작업은 처리해 줄것입니다.

또한 기존에 돌아가는 버전과 호환성은 맞추어야 하지요.

수요일, 10월 07, 2009

이번달 작업해야 할 내용



타블렛 기념으로

이클립스가 원인 모르고 죽었을때 가장 빠른복구방법

4시쯤에 컴퓨터 코드가 뽑혔습니다.
컴퓨터에는 vmware, eclipse등 모든 개발관련 툴들이 열심히 몬가를 하고 있을때였지요.

허허허, 당황스러운 웃음을..

이클립스를 시작했으나 멈춘상태로 더이상 동작하지 않습니다. '허허허'
급 당황하여 디버그모드니 콘솔모드니 생쑈(?)를 하여도 동작하지 않네요. '허허허'
로그를 봐도 남지않고 콘솔을 봐도 딱히 몬가 없는데 프로그래스바가 더 이상 진행하지 않네요.'허허허'
글적글적... 쏴양~

아~ 몇번 시도끝에 가장 쉬운 해결책으로 전환했습니다.
때마침, galileo-sr1이 나왔다고 핑계하면서, sr1을 다운받고 압축풀어서 실행했습니다.(다음 쌩유입니다.)

필요한 플러그인과 환경을 설정하고, 잘 돌아갑니다.약간 허무 하구요.
열정이 식어버린건지도모릅니다.

예전에는 죽자고 달려들어, 적어도 이 것은 이클립스의 버그 혹은 설계 잘못 등의 이유를 알아냈을 텐데요.

어디를 찾아봐야할지도 고민하지 않은채 답이 빨리나오는것으로 해결하다니요.
허덥한거지요.

건강한 육체에 건강한 정신이 나오는데 혹은 건강한 정신에 건강한 육체가 나오는데요.
너무 많이 고민하고 있으며, 너무 많이 배부른 상태 입니다.

헤드셋 바꿀때가 됏나봅니다

2002년도에 산 헤드셋이 요즘들어 돈달라는 소리를 냅니다.

Grado sr-80과 koss portapro 이넘을 사용했는데,아무래도 둘다 바꾸어 주어야할 때인가봅니다.

sr-80이 좋긴한데, 너무 크고 오래듣기가 불편합니다.
회사나 집에서도 같이 들었으면 좋겠는데, 회사에서는 portapro 집에서는 sr-80이라 듣는것이 틀려서
음악의 느낌이 틀려(?) 지기도 하구요.

돈을 조금 더 주더라도 하나를 사서 들고 다닐만한 것을 골라보아야 겠습니다.

집이 일하는 공간이라면 RS1이나 RS2를 질러보는것도 좋겠는데요. 회사에서 듣고있으면 별나라 사람이 되므로 어렵겠고, 결국은 이런 류의 소리를 원한다는 이어폰으로 가는 수 밖에 없을듯 합니다.

그나저나 오늘따라 포타프로의 소리가 좋으네요. ㅠㅠ

토요일, 10월 03, 2009

CubridManager를 Eclipse RAP로 바꾸기



오픈소스 프로젝트로 진행중인 Cubrid DB의 CubridManager(http://dev.naver.com/projects/cubrid-manager/forum)를 RAP로 수정해보려고 버르다 오늘 그러니까 음 오전 11시부터 시작했습니다.
지금 시간이 대략 오후 10시이고, 중간에 밥먹고 영화 한 두편쯤 보고 있는 시점에서 에러를 74개까지 줄여논 상태입니다.



지금은 더 해야할지(?) 약간의 의문이 들고, 이 정도면 수고는 했다고 나에게 위로 하고 싶습니다.
누군가 나처럼 고민을 할지도 모르니 작업의 진행을 설명 드리겠습니다.
아마도 RCP, RAP두개의 프로젝트 호환성을 위해서도 약간은 도움이 되실거구요.
Cubridmanager를 개발하시는 분들에게도 도움이 되실거니.

VMWare에 Windows 2003서버 위에 CubridServer를 인스톨했습니다.
작업은 Eclipse 3.5로 RCP로 된 CubridManager를 가져왔습니다. About만 빼고는 별 무리 없이 가져왔고, 동작 또한 잘 되었습니다. 그래서 Eclipse RAP도 3.5로 환경을 맞추 었습니다. 이것은 3.5로 RAP를 위해서 어쩔수 없는 선택이었는지도 모릅니다. 1.2.1 Service Release 버전으로 작업했습니다. 글을 쓰는 시점에서는 1.3 M2 Build 버전으로 왜 하지 않았을까 싶습니다. 1.3 M2 Build버전으로 시도해도 되겠다 싶습니다.

먼저 어떻게든 RAP환경에서 동작하도록 해보는것이 첫번째 미션이고, 두번째는 잘 동작하는것은 그 다음으로 하겠습니다.
com.cubrid.cubridmanager.app.rap 프로젝트를 생성하고 cuburidmanager를 시작할 메인을 준비했습니다.



대략 프로젝트 구성은 다음과 같더랬습니다
우선 Dependencies중에 org.eclipse.ui를 -> org.eclipse.rap.ui로 모두 수정했습니다.
com.cubrid.cubridmanager.core 프로젝트는 별무리 없이 가져와졌습니다.
com.cubrid.cubridmanager.help 프로젝트는 org.eclipse.rap.ui, core.runtime이외의 모든 의존관계를 삭제했습니다.
문제는 com.cubrid.cubridmanager.ui 프로젝트였습니다. 처음 띄우는 에러가 몇개만 표시되어 와~~ 행복 했습니다. 사실은 에러가 너무 많아서 다 표시하지 못해서 그렇더군요.

대부분은 에러는
1) import org.eclipse.ui.help.IWorkbenchHelpSystem;
2) org.eclipse.swt.widgets.DirectoryDialog.java
3) org.eclipse.swt.widgets.FileDialog.java
4) Font, FontData, Color, Image, GC
5) StyledText, TextViewer
에네들 때문에 나는 에러 였습니다.

그중 1번은 context help를 쓴 거의 모든 파일에 문제가 나타났습니다.
아참, 위의 사실은 손으로 삽질의 삽질을 하던중에 공통점을 뽑았구요.
1번은 cubridmanager소스 중에 공통된 에러가 나오면 주석으로 막는 프로그램을 만들어서 일괄로 삭제했습니다.(링크를 걸던지 소스를 첨부하지요)
그리고 2,3과 몇몇개는 더미 클래스를 만들었습니다. 물런 아무 동작하지 않겠지요.
휴~

이렇게까지 에러를 제거하니 에러 숫자가 무한히 줄었습니다.

가장 문제가 되는 것은 StyleText와 ,TextViewer를 사용하는 부분 이었습니다. 물런 dnd와 eventlistenr등도 되었지만...
그중 쿼리에디트 창인 QueryEditorPart 를 수정하는 문제가 남아있습니다.
다른 클래스와 복잡하게 연결되어서 손을 대고는 있으나 각종인터페이스와 없는 클래스를 짜집기하는것도 한계가 된 상태입니다. QueryEditorPart 이넘만 해결하면 돌아 갈(?) 듯 싶은데 말입니다.

지금은 QueryEditorPart 아이와 그 부하들의 벽에 같혀 있는 듯합니다.
당장에는 아이디어가 없네요. StyleText는 Text로 수정하여 사용하였고 대략 문제는 없을듯 합니다만, 다른 문제가 역시나 존재합니다. 또한 클래스 전체를 막아 버리자나 이 클래스가 거의 중앙에 끼워 있어서 에러가 완전 이구요. 이것을 대체할만한 이쁜 아이를 만들어 놔야하는데, CubridManager를 이렇게 하루 보는 것으로는 소스를 파악하기에는, 저의 코드를 파악하는 능력이 한계입니다.(물런 제가 CubridManager의 개발팀 이라면 두개의 프로젝트가 포괄할수있는 좀더 유연한 구조를 제안할것입니다만..)

좀더 분석한다면 이것을 RAP도 범용적으로 포괄하는 아이로 바꿔 줄수도 있을듯합니다.
포인트는 다른 클래스를 되도록이면 수정하지 않고도 바쿼주는 것입니다.

음, RAP가 쓸만하다는걸 나름 증명하고 싶었는데, 막상 아무 상관없는 CubridManager를 옮겨 보려니 여간 괴로운게 아닙니다.

RAP개발팀이 Eclipse를 RAP를 옮길때도 같은 방법(?)으로 하나씩 옮겨온 것으로 생각되는데, 이 작업이 얼마나 힘들었을지 상상하기도 싫어 져 버렸(?) 습니다. 좋아(?)하는 술(?) 한잔이 생각날 뿐입니다. 그들의 희생(?)과 뛰어남에 그저 존경을 표하고 싶을 뿐입니다.

약간의 알콜이 필요한데, 어디 부를넘도 없고 누구 말대로 왕따인건 확실한듯합니다.

위에서 언급했던 소스 주석 만드는 유틸입니다. 약간 문제가 있구요.
정교하게 사용할만한 그런게 아니라 일단 돌리고 사용했습니다.
apache의 commons-io-1.4.jar를 사용하였습니다.

코드일괄 주석만들기
public class ReplcaeSource {
static String sourceDir = "C:\\dev\\eclipse-galileo\\workspace-rap-cubrid\\com.cubrid.cubridmanager.ui\\src";

static String[] sourceText = { "import org.eclipse.ui.help",
"IWorkbenchHelpSystem whs", "whs.setHelp", "getHelpSystem()",
"CubridManagerHelpContextIDs" };

static String replaceText = "//";

public static void main(String[] args) {
ReplcaeSource replace = new ReplcaeSource();
replace.goChange(sourceDir);
}

public void goChange(String sourceDir) {
File f = new File(sourceDir);
String[] dirList = f.list();
if (dirList == null)
return;

for (String file : dirList) {
String fullyPath = sourceDir + File.separator + file;
System.out.println("check source is " + fullyPath);
File tmpFile = new File(fullyPath);

if (tmpFile.isFile()) {
// 마지막이 .java로 끝나는 애만 수정한다.
if (fullyPath.lastIndexOf(".java") >= 0)
fileChange(fullyPath);
} else if (tmpFile.isDirectory()) {
goChange(fullyPath);
}
}
}

private void fileChange(String file) {
System.out.println("\t #### " + file);
List writeList = new ArrayList();
boolean isModify = false;

LineIterator it = null;
try {

it = FileUtils.lineIterator(new File(file));
while (it.hasNext()) {
String line = it.nextLine();

for (String chkTxt : sourceText) {
if (line.indexOf(chkTxt) >= 0) {
line = "//" + line;

isModify = true;
}
}

writeList.add(line);
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
LineIterator.closeQuietly(it);
}

try {
// 모두 작업했으면 저장한다.
if (isModify) {
System.out.println("ChageText to " + file);
FileUtils.writeLines(new File(file), writeList);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}