7월30일은 서울시교육감 선거가 있는 날이다.
중앙선거관리위원회(http://www.nec.go.kr:7070/edextern/index.html)
투표시간은 오전 6시부터 오후 8시까지 14시간동안 실시된다.
저는 기호 6번 주경복 후보를 지지합니다.
한금이를 아는 분은 6번 주경복 후보의 면면을 살펴봐주십시오.
(http://omentie.tistory.com/284?srchid=BR1http%3A%2F%2Fomentie.tistory.com%2F284)
아이들의 미래와 민족의 미래를 살피신다면, 우리가 들고있는 촛불이 옳다고 생각하신다면 더 고민해주십시오.
[성명]조선일보의 주경복 후보 공격, 좌시않겠다!
월요일, 7월 21, 2008
일요일, 7월 20, 2008
memory leak
저번주에서 만들고 있는 서버 모듈에서 memory leak이 나는걸 확인할 수 있었습니다.
오늘에 이르기까지 장장 10일 정도 이 문제로 고민하고 있는데, 이제야 해결의 실마리(?)를 찾은듯 합니다.
사실 단서는 발견한 초기에 진단툴을 통해 확인하였고, 경험상 해결의 결론도 알았습니다.
다만, 문제는 소스 전반을 모르고 있어서 실마리를 제대로 확인하지 못한것이 실수였습니다.
그 실수를 이후로 거의 일주일을 삽질을 해야 했습니다. 물런 그 일주일에 여러개의 다른일과 병행하여서 제대로 집중한것은 3-4일이지만...
우선 문제는 server모듈이 몇시간을 실행시켜두면 메모리를 조금씩 갈가 먹다가 죽는 경우가 생겨서 시작하게 되었고, 이것을 확인할때는 JProfiler 5, Oracle JRockit Mission Control 3.0.3로 확인하였습니다.
저의 시스템 환경은 대략 이렇습니다.
hsqldb(memory only), dbcp정도입니다.
우선 JRockit으로 떠본 클래스 Trace입니다.

위와같이 상황이 발생하고 close가 계속 증가했습니다. 자, 그럼 추측해 볼수있습니다.
어디서 close가 안돼는구나~ 좀더 범위를 좁혀 상상해 보자면, resultSet이 close가 안돼는 구나 이렇게요. jrocket이 지적해준 소스를 일일이 쫒아 다녀봣습니다. 그리고 본의아니게(?) hsqldb 소스를 뒤져보게 되었지요.
집에 가야겠어요. 2부는 ....
오늘에 이르기까지 장장 10일 정도 이 문제로 고민하고 있는데, 이제야 해결의 실마리(?)를 찾은듯 합니다.
사실 단서는 발견한 초기에 진단툴을 통해 확인하였고, 경험상 해결의 결론도 알았습니다.
다만, 문제는 소스 전반을 모르고 있어서 실마리를 제대로 확인하지 못한것이 실수였습니다.
그 실수를 이후로 거의 일주일을 삽질을 해야 했습니다. 물런 그 일주일에 여러개의 다른일과 병행하여서 제대로 집중한것은 3-4일이지만...
우선 문제는 server모듈이 몇시간을 실행시켜두면 메모리를 조금씩 갈가 먹다가 죽는 경우가 생겨서 시작하게 되었고, 이것을 확인할때는 JProfiler 5, Oracle JRockit Mission Control 3.0.3로 확인하였습니다.
저의 시스템 환경은 대략 이렇습니다.
hsqldb(memory only), dbcp정도입니다.
우선 JRockit으로 떠본 클래스 Trace입니다.

위와같이 상황이 발생하고 close가 계속 증가했습니다. 자, 그럼 추측해 볼수있습니다.
어디서 close가 안돼는구나~ 좀더 범위를 좁혀 상상해 보자면, resultSet이 close가 안돼는 구나 이렇게요. jrocket이 지적해준 소스를 일일이 쫒아 다녀봣습니다. 그리고 본의아니게(?) hsqldb 소스를 뒤져보게 되었지요.
집에 가야겠어요. 2부는 ....
목요일, 7월 17, 2008
오늘 연차를 내고 와이프 산부인과를 따라갔다.
일신조산원이라는 곳으로 와이프가 임신하고 난 후 가는 곳인데, 집에서 버스 -> 지하철 2호선 -> 5호선 -> 버스 이렇게 1시간30분을 가야하는 곳이다.
와이프가 첫 째를 출산할때 여자로서 너무 수치 스러웠단다.
그래서 가는 찾은 곳이고, 병원장(?)이신 선생님과 함께 도움을 주고 계신 선생님들의 면면이 다른 곳과 사뭇 틀리게 부드러웠다.
오늘은 와이프 출산할때 남편들이 어떻게 부인을 도울 것인지 교육한다기에 따라갔다.
산달이 되어서 부인들이 행동해야할 것들, 남편들이 도와야 할것들, 세상에 태어나는 아기들의 지혜(?)등을 알게 되었는데.. 여튼 신기하고도 신기하다는... 출산 비디오를 보면서 생명의 경이로움과 창조의 위대함을 느끼네요.
...
따라갔다 집에서 오면서 만삭이된 와이프보다 내가 훨씬 힘들게 느껴지니...
다녀 와서 2주째 미치도록 타고있는 인라인도 못 타러 가고.. 끙... 말만하고 못했던 가칭 bcel plug-in이나 진행해 봐야겠네요.
일신조산원이라는 곳으로 와이프가 임신하고 난 후 가는 곳인데, 집에서 버스 -> 지하철 2호선 -> 5호선 -> 버스 이렇게 1시간30분을 가야하는 곳이다.
와이프가 첫 째를 출산할때 여자로서 너무 수치 스러웠단다.
그래서 가는 찾은 곳이고, 병원장(?)이신 선생님과 함께 도움을 주고 계신 선생님들의 면면이 다른 곳과 사뭇 틀리게 부드러웠다.
오늘은 와이프 출산할때 남편들이 어떻게 부인을 도울 것인지 교육한다기에 따라갔다.
산달이 되어서 부인들이 행동해야할 것들, 남편들이 도와야 할것들, 세상에 태어나는 아기들의 지혜(?)등을 알게 되었는데.. 여튼 신기하고도 신기하다는... 출산 비디오를 보면서 생명의 경이로움과 창조의 위대함을 느끼네요.
...
따라갔다 집에서 오면서 만삭이된 와이프보다 내가 훨씬 힘들게 느껴지니...
다녀 와서 2주째 미치도록 타고있는 인라인도 못 타러 가고.. 끙... 말만하고 못했던 가칭 bcel plug-in이나 진행해 봐야겠네요.
수요일, 7월 16, 2008
Eclipse Io(?)
Eclipse Ganymede가 나온지 얼마 되지 않았지만, 다른 한편에서는 Eclipse Io(?)를 준비하는 사람들도 있네요.
빠르고 빠르기도 하지요? 위에 언급한 개발자는 어캐 사나 모르겟네요.
블로그 글에서도 체력을 말하는걸 보면, 슬슬 지치는듯 한데요.
일의 재미와 보람 혹은 그밖에 다른 어떤것과의 괴리일듯도 하네요.
빠르고 빠르기도 하지요? 위에 언급한 개발자는 어캐 사나 모르겟네요.
블로그 글에서도 체력을 말하는걸 보면, 슬슬 지치는듯 한데요.
일의 재미와 보람 혹은 그밖에 다른 어떤것과의 괴리일듯도 하네요.
월요일, 7월 14, 2008
행복한 삶
일주일 전부터 인라인 스케이트를 타고있습니다.
몸 전체가 아프다고 소리지릅니다.
안쓰던 근육들이 머리에게 무리했으니 좀 쉬어라고 이야기 하지요.
그래도 멈추고나 쉴수 없습니다.
인라인을 타니 오랫만에 몸에서 땀이라는게 나오네요.
땀흘리니 기분이 좋습니다.
생각합니다. 나는 무엇을 해야 즐거운 인생인건지.
부동산에 붙여진 2층 방3개전세 1억7천마넌 이라는 표맛 앞에 기가 잔뜩 죽습니다.
가정을 책임지는 가장 역할을 하면서 나의 인생 또한 즐겁게 살고싶습니다.
이런거 하면서 즐겁게 살수 있는 걸 이제부터 고민해 보렵니다.
생각해 보건데, 지금까지는 나 혼자 재밌는 삶을 살려고 노력했던듯 합니다.
몸 전체가 아프다고 소리지릅니다.
안쓰던 근육들이 머리에게 무리했으니 좀 쉬어라고 이야기 하지요.
그래도 멈추고나 쉴수 없습니다.
인라인을 타니 오랫만에 몸에서 땀이라는게 나오네요.
땀흘리니 기분이 좋습니다.
생각합니다. 나는 무엇을 해야 즐거운 인생인건지.
부동산에 붙여진 2층 방3개전세 1억7천마넌 이라는 표맛 앞에 기가 잔뜩 죽습니다.
가정을 책임지는 가장 역할을 하면서 나의 인생 또한 즐겁게 살고싶습니다.
이런거 하면서 즐겁게 살수 있는 걸 이제부터 고민해 보렵니다.
생각해 보건데, 지금까지는 나 혼자 재밌는 삶을 살려고 노력했던듯 합니다.
수요일, 7월 02, 2008
c군과 오프후기
어제 c군과 오랫만에 보았습니다.
예전에 기술서적 추천해 달래서 스티브맥코널의 'Professional 소프트웨어 개발' 책을 추천해주었 습다.
c군의 느낌은 왠지 자기가 읽으면 안되고 회사의 사장이 읽어야 할 것 같다고 이야기 합니다.
오호, 너무 잘 읽었다고, 동감한다고 박수쳐 주었습니다. 잘했어 c군.
사실 개발은 개발자가 코딩을 하게 되자만,
코딩이 잘 나오려면 그 프로젝트를 메니지하는 사람의 전체 플랜이 훨씬 중요하지요.
그래서, 그 책은 사장이 더 읽어야 할 책인듯 싶습니다.
피엠을 메니지하는 사람은 사장이므로.
개발자의 역할은 무엇일까요?
아마도 사장이, 피엠을 어떤 결정을 할때, 현재의 상황과 환경을 올바로 보고 결정할수 있또록 정보를 주는건 아닐까요? 좆선,쭝앙,똥아가 주는 정보를 읽는 대통령은 또한 안습인 것처럼요.
예전에 기술서적 추천해 달래서 스티브맥코널의 'Professional 소프트웨어 개발' 책을 추천해주었 습다.
c군의 느낌은 왠지 자기가 읽으면 안되고 회사의 사장이 읽어야 할 것 같다고 이야기 합니다.
오호, 너무 잘 읽었다고, 동감한다고 박수쳐 주었습니다. 잘했어 c군.
사실 개발은 개발자가 코딩을 하게 되자만,
코딩이 잘 나오려면 그 프로젝트를 메니지하는 사람의 전체 플랜이 훨씬 중요하지요.
그래서, 그 책은 사장이 더 읽어야 할 책인듯 싶습니다.
피엠을 메니지하는 사람은 사장이므로.
개발자의 역할은 무엇일까요?
아마도 사장이, 피엠을 어떤 결정을 할때, 현재의 상황과 환경을 올바로 보고 결정할수 있또록 정보를 주는건 아닐까요? 좆선,쭝앙,똥아가 주는 정보를 읽는 대통령은 또한 안습인 것처럼요.
토요일, 6월 28, 2008
나는 별볼일 없는 개발자이고, 아직은 개발이 재미있다.
내가 개발하는 것들을 소위 말하는 SI성 개발을 많이 해왓다.
제품개발, 사실 아직 변변한 제품 만들어 본적없고, 만들라고 하면 할 수나 있을런지 의문이다.
그렇지.. 변변한건 못 만들어 보았지만, 흉내는 여러번 내 보았다.
자, 제품이라는 걸 만들라 치면.. 보통은 내가 만들려고하는 그런것이 세상에 나와있는지 조사하게 되지요. 모 그런거지, BCEL outline plug-in을 요새 기획중인데, 사실 이넘의 의도는 ASM outline plug-in인 거고.... 자 좋다. 이런 저런 해서 몬가 만들어 질것을 결정했다고 치자.
그럼, 그 다음 몰 해야하는가?
그럼, 그 만들려고 하는것을 현재 상황에서 만들수 있는지 자신을 검사(?) 해야한다.
현재상황에서 한라산을 올라가고 싶은데, 제주도에 갈수 있는 방법이 없을수도 있으므로..
고로, 자신의 현재 상황에서 현실적으로 적당한지, 회사의 정치적, 경제적인 상황, 개발팀의 기술 수준 및 의지는 충분한지 봐야한다.
자 일단 이것도 만들려고하는것에 충분하다 치자.
그래서 여차 저차 산 건너고 물 건너서, 원하는 걸 베타버전 만들었다고 하자.
그래서 정식으로 베포했다고 합니다.
그 다음 행동이 회사의 개발 성숙도를 평가하는 좋은 방법인듯합니다.
이 제품을 어떻게 관리 할 것이지요. 이 제품이 이제 막 태어난 아기지요.
아기에게 모유수유를 할 것인지, 분유를 먹일것인 지요?
임신해서 태어나는 것 까지가 제품이 이제 출시 되었다라고 비유를 하고 싶네요.
태어난 아기가 자라서 대학교까지 가는 것까지 부모의 역할 이라고 한다면...
사실 20년은 부모의 관리가 필요한 것입니다. 임신해서 출산까지 10개월1년 이라고 생각해도 무려 20배의 넘는 배려가 필요한 법입니다.
자식이 있는 부모라면 어느정도 이해하실지 모르겠네요.
여튼 제품이 만들어 지고 나면, 그 제품을 어떻게 관리 할 것인지 고민해 보아야합니다.
제품 개발 한다고하는 몇몇 회사 몇몇 개발팀을 돌아다녀 보았지만, 사실 별거 없습니다.
si에 비해 별 특별하고 특별한게 없다고 말하고 싶습니다.
좀 특별하다면, 제품 만들면서 생기는 제품에 대한 지식이 특별하겠지요.
이것은 희소성의 원리 때문에 특별한거지요. 마치 금의 가격이 석탄의 가격보다 높은 것 처럼요.
사실, 일반 서민이 실제로 필요한 것은 금보다 석탄일 확률이 무지 하게 높습니다.
그리고, 대개의 경우 제품개발팀이 si개발팀보다 일반적인 소프트웨어 개발능력은 떨어지지 않을까 싶습니다. 좀 역설적이 겠습니다만, 저는 그렇게 생각 합니다.
몇몇 제품 개발한다고, 자기는 절대 si 안한다고 하시는 분들... 반성하세요. 김군아 반성해라.
... 하기야 김군 너의 상황을 조금 들은 나는 이해할만도 하겟다만...
아웅, 어제 잠을 좀 빨리 잣더디, 새벽4시에 일어났고..
오늘은 어머니 환갑이신데, 올만에 엄마 보러 집에가야겟네요.
못난 자식 키워주신 엄마에게로 ...
내가 개발하는 것들을 소위 말하는 SI성 개발을 많이 해왓다.
제품개발, 사실 아직 변변한 제품 만들어 본적없고, 만들라고 하면 할 수나 있을런지 의문이다.
그렇지.. 변변한건 못 만들어 보았지만, 흉내는 여러번 내 보았다.
자, 제품이라는 걸 만들라 치면.. 보통은 내가 만들려고하는 그런것이 세상에 나와있는지 조사하게 되지요. 모 그런거지, BCEL outline plug-in을 요새 기획중인데, 사실 이넘의 의도는 ASM outline plug-in인 거고.... 자 좋다. 이런 저런 해서 몬가 만들어 질것을 결정했다고 치자.
그럼, 그 다음 몰 해야하는가?
그럼, 그 만들려고 하는것을 현재 상황에서 만들수 있는지 자신을 검사(?) 해야한다.
현재상황에서 한라산을 올라가고 싶은데, 제주도에 갈수 있는 방법이 없을수도 있으므로..
고로, 자신의 현재 상황에서 현실적으로 적당한지, 회사의 정치적, 경제적인 상황, 개발팀의 기술 수준 및 의지는 충분한지 봐야한다.
자 일단 이것도 만들려고하는것에 충분하다 치자.
그래서 여차 저차 산 건너고 물 건너서, 원하는 걸 베타버전 만들었다고 하자.
그래서 정식으로 베포했다고 합니다.
그 다음 행동이 회사의 개발 성숙도를 평가하는 좋은 방법인듯합니다.
이 제품을 어떻게 관리 할 것이지요. 이 제품이 이제 막 태어난 아기지요.
아기에게 모유수유를 할 것인지, 분유를 먹일것인 지요?
임신해서 태어나는 것 까지가 제품이 이제 출시 되었다라고 비유를 하고 싶네요.
태어난 아기가 자라서 대학교까지 가는 것까지 부모의 역할 이라고 한다면...
사실 20년은 부모의 관리가 필요한 것입니다. 임신해서 출산까지 10개월1년 이라고 생각해도 무려 20배의 넘는 배려가 필요한 법입니다.
자식이 있는 부모라면 어느정도 이해하실지 모르겠네요.
여튼 제품이 만들어 지고 나면, 그 제품을 어떻게 관리 할 것인지 고민해 보아야합니다.
제품 개발 한다고하는 몇몇 회사 몇몇 개발팀을 돌아다녀 보았지만, 사실 별거 없습니다.
si에 비해 별 특별하고 특별한게 없다고 말하고 싶습니다.
좀 특별하다면, 제품 만들면서 생기는 제품에 대한 지식이 특별하겠지요.
이것은 희소성의 원리 때문에 특별한거지요. 마치 금의 가격이 석탄의 가격보다 높은 것 처럼요.
사실, 일반 서민이 실제로 필요한 것은 금보다 석탄일 확률이 무지 하게 높습니다.
그리고, 대개의 경우 제품개발팀이 si개발팀보다 일반적인 소프트웨어 개발능력은 떨어지지 않을까 싶습니다. 좀 역설적이 겠습니다만, 저는 그렇게 생각 합니다.
몇몇 제품 개발한다고, 자기는 절대 si 안한다고 하시는 분들... 반성하세요. 김군아 반성해라.
... 하기야 김군 너의 상황을 조금 들은 나는 이해할만도 하겟다만...
아웅, 어제 잠을 좀 빨리 잣더디, 새벽4시에 일어났고..
오늘은 어머니 환갑이신데, 올만에 엄마 보러 집에가야겟네요.
못난 자식 키워주신 엄마에게로 ...
화요일, 6월 24, 2008
컴퓨터를 새롭게 받았다 사양은
토요일, 6월 14, 2008
기술동향
정보의 홍수라 누군가 표현했는데, 나와 같은 직업을 가진 사람들은 홍수가 아니라 쓰나미 속에 사는 듯 하다.
가끔씩 오는 기술편지(The Service.com, InfoQ ...)만 봐도 얼마나 많은 기술과 방법들이 나오는지 말이다. 그것 뿐인가 얼마나 다양한 spec이 새로 나오는지 감당이 안된지 사실 오래됫다.
일례로 보통 현업에서는 Java 1.4, 1.5를 주로 사용한다. 개인적으로 현업에서 1.6을 사용한곳은 아직 보지 못했다.(?, 너무 느린가? 개인적으로는 1.6을사용한다.)
Sun에서는 1.7 b28(오늘 28이네요) 이야기가 한창이다. 새롭게 추가된 api, 각 종 진단 툴과 관련 기술들 대략 입벌이지는 것들이다.

Eclipse에서는 Eclipse 3.4 RC3(Ganymede) 이야기로 한창이다. 24일에 릴리즈 예정이라고 한다.
좀 유명한 plugin은 3.4용으로 이미 나와 있으며, Eclipse rcp 커미터들의 블로그에서는 3.4에 추가된 api등을 소개하며 방향을 소개한다. 교육 사이트에는 3.4 Toturial을 소개하기도한다.

Spring은 어떤가? 3.0 소식과 함께 Osgi등의 너무 많은 이슈가 있지 않은가?
<별로 상관 없을수도 있지만 Rod Johnson Discusses Spring, OSGi, Tomcat and the Future of Enterprise Java > --;; 오해의 소지가 있으므로, 저는 들어도 거의 못 알아먹습니다. --;;; Rod Johnson의 눈이 좀 안습이네요. 잠을 많이 못 잔듯해요.
JSR-286로 그디어 release되었네요.(Java Portlet)- 지금 하는 일과 멀어져 버렸지만요. 그디어 를 넣고 싶다.
사실, 자바 진영의 문제는 너무 빠르게 발전하는것이 문제가 아닌가 싶다.
현업 개발자들 발전의 속도를 따라가지 못하고, 앞서 나가는 자와 뒤따라 가는 자의 괴리는 나날이 깊어 가는듯 하다.
인프라가 부족한 이런 발전이 It 업계에 좋은 현상인가?
더군다나 한국적인 현상, 특히 영어의 괴리로 더 깊이는 더욱 깊어 지는 듯 하다.
우리는 어떤식으로, 우리회사는 어떤식으로 대처 하고 있을까?
가끔씩 오는 기술편지(The Service.com, InfoQ ...)만 봐도 얼마나 많은 기술과 방법들이 나오는지 말이다. 그것 뿐인가 얼마나 다양한 spec이 새로 나오는지 감당이 안된지 사실 오래됫다.
일례로 보통 현업에서는 Java 1.4, 1.5를 주로 사용한다. 개인적으로 현업에서 1.6을 사용한곳은 아직 보지 못했다.(?, 너무 느린가? 개인적으로는 1.6을사용한다.)
Sun에서는 1.7 b28(오늘 28이네요) 이야기가 한창이다. 새롭게 추가된 api, 각 종 진단 툴과 관련 기술들 대략 입벌이지는 것들이다.

Eclipse에서는 Eclipse 3.4 RC3(Ganymede) 이야기로 한창이다. 24일에 릴리즈 예정이라고 한다.
좀 유명한 plugin은 3.4용으로 이미 나와 있으며, Eclipse rcp 커미터들의 블로그에서는 3.4에 추가된 api등을 소개하며 방향을 소개한다. 교육 사이트에는 3.4 Toturial을 소개하기도한다.

Spring은 어떤가? 3.0 소식과 함께 Osgi등의 너무 많은 이슈가 있지 않은가?
<별로 상관 없을수도 있지만 Rod Johnson Discusses Spring, OSGi, Tomcat and the Future of Enterprise Java > --;; 오해의 소지가 있으므로, 저는 들어도 거의 못 알아먹습니다. --;;; Rod Johnson의 눈이 좀 안습이네요. 잠을 많이 못 잔듯해요.
JSR-286로 그디어 release되었네요.(Java Portlet)- 지금 하는 일과 멀어져 버렸지만요. 그디어 를 넣고 싶다.
사실, 자바 진영의 문제는 너무 빠르게 발전하는것이 문제가 아닌가 싶다.
현업 개발자들 발전의 속도를 따라가지 못하고, 앞서 나가는 자와 뒤따라 가는 자의 괴리는 나날이 깊어 가는듯 하다.
인프라가 부족한 이런 발전이 It 업계에 좋은 현상인가?
더군다나 한국적인 현상, 특히 영어의 괴리로 더 깊이는 더욱 깊어 지는 듯 하다.
우리는 어떤식으로, 우리회사는 어떤식으로 대처 하고 있을까?
금요일, 6월 13, 2008
BCEL plug-in 시작
사실, 저에게 고민이 있습니다. 대중적인 툴을 좀 만들어 보고 싶은 욕심이 있습니다.
제가 그리 개발능력이 뛰어(?) 나진 않지만요.
예전에 bcel을 사용하여 메소드 내용삭제 를 하면서 사람들에게 좀 쓸모있는 것을 만들어 보기로 했는데, 아직까지 실행에 옮겨지지 못하고 있네요.
ASM에는 참 편리하고도 유용한, plug-in인 Bytecode Outline이 있습니다.
하지만 BECL은 마땅한 plug-in이 없습니다.
혹시 아시는 분 있으시면 코멘트 부탁드려요~
그래서 시간이 날때마다, Bycode Outline 과 용도가 같은 그렇지만, BCEL용을 만들어 봐야겟다 싶습니다.
작업해 보신 분은 알겠지만, BCEL로 이작업을 하는게 얼마나 괴로운지 아실만한 분은 다 아실거라 생각이 드는군요.
기존 class 분석 -> bcel 작업 -> 실행 혹은 *.class 디컴파일 로 확인
이런식의 반복잡업을 계속 하게 됩니다. 물런 어느 프로그램이나 동일 하겠지만, 이 작업은 한번은 더 거쳐야 합니다.(사실 저는 이작업보다 더 힘든게, 전체 구조를 이해 하는 부분이 힘들었습니다만)
여튼 이 플러그인을 만들어 보면 좋겟다는 생각이 들었습니다.
근데요. 저 위에 있는 고민이 해결되지 않네요. BCEL이 참 유용한 LIB이지만, 아무래도 아주 부분적으로만 사용하는 요소 기술 일 뿐이라 말입니다. 그리고, 이 플러그인은 얼마나 걸릴지 지금은 감이 잡히지 않네요. 내가 생각한 기간에 + 알파를 하면 대략 기간이 나오는데.. 안나오니 대략 힘드네요.
할수나 있는건지.. 검토를 좀더 해봐야겠네요.
좀더 대중을 대상으로 할수 있는 프로그램을 만들고 싶네요.
당분간 BCEL plug-in 만들기를 시작해보겠습니다.
ps)
GWT Designer가 ASM을사용하였네요. 어쩐지 빠르다 이렇게 표현해야 맞는건지~ 여튼 설명은 그것 때문에 빠르다. 끙~
제가 그리 개발능력이 뛰어(?) 나진 않지만요.
예전에 bcel을 사용하여 메소드 내용삭제 를 하면서 사람들에게 좀 쓸모있는 것을 만들어 보기로 했는데, 아직까지 실행에 옮겨지지 못하고 있네요.
ASM에는 참 편리하고도 유용한, plug-in인 Bytecode Outline이 있습니다.
하지만 BECL은 마땅한 plug-in이 없습니다.
혹시 아시는 분 있으시면 코멘트 부탁드려요~
그래서 시간이 날때마다, Bycode Outline 과 용도가 같은 그렇지만, BCEL용을 만들어 봐야겟다 싶습니다.
작업해 보신 분은 알겠지만, BCEL로 이작업을 하는게 얼마나 괴로운지 아실만한 분은 다 아실거라 생각이 드는군요.
기존 class 분석 -> bcel 작업 -> 실행 혹은 *.class 디컴파일 로 확인
이런식의 반복잡업을 계속 하게 됩니다. 물런 어느 프로그램이나 동일 하겠지만, 이 작업은 한번은 더 거쳐야 합니다.(사실 저는 이작업보다 더 힘든게, 전체 구조를 이해 하는 부분이 힘들었습니다만)
여튼 이 플러그인을 만들어 보면 좋겟다는 생각이 들었습니다.
근데요. 저 위에 있는 고민이 해결되지 않네요. BCEL이 참 유용한 LIB이지만, 아무래도 아주 부분적으로만 사용하는 요소 기술 일 뿐이라 말입니다. 그리고, 이 플러그인은 얼마나 걸릴지 지금은 감이 잡히지 않네요. 내가 생각한 기간에 + 알파를 하면 대략 기간이 나오는데.. 안나오니 대략 힘드네요.
할수나 있는건지.. 검토를 좀더 해봐야겠네요.
좀더 대중을 대상으로 할수 있는 프로그램을 만들고 싶네요.
당분간 BCEL plug-in 만들기를 시작해보겠습니다.
ps)
GWT Designer가 ASM을사용하였네요. 어쩐지 빠르다 이렇게 표현해야 맞는건지~ 여튼 설명은 그것 때문에 빠르다. 끙~
수요일, 6월 11, 2008
화요일, 6월 10, 2008
RCP 각 파트 들 간에 통신
RCP를 만들다 보면 각 파트들간에 통신(?)해야할 필요가 있다.
예를 들어, 왼쪽 트리를 클릭하면 오른쪽 뷰가 바뀌고, 아래에 있는 프로퍼티뷰가 바뀐다거나요.
혹은 오른쪽 뷰가 닫히면 함께 연결된 아래 프로퍼티가 닫혀야 하거나요.
이럴때 어떻게 개발해야 할까요?
이클립스 RCP책 252쪽 파트들을 함께 연결하기를 정리해보는 선으로 하겠습니다.
- 선택사항 이벤트(ISelectionEvent) 사용 : 이벤트 등록
- 파트 리스너(IPartListener) : 파트가 닫히고, 열리고, 숨겨졌을 때 발생하는 이벤트 등록
- 직접 통신 : 선택 또는 파트 서비스가 임으의 파트들끼리 직접 제어
위의 방법들이 있다고 합니다.
직접 통신은 자재해야 할 방법이겟고~
예를 들어, 왼쪽 트리를 클릭하면 오른쪽 뷰가 바뀌고, 아래에 있는 프로퍼티뷰가 바뀐다거나요.
혹은 오른쪽 뷰가 닫히면 함께 연결된 아래 프로퍼티가 닫혀야 하거나요.
이럴때 어떻게 개발해야 할까요?
이클립스 RCP책 252쪽 파트들을 함께 연결하기를 정리해보는 선으로 하겠습니다.
- 선택사항 이벤트(ISelectionEvent) 사용 : 이벤트 등록
- 파트 리스너(IPartListener) : 파트가 닫히고, 열리고, 숨겨졌을 때 발생하는 이벤트 등록
- 직접 통신 : 선택 또는 파트 서비스가 임으의 파트들끼리 직접 제어
위의 방법들이 있다고 합니다.
직접 통신은 자재해야 할 방법이겟고~
일요일, 6월 08, 2008
소프트웨어를 분석할때면, 항상 RSA(Rational Software Architect)가 그리워진다.
그렇다고 RSA를 아주 잘 사용하거나, RSA 개념에 맞게 사용하는지는 자신이 없지만, 무엇인가 없으면 불편하다.
UML 모델러 때문인가도 싶기도하고... 한글화 된 풍부한 문서 때문인가 싶다.
오늘 다시 인스톨 해야겟다.
몇몇 부분의 분석기를 올리고 있는데, 있으면 좀더 속도가 날 듯 싶다.
RSA HOME
이런게 있으면 내가 이해하는데,
http://hangumkj.blogspot.com/2008/03/java-collection.html
도움이 되는 도구니.. 인스톨 해야지..
7.0.0.6 업데이트가 나왓네요~
그렇다고 RSA를 아주 잘 사용하거나, RSA 개념에 맞게 사용하는지는 자신이 없지만, 무엇인가 없으면 불편하다.
UML 모델러 때문인가도 싶기도하고... 한글화 된 풍부한 문서 때문인가 싶다.
오늘 다시 인스톨 해야겟다.
몇몇 부분의 분석기를 올리고 있는데, 있으면 좀더 속도가 날 듯 싶다.
RSA HOME
이런게 있으면 내가 이해하는데,
http://hangumkj.blogspot.com/2008/03/java-collection.html
도움이 되는 도구니.. 인스톨 해야지..
7.0.0.6 업데이트가 나왓네요~
Take time to thinking: eclipse에서 font 사용 및 분석기
Take time to thinking: eclipse에서 font 사용 및 분석기
위의 link 그림 rcp 화면처럼 하려면, display를 수정해줘야 합니다.
아래처럼 display를 가져오게 되는데, 그 display 객체를 수정해주어야 겠습니다.
혹은
org.eclipse.ui.internal.Workbench의
/**
* Creates the
*
* @return the display
*/
public static Display createDisplay() {
// setup the application name used by SWT to lookup resources on some
// platforms
String applicationName = WorkbenchPlugin.getDefault().getAppName();
if (applicationName != null) {
Display.setAppName(applicationName);
}
// create the display
Display newDisplay = Display.getCurrent();
if(newDisplay == null) {
if (Policy.DEBUG_SWT_GRAPHICS || Policy.DEBUG_SWT_DEBUG) {
DeviceData data = new DeviceData();
if (Policy.DEBUG_SWT_GRAPHICS) {
data.tracking = true;
}
if (Policy.DEBUG_SWT_DEBUG) {
data.debug = true;
}
newDisplay = new Display(data);
} else {
newDisplay = new Display();
}
}
// workaround for 1GEZ9UR and 1GF07HN
newDisplay.setWarnings(false);
// Set the priority higher than normal so as to be higher
// than the JobManager.
Thread.currentThread().setPriority(
Math.min(Thread.MAX_PRIORITY, Thread.NORM_PRIORITY + 1));
initializeImages();
return newDisplay;
}
클래스를 손봐주어야한다.
위의 link 그림 rcp 화면처럼 하려면, display를 수정해줘야 합니다.
아래처럼 display를 가져오게 되는데, 그 display 객체를 수정해주어야 겠습니다.
혹은
org.eclipse.ui.internal.Workbench의
/**
* Creates the
Display to be used by the workbench.*
* @return the display
*/
public static Display createDisplay() {
// setup the application name used by SWT to lookup resources on some
// platforms
String applicationName = WorkbenchPlugin.getDefault().getAppName();
if (applicationName != null) {
Display.setAppName(applicationName);
}
// create the display
Display newDisplay = Display.getCurrent();
if(newDisplay == null) {
if (Policy.DEBUG_SWT_GRAPHICS || Policy.DEBUG_SWT_DEBUG) {
DeviceData data = new DeviceData();
if (Policy.DEBUG_SWT_GRAPHICS) {
data.tracking = true;
}
if (Policy.DEBUG_SWT_DEBUG) {
data.debug = true;
}
newDisplay = new Display(data);
} else {
newDisplay = new Display();
}
}
// workaround for 1GEZ9UR and 1GF07HN
newDisplay.setWarnings(false);
// Set the priority higher than normal so as to be higher
// than the JobManager.
Thread.currentThread().setPriority(
Math.min(Thread.MAX_PRIORITY, Thread.NORM_PRIORITY + 1));
initializeImages();
return newDisplay;
}
클래스를 손봐주어야한다.
Take time to thinking: InstallFactory를 이용한 배포
Take time to thinking: InstallFactory를 이용한 배포
아참 내보내기해서 생기 exe파일 예를 들어 a.exe라고 내보내기했을경우 a.ini파일을 만들어 내보낼수 있는데요.
여기에 -vm 옵션을 주어서 jre의 위치를 지정할수 있습니다.
아참 내보내기해서 생기 exe파일 예를 들어 a.exe라고 내보내기했을경우 a.ini파일을 만들어 내보낼수 있는데요.
여기에 -vm 옵션을 주어서 jre의 위치를 지정할수 있습니다.
토요일, 6월 07, 2008
eclipse에서 font 사용 및 분석기
요 몇일 폰트 문제로 머리가 좀 아팟습니다.
폰트는 다들 아시겠지만 시스템에있는 폰트를 사용해야하고, 리소스를 많이 잡아먹는 대표적인 것들이라 신중하기도 합니다.
SWT에서 폰트는 대략 이렇게 처리합니다. Display(물런 Device에서 최종적으로 가져오게 되는것이죠. 그것의 더 최종은 Font구요)에 systemFont(defaultFont)가져오는 부분이 있습니다. 그래서 eclipse나 우리가 만든 application이 동작하면, systemFont로 만들어 지게 됩니다.
label, button, text등의 각종 widget들도 사용자가 지정하지 않으면, default로 systemFont를 적용하게 됩니다.
폰트는 뭐 아래와 같이 정의 되어 있습니다.
public Font getSystemFont () {
checkDevice ();
if (systemFont != null) return systemFont;
int hFont = 0;
if (!OS.IsWinCE) {
NONCLIENTMETRICS info = OS.IsUnicode ? (NONCLIENTMETRICS) new NONCLIENTMETRICSW () : new NONCLIENTMETRICSA ();
info.cbSize = NONCLIENTMETRICS.sizeof;
if (OS.SystemParametersInfo (OS.SPI_GETNONCLIENTMETRICS, 0, info, 0)) {
LOGFONT logFont = OS.IsUnicode ? (LOGFONT) ((NONCLIENTMETRICSW)info).lfMessageFont : ((NONCLIENTMETRICSA)info).lfMessageFont;
hFont = OS.CreateFontIndirect (logFont);
lfSystemFont = hFont != 0 ? logFont : null;
}
}
if (hFont == 0) hFont = OS.GetStockObject (OS.DEFAULT_GUI_FONT);
if (hFont == 0) hFont = OS.GetStockObject (OS.SYSTEM_FONT);
return systemFont = Font.win32_new (this, hFont);
}
시스템에서 사용하는 폰트는 대략 hFont에 정의된 값이라 할수 있겠습니다.
SWT에서 화면에 출력해주는 기본 폰트라 하겠습니다.(당연히 RCP도 마찬가지겟지요)
자 일단 이걸 기본 지식으로 하겠습니다.
그럼 두번째로,
이클립스에서 Preferences -> Window -> General -> Apperence -> Colors and Font에 정의 되어 있는 폰트와 크기등이 어떻게 결정 될까요?
그것은 org.eclipse.jface 프로젝트에서 관리합니다.
주요한 클래스로는 FontRegistry, JFaceResource를 들수 있겠습니다.
관련 파일로는 jfacefonts.properties, jfacefonts_xxx.properties(대표적인 os마다 파일이 존재합니다.) 그리고 각 부분에 따른 폰트와 크기 타입이 FontDescription 형태로 정의되어 있습니다.
대표적인 jfacefonts.properties 파일을 보도록 하겠습니다.###############################################################################
# Generic NLS font file for JFace
# *.0 is Windows font
# *.1 is Unix font
#############################################################
org.eclipse.jface.bannerfont.0=MS Sans Serif-bold-10
org.eclipse.jface.bannerfont.1=b&h-lucidabright-regular-10
org.eclipse.jface.headerfont.0=MS Sans Serif-bold-12
org.eclipse.jface.headerfont.1=b&h-lucidabright-regular-12
org.eclipse.jface.textfont.0=Courier New-regular-10
org.eclipse.jface.textfont.1=Courier-regular-10
org.eclipse.jface.textfont.2=b&h-lucidabright-regular-9
이클립스처럼 환경을 정의(Colors and Font)해서 사용해야할 경우라면 FontRegistry를 이용하면 되겠습니다. 국제화에 맞게 시스템을 만들 것이라면 위의 방식을 모방하면, 멋지게 이부분은 만들 수 있겠다 생각이 들었습니다.
저기에는 font만 정의하는것이 아니라 ColorRegistry, ResourceRegistry 등도 존재하고, 이것을 유저가 사용할수 있도록 JFaceResource를 내어놓았습니다. 그리고 한번 설정되면 두번은 바뀌지 않도록 되어 있어서 public static final String DEFAULT_FONT = "org.eclipse.jface.defaultfont"; //$NON-NLS-1$ 를 사용하여 재 정의도 못하게 되어 있습니다.
그럼, 어캐 이것을 바꾸지 하시는 분들이 있을텐데요. 위에 정의한 프로퍼티 파일을 바꾸시면 되겟지요.

<이것은 rcp의 초기 폰트와 크기를 바꾸어 보았습니다.>
폰트는 다들 아시겠지만 시스템에있는 폰트를 사용해야하고, 리소스를 많이 잡아먹는 대표적인 것들이라 신중하기도 합니다.
SWT에서 폰트는 대략 이렇게 처리합니다. Display(물런 Device에서 최종적으로 가져오게 되는것이죠. 그것의 더 최종은 Font구요)에 systemFont(defaultFont)가져오는 부분이 있습니다. 그래서 eclipse나 우리가 만든 application이 동작하면, systemFont로 만들어 지게 됩니다.
label, button, text등의 각종 widget들도 사용자가 지정하지 않으면, default로 systemFont를 적용하게 됩니다.
폰트는 뭐 아래와 같이 정의 되어 있습니다.
public Font getSystemFont () {
checkDevice ();
if (systemFont != null) return systemFont;
int hFont = 0;
if (!OS.IsWinCE) {
NONCLIENTMETRICS info = OS.IsUnicode ? (NONCLIENTMETRICS) new NONCLIENTMETRICSW () : new NONCLIENTMETRICSA ();
info.cbSize = NONCLIENTMETRICS.sizeof;
if (OS.SystemParametersInfo (OS.SPI_GETNONCLIENTMETRICS, 0, info, 0)) {
LOGFONT logFont = OS.IsUnicode ? (LOGFONT) ((NONCLIENTMETRICSW)info).lfMessageFont : ((NONCLIENTMETRICSA)info).lfMessageFont;
hFont = OS.CreateFontIndirect (logFont);
lfSystemFont = hFont != 0 ? logFont : null;
}
}
if (hFont == 0) hFont = OS.GetStockObject (OS.DEFAULT_GUI_FONT);
if (hFont == 0) hFont = OS.GetStockObject (OS.SYSTEM_FONT);
return systemFont = Font.win32_new (this, hFont);
}
시스템에서 사용하는 폰트는 대략 hFont에 정의된 값이라 할수 있겠습니다.
SWT에서 화면에 출력해주는 기본 폰트라 하겠습니다.(당연히 RCP도 마찬가지겟지요)
자 일단 이걸 기본 지식으로 하겠습니다.
그럼 두번째로,
이클립스에서 Preferences -> Window -> General -> Apperence -> Colors and Font에 정의 되어 있는 폰트와 크기등이 어떻게 결정 될까요?
그것은 org.eclipse.jface 프로젝트에서 관리합니다.
주요한 클래스로는 FontRegistry, JFaceResource를 들수 있겠습니다.
관련 파일로는 jfacefonts.properties, jfacefonts_xxx.properties(대표적인 os마다 파일이 존재합니다.) 그리고 각 부분에 따른 폰트와 크기 타입이 FontDescription 형태로 정의되어 있습니다.
대표적인 jfacefonts.properties 파일을 보도록 하겠습니다.###############################################################################
# Generic NLS font file for JFace
# *.0 is Windows font
# *.1 is Unix font
#############################################################
org.eclipse.jface.bannerfont.0=MS Sans Serif-bold-10
org.eclipse.jface.bannerfont.1=b&h-lucidabright-regular-10
org.eclipse.jface.headerfont.0=MS Sans Serif-bold-12
org.eclipse.jface.headerfont.1=b&h-lucidabright-regular-12
org.eclipse.jface.textfont.0=Courier New-regular-10
org.eclipse.jface.textfont.1=Courier-regular-10
org.eclipse.jface.textfont.2=b&h-lucidabright-regular-9
이클립스처럼 환경을 정의(Colors and Font)해서 사용해야할 경우라면 FontRegistry를 이용하면 되겠습니다. 국제화에 맞게 시스템을 만들 것이라면 위의 방식을 모방하면, 멋지게 이부분은 만들 수 있겠다 생각이 들었습니다.
저기에는 font만 정의하는것이 아니라 ColorRegistry, ResourceRegistry 등도 존재하고, 이것을 유저가 사용할수 있도록 JFaceResource를 내어놓았습니다. 그리고 한번 설정되면 두번은 바뀌지 않도록 되어 있어서 public static final String DEFAULT_FONT = "org.eclipse.jface.defaultfont"; //$NON-NLS-1$ 를 사용하여 재 정의도 못하게 되어 있습니다.
그럼, 어캐 이것을 바꾸지 하시는 분들이 있을텐데요. 위에 정의한 프로퍼티 파일을 바꾸시면 되겟지요.

<이것은 rcp의 초기 폰트와 크기를 바꾸어 보았습니다.>
수요일, 6월 04, 2008
월,화 집에서 계속 잠으로 때웠네요.
올만에 집 청소도 하고, 가구도 옮기고요.
오늘은 새로 태어날 아기 침대가 왔는데.. 우오왕~ 신기했습니다.
몇년 전에 어느분께 빌려드린 유모차도 다시 우리에게 돌아왔구요.
덤으로 아기 물품 몇 가지와 다른 유모차 한대, 침대등 이었습니다.
나눌수록 커지는건 사실인가 봅니다.
첫째 희찬이가 태어날때 준비하지 못했던 것들을, 둘째 '사랑'이가 태어나면서는 같이 준비하게 되네요.
철이 좀 든거지요.
예전에 학교 다닐때 '가난한 마음'이 무엇일까 고민고민 할때가 있었습니다.
가난한 마음을 가질수 있으면 좋을텐데.. 그걸 가지면 무엇을 얻게 된다고는 있는데.. 어떻게 가질수 있다는 이야기는 없습니다.
그게 몰까? 어떻게 가질수 있을까? 고민고민했지만.. 결국은 찾지 못했습니다.
요새 한 몇년 삽질을 계속 하면서, 그 가난한 마음이 무엇인지 아주 조금이지만 알수 있는듯 합니다.
(무슨 일을 하던간에 안되고 안되는 나를 보면서 살짝 절망했습니다. 지금도 그리 좋은 상황은 아니지요.)
아주 작은 것에 기뻐하고 감사하고 만족하는게 아닐까 싶습니다.
주변에 일어 나는 작은 사건에 감사하고, 민감하게 반응하는 것 말이지요.
달라진 저의 행동이라면,
사무실에서 보이는 쓰레기 줍기(항상 그런건 아닙니다만..)
세수나 이 닦고 물 남은거 세탁기에 붙기
청소 빨래 설걷이등 할수 있으면 하기 등을 들수 있겠습니다.
내일은 광화문에 나가볼까 싶습니다.
와이프가 고개 절로 흔들면서 못가게 하는데.. 그래도 가봐야지요.
아니면 5일-6일에 가족 나들이를 가볼까 싶습니다.
아이들에게 정의와 민주 함께하는것들을 말해주고 싶고 그렇게 살도록 교육해야지요.

<아이야 무럭무럭 자라렴. 보고싶구나>
올만에 집 청소도 하고, 가구도 옮기고요.
오늘은 새로 태어날 아기 침대가 왔는데.. 우오왕~ 신기했습니다.
몇년 전에 어느분께 빌려드린 유모차도 다시 우리에게 돌아왔구요.
덤으로 아기 물품 몇 가지와 다른 유모차 한대, 침대등 이었습니다.
나눌수록 커지는건 사실인가 봅니다.
첫째 희찬이가 태어날때 준비하지 못했던 것들을, 둘째 '사랑'이가 태어나면서는 같이 준비하게 되네요.
철이 좀 든거지요.
예전에 학교 다닐때 '가난한 마음'이 무엇일까 고민고민 할때가 있었습니다.
가난한 마음을 가질수 있으면 좋을텐데.. 그걸 가지면 무엇을 얻게 된다고는 있는데.. 어떻게 가질수 있다는 이야기는 없습니다.
그게 몰까? 어떻게 가질수 있을까? 고민고민했지만.. 결국은 찾지 못했습니다.
요새 한 몇년 삽질을 계속 하면서, 그 가난한 마음이 무엇인지 아주 조금이지만 알수 있는듯 합니다.
(무슨 일을 하던간에 안되고 안되는 나를 보면서 살짝 절망했습니다. 지금도 그리 좋은 상황은 아니지요.)
아주 작은 것에 기뻐하고 감사하고 만족하는게 아닐까 싶습니다.
주변에 일어 나는 작은 사건에 감사하고, 민감하게 반응하는 것 말이지요.
달라진 저의 행동이라면,
사무실에서 보이는 쓰레기 줍기(항상 그런건 아닙니다만..)
세수나 이 닦고 물 남은거 세탁기에 붙기
청소 빨래 설걷이등 할수 있으면 하기 등을 들수 있겠습니다.
내일은 광화문에 나가볼까 싶습니다.
와이프가 고개 절로 흔들면서 못가게 하는데.. 그래도 가봐야지요.
아니면 5일-6일에 가족 나들이를 가볼까 싶습니다.
아이들에게 정의와 민주 함께하는것들을 말해주고 싶고 그렇게 살도록 교육해야지요.
<아이야 무럭무럭 자라렴. 보고싶구나>
월요일, 6월 02, 2008
RCP, plug-in 개발은 얼마나 걸릴것 같으세요?
오늘 문득 RCP, plug-in은 얼마나 공부하면 할수 있는지 물었던것이 생각난다.
한 두사람이 물은것도 아니고, 많은 사람들, 그것도 다양한 부류들이 그렇게 묻는다.
사실 물으시는 대부분이 RCP가 무엇인지도 모릅니다. 개발자건 관리자건 말입니다.
PLUG-IN을 어떻게 개발하는것인지도 모릅니다. 사실 사용하는 지도 모르는 분도 있습니다.
개발자분들 중에서요.
저는 '혹시, 얼마나 생각하시느냐구요. ' 물어봅니다.
'보름, 한달정도?'
또 어떤 분들은 이렇게 말합니다.
비지니스 로직이 중요하니 앞단 UI개발은 대충 해도 되는거 아니냐구요?
비지니스 로직 잘 만들고 앞단 화면 잘 만들면 되는거 아니냐구요?
RCP/plug-in에 대해 기반기술이 없는 분들이 그렇게 말하고 시작하시곤 합니다.
오~ 매우 끔찍한 접근입니다.
물런, 제가하는 코딩 개발이 옳다는거 아닙니다.
저와 생각이 틀릴수도 있고, 실제로 저의 생각이 틀린적도 많고, 코딩도 허접한게 많이있을수 있습니다.
(물런 항상 책 보고 공부하기때문에 실제로 허접할지라도 개인 자부심은 있지요)
새롭게 RCP/plug-in을 만들어서 무언가 해보실 계획이 있으시다면.. 시간 넉넉히 가지십시요.
swt가 몬지,
그림들어가고 그럴려면 draw2d가 몬지,
rcp와 plug-in차이는 몬지
osgi, equinox, bundle, plug-in은 몬지
요걸 이클립스에서 gef로 그림 어캐 표현하는지
데이터의 답답함은 emf로 어캐 표현하는지,
그림과 데이터 합치는 gmf는 어캐 표현하는지,
코드 자동화는 jet로 어캐 표현하는지 알아야 합니다.
위의 것은 해당 사항을 사용할때 가장 기본적으로 알아야하는 기술 들일 뿐입니다.
여기에 rcp <-> db의 데이터 연동은 어떻게 하실건가요?
위의 주제부터가 응용이 되겟네요. 괸찮은 프레임웍 가지고 삽질하면 안돼잖아요.
socket으로 연결하고 서버에서 디비로 연결하는 3티어를 만들건지,
아니면 바로 디비로 연결할건지,
위와 같은 단들을 직접 만들것인지, 아니면 springframework을 사용할것인지요?
파일럿은 한번 해보고 해야하지 안겟어요?
위에 있는것 뿐만아니라, 응용은 어떻게 할것인데요?
아효~ 많네요. 쓰다보니 많아요. 너무 많아서.. -_-;;
상대적으로 좋고 발전된 기술이고, 점점 더 보편화 되어 가는 기술인데, 한국과의 괴리는 상당히 깊어 보이네요.
한 두사람이 물은것도 아니고, 많은 사람들, 그것도 다양한 부류들이 그렇게 묻는다.
사실 물으시는 대부분이 RCP가 무엇인지도 모릅니다. 개발자건 관리자건 말입니다.
PLUG-IN을 어떻게 개발하는것인지도 모릅니다. 사실 사용하는 지도 모르는 분도 있습니다.
개발자분들 중에서요.
저는 '혹시, 얼마나 생각하시느냐구요. ' 물어봅니다.
'보름, 한달정도?'
또 어떤 분들은 이렇게 말합니다.
비지니스 로직이 중요하니 앞단 UI개발은 대충 해도 되는거 아니냐구요?
비지니스 로직 잘 만들고 앞단 화면 잘 만들면 되는거 아니냐구요?
RCP/plug-in에 대해 기반기술이 없는 분들이 그렇게 말하고 시작하시곤 합니다.
오~ 매우 끔찍한 접근입니다.
물런, 제가하는 코딩 개발이 옳다는거 아닙니다.
저와 생각이 틀릴수도 있고, 실제로 저의 생각이 틀린적도 많고, 코딩도 허접한게 많이있을수 있습니다.
(물런 항상 책 보고 공부하기때문에 실제로 허접할지라도 개인 자부심은 있지요)
새롭게 RCP/plug-in을 만들어서 무언가 해보실 계획이 있으시다면.. 시간 넉넉히 가지십시요.
swt가 몬지,
그림들어가고 그럴려면 draw2d가 몬지,
rcp와 plug-in차이는 몬지
osgi, equinox, bundle, plug-in은 몬지
요걸 이클립스에서 gef로 그림 어캐 표현하는지
데이터의 답답함은 emf로 어캐 표현하는지,
그림과 데이터 합치는 gmf는 어캐 표현하는지,
코드 자동화는 jet로 어캐 표현하는지 알아야 합니다.
위의 것은 해당 사항을 사용할때 가장 기본적으로 알아야하는 기술 들일 뿐입니다.
여기에 rcp <-> db의 데이터 연동은 어떻게 하실건가요?
위의 주제부터가 응용이 되겟네요. 괸찮은 프레임웍 가지고 삽질하면 안돼잖아요.
socket으로 연결하고 서버에서 디비로 연결하는 3티어를 만들건지,
아니면 바로 디비로 연결할건지,
위와 같은 단들을 직접 만들것인지, 아니면 springframework을 사용할것인지요?
파일럿은 한번 해보고 해야하지 안겟어요?
위에 있는것 뿐만아니라, 응용은 어떻게 할것인데요?
아효~ 많네요. 쓰다보니 많아요. 너무 많아서.. -_-;;
상대적으로 좋고 발전된 기술이고, 점점 더 보편화 되어 가는 기술인데, 한국과의 괴리는 상당히 깊어 보이네요.
금요일, 5월 30, 2008
목요일, 5월 29, 2008
어제 문득, 나도 발전하고 있는 구나.. 이런생각이 들었습니다.
아무리 노력해도 발전, 성장하지 않는듯 보였는데요.
어제 왜 그런 생각이 들었는지 모르겟지만, '나도 조금씩은 발전 하는구나' 하는 생각이 들었지요.
내일이면 이 사람들, 프로젝트,...... 떠나야할 시간입니다.
여기에서 나도 발전한다는 생각이 든 것만도 많은 소득이 있는 프로젝트 였습니다.
별볼일 없는 나를 별볼일 있는 사람 처럼 대해준 이곳이 생각날 것 같습니다.
프로젝트 관리, 개발등 문제, 사건이 많았지만(없으면 이상하죠???) 사람이 이런 생각이 들게 해준 것은 아주 좋은(?) 점이 아닐까요?
고래도 춤추게 한다는 것이 이런것 아닐까 잠시나마 생각해 보게 됩니다.
앞으로 사람을 대할때 정직하게 몸에 배이게 만들어야 겠습니다.
아무리 노력해도 발전, 성장하지 않는듯 보였는데요.
어제 왜 그런 생각이 들었는지 모르겟지만, '나도 조금씩은 발전 하는구나' 하는 생각이 들었지요.
내일이면 이 사람들, 프로젝트,...... 떠나야할 시간입니다.
여기에서 나도 발전한다는 생각이 든 것만도 많은 소득이 있는 프로젝트 였습니다.
별볼일 없는 나를 별볼일 있는 사람 처럼 대해준 이곳이 생각날 것 같습니다.
프로젝트 관리, 개발등 문제, 사건이 많았지만(없으면 이상하죠???) 사람이 이런 생각이 들게 해준 것은 아주 좋은(?) 점이 아닐까요?
고래도 춤추게 한다는 것이 이런것 아닐까 잠시나마 생각해 보게 됩니다.
앞으로 사람을 대할때 정직하게 몸에 배이게 만들어야 겠습니다.
RCP 세째 날 교육
세번째날 오전은 jFreeChart라이브 러리를 rcp에 붙여 보고 작은 셈플을 만들어 보는 것으로 하였다.

위와 같은 것을 오전 셈플로 만들어 보았다.
이유는 현재 개발중인 부분에 jfreechart를 사용하여 chart를 및 보고서 화면을 추가 하겟다는 것이고
외부 플러그인 추가 하는 방법등을 익히기 위해서다.
오후에는 몇일전 GS인증을 요청한 TTA에서 결함리포트가 왔다.
36개 항목이 리포팅 됐으며, 그 중에 나에게 할당된 에러 항목을 함께 수정해 보았다.
(항상 TTA의 결함 리포트는 마음에 들지 않는다.... -..-;;)

위와 같은 것을 오전 셈플로 만들어 보았다.
이유는 현재 개발중인 부분에 jfreechart를 사용하여 chart를 및 보고서 화면을 추가 하겟다는 것이고
외부 플러그인 추가 하는 방법등을 익히기 위해서다.
오후에는 몇일전 GS인증을 요청한 TTA에서 결함리포트가 왔다.
36개 항목이 리포팅 됐으며, 그 중에 나에게 할당된 에러 항목을 함께 수정해 보았다.
(항상 TTA의 결함 리포트는 마음에 들지 않는다.... -..-;;)
화요일, 5월 27, 2008
RCP 둘째 날 교육 자료 및 진행
둘쨋날 RCP 교육을 해야한다.
PT는 Jeff McAffer가 작성한 http://kambing.ui.edu/eclipse/technology/phoenix/talks/Eclipse-RCP-3.2.6.pdf 를 사용하였습니다.
앞부분은 일반적인 이야기 이고 뒷 부분의 Equenox는 설명 해야할 것들이.. -..-;;
설명후에 어제처럼 바로 실습을 했습니다.
어제의 SWT예제를 VIEW로 만들어 보는 것으로 하였습니다.
실습환경은 3.3에 swt designer로 하였지요.
중간 중간 PT에서 언급한 부분과 실제 plug-in.xml과 이클립스로 부연 설명을 하였구요.
실행할때 실행하는 방법을 설명했습니다.
시작은 rcp view예제를 가지고 시작했습니다.
view가 다 만들어지고, 실행되고 난 다음에는 Application으로 시작하는 클래스와 Activator에 대해 설명을 하였습니다.
사실 너무 많은 것들이 존재하지요. product, fuature, update, 확장하는것도 가지 가지이지요.
이런 부분이 존재하고 사용해야 한다 정도로 마무리를 하였습니다.
내일은 좀더 어려운 예제를 하나 만들고, 이것 저것을 해보는 것으로 마무리 해야할까 봅니다.
gef, emf, gmf나 좀더 다양한 것들을 교육해보는것도 좋겠습니다만.. 아쉽다면 아쉽네요.
(사실 이런 부분은 제가 교육을 받아야겟다도 싶습니다 -_-;; ㅋㅋ)
PT는 Jeff McAffer가 작성한 http://kambing.ui.edu/eclipse/technology/phoenix/talks/Eclipse-RCP-3.2.6.pdf 를 사용하였습니다.
앞부분은 일반적인 이야기 이고 뒷 부분의 Equenox는 설명 해야할 것들이.. -..-;;
설명후에 어제처럼 바로 실습을 했습니다.
어제의 SWT예제를 VIEW로 만들어 보는 것으로 하였습니다.
실습환경은 3.3에 swt designer로 하였지요.
중간 중간 PT에서 언급한 부분과 실제 plug-in.xml과 이클립스로 부연 설명을 하였구요.
실행할때 실행하는 방법을 설명했습니다.
시작은 rcp view예제를 가지고 시작했습니다.
view가 다 만들어지고, 실행되고 난 다음에는 Application으로 시작하는 클래스와 Activator에 대해 설명을 하였습니다.
사실 너무 많은 것들이 존재하지요. product, fuature, update, 확장하는것도 가지 가지이지요.
이런 부분이 존재하고 사용해야 한다 정도로 마무리를 하였습니다.
내일은 좀더 어려운 예제를 하나 만들고, 이것 저것을 해보는 것으로 마무리 해야할까 봅니다.
gef, emf, gmf나 좀더 다양한 것들을 교육해보는것도 좋겠습니다만.. 아쉽다면 아쉽네요.
(사실 이런 부분은 제가 교육을 받아야겟다도 싶습니다 -_-;; ㅋㅋ)
월요일, 5월 26, 2008
SWT 첫날 교육 자료 및 진행
아래 게시물처럼 1주일동안 교육을 해야한다.
월 : SWT 기본
참여인원 3명
PT 자료는
http://www.zikal.com/swt/SWT_TUTORIAL.ppt과 ,
위젯 설명은
http://www.eclipse.org/swt/widgets/
를 사용하여 2시간 정도 기본 이론교육을 하였다.
교육 후에 곧바로 실습.

위와 같은 기본 검색 화면 후 상세 조회화면을 만들어보는 예제를 만들어 보도록 하였다.
회사에서 현재 사용하는 Eclipse 3.3, 3.2를 사용하였고, SWT Designer, VE를 사용하여 개발하도록 하였다.
중간 중간 예제 http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm과 현재 개발된 코드를 보여주었고, layout등은 틈틈히 설명하였다.
위의 예제 소스는 5시간 정도니 마무리 까지 될수 있었다.
마지막에 전체 Widget을 살펴보는 의미로다가 http://www.ibm.com/developerworks/kr/library/os-swingswt/index.html 를 보려고했으니..
내일은 RCP를 교육을 해야하는데, 사실 좀 난감..
어디서 부터 bundle부터 해야하나 싶기도하고...
하루종일 말했더니, 진이 빠진듯한 느낌이 든다. 역시 말하는 건 너무 힘들다는...
월 : SWT 기본
참여인원 3명
PT 자료는
http://www.zikal.com/swt/SWT_TUTORIAL.ppt과 ,
위젯 설명은
http://www.eclipse.org/swt/widgets/
를 사용하여 2시간 정도 기본 이론교육을 하였다.
교육 후에 곧바로 실습.

위와 같은 기본 검색 화면 후 상세 조회화면을 만들어보는 예제를 만들어 보도록 하였다.
회사에서 현재 사용하는 Eclipse 3.3, 3.2를 사용하였고, SWT Designer, VE를 사용하여 개발하도록 하였다.
중간 중간 예제 http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm과 현재 개발된 코드를 보여주었고, layout등은 틈틈히 설명하였다.
위의 예제 소스는 5시간 정도니 마무리 까지 될수 있었다.
마지막에 전체 Widget을 살펴보는 의미로다가 http://www.ibm.com/developerworks/kr/library/os-swingswt/index.html 를 보려고했으니..
내일은 RCP를 교육을 해야하는데, 사실 좀 난감..
어디서 부터 bundle부터 해야하나 싶기도하고...
하루종일 말했더니, 진이 빠진듯한 느낌이 든다. 역시 말하는 건 너무 힘들다는...
일요일, 5월 25, 2008
SWT -> RCP PPT만들기
이번주 부터 자바는 알지만, RCP, SWT, PLUG-IN 등을 전혀 모르는 분과 1주일을 보내야합니다.
위의 기술은 어느정도 정리해 주는것을 목표로 하고, 더 나가서 몇개정도의 VIEW를 만들어 보는 것을 목표로 해야겠습니다.
어느 분은 rcp개발을 한 달 동안 마스터 하시겟다는 분 혹은 팀 회사도 있다고 들었는데..
개인적으로는 사실상 무리 일듯해요.
좋은 강사가와서 사내교육 및 파일럿을 한달동안 하고 그 개인이 노력하여 해맨 다음에 가능하겠지요.
이렇게 시작한 프로젝트가, 보통 설계가 엉망인 경우를 종종 봐 왔습니다.
차라리 한달 더 시간을 갖고 준비하여 제품을 개바해야하지 않을까 싶습니다.
예전 부터 자바를 해 왔더라도(보통 WEB 프로그램) SWT, RCP등을 해오지 않았으면, 처음부터 새롭게 시작한다는 생각으로 개발해야 할 것입니다. 보통 classpath잡는 것부터 전혀 틀리지요.
차라리, 이렇게 한달잡고 시작한 자바 개발자보다 c나 다른언어를 개발했던 개발자들의 배움의 속도 밎 성숙도가 높지 않을까'라고 조심스럽게 짐작합니다. 이렇게 보통 자바 개발과는 좀 많이 다르다는 것 이지요. 적어도 RCP, plug-in은 말입니다.
서버와 데이터를 주고 받는 메커니즘이 근본적으로 틀리고, 프로그램하는 근본 메커니즘을 이해하고 프로그램을 하는 분들이 많지 않는것도 또 다른 이유라 하겠습니다. 간단한 http protocol을 구현해서 서블릿 컨테이너 파일럿정도는 구현할수 있어야하는데, 이렇게 구현할수 있는 사람이 얼마나 될까 싶습니다... 사담이 너무 길었네요...
SWT나 PLUG-IN, RCP 기본 피티 자료를 만들어야 하는데.. 만들기는 사실 늦었고, 다른 분이 많들어 놓은 좋은 자료로, 진행을 해야 할까 봅니다.
SWT Home
대부분 가장 양,질에 가장 좋은 자료는 사이트 홈인듯합니다.
http://www.eclipse.org/swt/docs.php
역시나 ibm의 자료가 눈에 띄구요.
아래쪽에 보면 Getting Started with Eclipse and SWT 다음과 같은 자료도 있네요.
Eclipse RCP 자료
http://wiki.eclipse.org/index.php/Rich_Client_Platform
역시나 PPT 자료는 너무 잘 만들듯 하네요.
기존에 SWING, AWT를 했던 분이 SWT와 비교해 놓은 자료도 발견 했지요.
http://www.ibm.com/developerworks/kr/library/os-swingswt/index.html
(사실 저도 잘 몰랐는데, 위의 자료를 보니 정리가 되는 느낌이에요)
위의 기술은 어느정도 정리해 주는것을 목표로 하고, 더 나가서 몇개정도의 VIEW를 만들어 보는 것을 목표로 해야겠습니다.
어느 분은 rcp개발을 한 달 동안 마스터 하시겟다는 분 혹은 팀 회사도 있다고 들었는데..
개인적으로는 사실상 무리 일듯해요.
좋은 강사가와서 사내교육 및 파일럿을 한달동안 하고 그 개인이 노력하여 해맨 다음에 가능하겠지요.
이렇게 시작한 프로젝트가, 보통 설계가 엉망인 경우를 종종 봐 왔습니다.
차라리 한달 더 시간을 갖고 준비하여 제품을 개바해야하지 않을까 싶습니다.
예전 부터 자바를 해 왔더라도(보통 WEB 프로그램) SWT, RCP등을 해오지 않았으면, 처음부터 새롭게 시작한다는 생각으로 개발해야 할 것입니다. 보통 classpath잡는 것부터 전혀 틀리지요.
차라리, 이렇게 한달잡고 시작한 자바 개발자보다 c나 다른언어를 개발했던 개발자들의 배움의 속도 밎 성숙도가 높지 않을까'라고 조심스럽게 짐작합니다. 이렇게 보통 자바 개발과는 좀 많이 다르다는 것 이지요. 적어도 RCP, plug-in은 말입니다.
서버와 데이터를 주고 받는 메커니즘이 근본적으로 틀리고, 프로그램하는 근본 메커니즘을 이해하고 프로그램을 하는 분들이 많지 않는것도 또 다른 이유라 하겠습니다. 간단한 http protocol을 구현해서 서블릿 컨테이너 파일럿정도는 구현할수 있어야하는데, 이렇게 구현할수 있는 사람이 얼마나 될까 싶습니다... 사담이 너무 길었네요...
SWT나 PLUG-IN, RCP 기본 피티 자료를 만들어야 하는데.. 만들기는 사실 늦었고, 다른 분이 많들어 놓은 좋은 자료로, 진행을 해야 할까 봅니다.
SWT Home
대부분 가장 양,질에 가장 좋은 자료는 사이트 홈인듯합니다.
http://www.eclipse.org/swt/docs.php
역시나 ibm의 자료가 눈에 띄구요.
아래쪽에 보면 Getting Started with Eclipse and SWT 다음과 같은 자료도 있네요.
Eclipse RCP 자료
http://wiki.eclipse.org/index.php/Rich_Client_Platform
역시나 PPT 자료는 너무 잘 만들듯 하네요.
기존에 SWING, AWT를 했던 분이 SWT와 비교해 놓은 자료도 발견 했지요.
http://www.ibm.com/developerworks/kr/library/os-swingswt/index.html
(사실 저도 잘 몰랐는데, 위의 자료를 보니 정리가 되는 느낌이에요)
목요일, 5월 22, 2008
오랫만(?)에 집에서 쉬고있네요. ^^
이리저리 기사를 보다, 노전 대통령의 소고기 수입에대한 입장을 보게 되었는데요.
http://blog.naver.com/beachboys7/140051610483
그 분의 소신과 입장에 존경을 표하고 싶어지네요.
이명박 대통령이 이끌고 있는 이 나라에서 적어도
소고기, 대운하, 의료보험 민영화, 각종 민영화, 부동산 버블등의 일들이
더 이상 일어나지 않았으면 좋겟어요.
요새는 부동산 하나 없는 저도, 살 엄음판 걷는 기분이에요
저도, 그분이 그립네요.
이리저리 기사를 보다, 노전 대통령의 소고기 수입에대한 입장을 보게 되었는데요.
http://blog.naver.com/beachboys7/140051610483
그 분의 소신과 입장에 존경을 표하고 싶어지네요.
이명박 대통령이 이끌고 있는 이 나라에서 적어도
소고기, 대운하, 의료보험 민영화, 각종 민영화, 부동산 버블등의 일들이
더 이상 일어나지 않았으면 좋겟어요.
요새는 부동산 하나 없는 저도, 살 엄음판 걷는 기분이에요
저도, 그분이 그립네요.
수요일, 5월 21, 2008
Development Conventions and Guidelines
Eclipse에는 Development Conventions and Guidelines라인이 있다
(http://wiki.eclipse.org/Development_Conventions_and_Guidelines)
종류로는
.Naming Conventions - How to name things like packages, classes, and methods
.Coding Conventions - How to make Java code readable
.Javadoc - How to write documentation comments, especially for API
.User Interface Guidelines - How to achieve user interface consistency
.Version Numbering - How to evolve plug-in version numbers
나머지는 일반적인 개발환경에서 흔히 보는 것들이겟다.
Version Numbering도 좀 특이한가?????
흔히 디자이너의 영역이기도 한 User Interface Guidelines 는 개발자 입장에서 좀 살펴 보아야 한다.
----------------------
오늘 디자인 업체와 이야기 하는 중 User Interface Guidelines 문서를 알려주는데, 오버인가도 싶고....
RCP, plug-in 개발자라면 그냥 슬쩍 지나가게라도 읽어볼만 하지 않을까?

(http://wiki.eclipse.org/Development_Conventions_and_Guidelines)
종류로는
.Naming Conventions - How to name things like packages, classes, and methods
.Coding Conventions - How to make Java code readable
.Javadoc - How to write documentation comments, especially for API
.User Interface Guidelines - How to achieve user interface consistency
.Version Numbering - How to evolve plug-in version numbers
나머지는 일반적인 개발환경에서 흔히 보는 것들이겟다.
Version Numbering도 좀 특이한가?????
흔히 디자이너의 영역이기도 한 User Interface Guidelines 는 개발자 입장에서 좀 살펴 보아야 한다.
----------------------
오늘 디자인 업체와 이야기 하는 중 User Interface Guidelines 문서를 알려주는데, 오버인가도 싶고....
RCP, plug-in 개발자라면 그냥 슬쩍 지나가게라도 읽어볼만 하지 않을까?

화요일, 5월 20, 2008
Vocabulary plug 1.1.0 빌드

아래 있는 것 처럼 하지 않았지만,
크게 신규단어 추가와 export 기능을 추가해서 빌드 했습니다.
--;;
안본지 몇달 지낫으니.. 또 힘드러지네요.
다운로드 <http://cafe.naver.com/eclipseplugin/2323>
Vocabulary plug 1.1.0 오늘 완성 목표
Why so downcast
이러다 GEF, EMF, JET등 기존에 알았던(?) 것 다 잊어버릴듯해서
http://www.vogella.de/articles/EclipseEMF/article.html
자료를 보고있다.
이어폰에서 들려오는 노래가 흥미롭다.
Why so downcast oh my soul
Put you hope in God
http://www.vogella.de/articles/EclipseEMF/article.html
자료를 보고있다.
이어폰에서 들려오는 노래가 흥미롭다.
Why so downcast oh my soul
Put you hope in God
월요일, 5월 19, 2008
일요일, 5월 18, 2008
민이와 이야기 중에 나에 대한 몇가지 오해가 있는 듯하고 해서 2년반정도 나의 회사 이야기를 해보고자 한다.
지난 2년 반 동안 회사, 프리, 알바를 대략 지금까지 6군데 정도 다닌듯 합니다.
그 6곳중 월급 밀린 곳이 3군데 정도 이며, 아직도 2군데서는 월급을 못 받았습니다.
노동부에도 찾아가서 받았던 경험이 있으니, 또 가야할지도 모릅니다.
2년 반동안 6곳이나 옮겼으면, 좀 심하게 많이 옮긴건 사실인듯 합니다.
회사를 옮길라 치면, 이런 저의 경력이 문제가 됩니다. -..-;;
그러면 사람들은 묻습니다.
'나름 회사를 옮길때 조심하지 않았냐고 묻습니다.'
흐흠.. 흐흠.. 이지요.
이런 나를 사람을 뽑는 입장이라면 문제라면 문제가 되겠지요.
나라도 사람을 뽑을라 치면, 색안경을 쓸수 밖에 없는듯 합니다.
그리고, 나는 상상해보게 됩니다. 혹은, 직업을 바꿔 볼까도 생각해 봅니다.
몇몇 친한 분들과 하던 농담 처럼, 신발가게나 차려야 하는 거 아니냐구요.
왠지, 나름의 이유가 많음에도 불구하고, 나에대한 색안경이 부담스럽고 싫습니다.
강한넘이 이기는 세상이 아니라, 살아가기(?) 때문에 이기는 세상이 되었으면 좋겠습니다.
'민아 알바일 있음 줘라. 점때 말했던 것보다 많이 깍아도 된다야~ 내가 밥은 사꾸마!~
'
ps)
1) 사실 진즉에 이런글을 쓰고 싶었지만, 쪽팔려서 못썼는데..
이런것도 나의 기록이고, 허접한 인스톨이니, resource bundle이런 것보다 좋은듯..
2) 외국에 가서 일할 만 곳 있음 연락좀 주세요.(물런 영어 못하고, 가족과 함께 가야 합니다) - 많이 힘들겠지요.
지난 2년 반 동안 회사, 프리, 알바를 대략 지금까지 6군데 정도 다닌듯 합니다.
그 6곳중 월급 밀린 곳이 3군데 정도 이며, 아직도 2군데서는 월급을 못 받았습니다.
노동부에도 찾아가서 받았던 경험이 있으니, 또 가야할지도 모릅니다.
2년 반동안 6곳이나 옮겼으면, 좀 심하게 많이 옮긴건 사실인듯 합니다.
회사를 옮길라 치면, 이런 저의 경력이 문제가 됩니다. -..-;;
그러면 사람들은 묻습니다.
'나름 회사를 옮길때 조심하지 않았냐고 묻습니다.'
흐흠.. 흐흠.. 이지요.
이런 나를 사람을 뽑는 입장이라면 문제라면 문제가 되겠지요.
나라도 사람을 뽑을라 치면, 색안경을 쓸수 밖에 없는듯 합니다.
그리고, 나는 상상해보게 됩니다. 혹은, 직업을 바꿔 볼까도 생각해 봅니다.
몇몇 친한 분들과 하던 농담 처럼, 신발가게나 차려야 하는 거 아니냐구요.
왠지, 나름의 이유가 많음에도 불구하고, 나에대한 색안경이 부담스럽고 싫습니다.
강한넘이 이기는 세상이 아니라, 살아가기(?) 때문에 이기는 세상이 되었으면 좋겠습니다.
'민아 알바일 있음 줘라. 점때 말했던 것보다 많이 깍아도 된다야~ 내가 밥은 사꾸마!~
'
ps)
1) 사실 진즉에 이런글을 쓰고 싶었지만, 쪽팔려서 못썼는데..
이런것도 나의 기록이고, 허접한 인스톨이니, resource bundle이런 것보다 좋은듯..
2) 외국에 가서 일할 만 곳 있음 연락좀 주세요.(물런 영어 못하고, 가족과 함께 가야 합니다) - 많이 힘들겠지요.
토요일, 5월 17, 2008
ResourceBundle 정의하기

언어별로 제품을 팩킹하려다 보니 각 언어별로 파일을 만들어서 작업해야한다.
그럼, 각 언어별로 번역하는것은 문제가 안되겟지만(사실 이것도 좀... -..-;;)
예를 들어서, window vista를 '창 조망'이라고 원도우 시작때 보여진다면, 대략.. -;;
물런 보는 시각에 따라 다르겟지만,
그래서 몇 가지 규칙을 만들었다.
1) 레이블 이름, 텍스트 이름, 제품 이름등의 용어에 관련된 부분은 다 영어로 통일 한다.
레이블 이름이 모두 영어로 하더라도 properties 파일로 빼도록 한다.
한국어는 어색하지만, 중국어나 다른언어는 더 좋아할수도 있으므로....
2) tooltip, alert 메시지, 도움말등은 각 언어로 만들도록 한다.
다 알겠지만, product 만들때는 eclipse에서 정의하는 방식이 있으므로 그것을 기준으로 따라 가도록 한다

사용하는 플러그인은 : ResourceBundle Editor Plug-in 0.75 버전을 사용중이다
목요일, 5월 15, 2008
자바 응용어플리 케이션 만들기
요사이 나는 Eclipse RCP로 응용 application 을 만들고 있다.
자바로 응용 application을 만드는 방법에는(모바일쪽은 모르므로 패스)
전통적으로 sun에서 만들수 있도록한 swing, NetBean 으로는 NetBean RCP등으로 만들수 있다.

<요건 swing으로 만든 모습이다. 좀 투박하고...>
sun 이외의 다른 진영에서는 Eclipse에서는 SWT, Eclipse RCP로 응용 어플리케이션을 만들수 잇겠다.

<요건 Eclipse 모습이다. 이쁘고 멋지고.. >
그래서 어떤걸 요새 더 많이 쓰냐고 묻는다면, sun의 표준 스펙 swing을 무시할수 없으므로 아직까지는 swing으로 만들어진 응용 어플리케이션이 많다.
물런 일부 선입관을 가지신 분들의 부정적인 시각이 많기는 하지만, 생각하는 것만큼 부정적이지 않다고 나는 단언하고 싶다.(jdk 1.6인 지금 시점에서는 더욱 더)
요새 새로운 주류는 Eclipse에서 나온 SWT나 RCP가 되겟다.
적어도 우리나라에서는 rcp나 swt가 좀더 인기를 끄는건 분명하고, 만드는것도 rcp나 swt의 빈도가 높은듯 하다
.
swt는 swing을 개발했던 사람이라면 거의 거부감없이 적응할수 있을것이고(JFace, Draw2D...가 있긴하지만..)
Eclipse rcp, plug-in은 swt를 알고 있는 상태에서 이 기술을 배우는 시간이 적어도 2개월정도는 되야 할듯하다.
물런 GEF, EMF, GMF, JET 요런건 빼고다. 다들 프레임웍이므로 사용하는 법을 알아야 한다.
더 주저리 써야할 말이 많은데.. 음
여튼 이렇게 개발하면 배포는 주로 java web start를 사용해서 배포하게 된다.
물런 안그럴수도 있겠지만...
swing인 경우는 update도 web start를 통해 진행해주면 되겟고, rcp나 plug-in인 경우는 update site(???)를 만들면 되겟다.
아효, 이 날림 글.. 다음은 web쪽 개발을.. 더..
자바로 응용 application을 만드는 방법에는(모바일쪽은 모르므로 패스)
전통적으로 sun에서 만들수 있도록한 swing, NetBean 으로는 NetBean RCP등으로 만들수 있다.

<요건 swing으로 만든 모습이다. 좀 투박하고...>
sun 이외의 다른 진영에서는 Eclipse에서는 SWT, Eclipse RCP로 응용 어플리케이션을 만들수 잇겠다.

<요건 Eclipse 모습이다. 이쁘고 멋지고.. >
그래서 어떤걸 요새 더 많이 쓰냐고 묻는다면, sun의 표준 스펙 swing을 무시할수 없으므로 아직까지는 swing으로 만들어진 응용 어플리케이션이 많다.
물런 일부 선입관을 가지신 분들의 부정적인 시각이 많기는 하지만, 생각하는 것만큼 부정적이지 않다고 나는 단언하고 싶다.(jdk 1.6인 지금 시점에서는 더욱 더)
요새 새로운 주류는 Eclipse에서 나온 SWT나 RCP가 되겟다.
적어도 우리나라에서는 rcp나 swt가 좀더 인기를 끄는건 분명하고, 만드는것도 rcp나 swt의 빈도가 높은듯 하다
.
swt는 swing을 개발했던 사람이라면 거의 거부감없이 적응할수 있을것이고(JFace, Draw2D...가 있긴하지만..)
Eclipse rcp, plug-in은 swt를 알고 있는 상태에서 이 기술을 배우는 시간이 적어도 2개월정도는 되야 할듯하다.
물런 GEF, EMF, GMF, JET 요런건 빼고다. 다들 프레임웍이므로 사용하는 법을 알아야 한다.
더 주저리 써야할 말이 많은데.. 음
여튼 이렇게 개발하면 배포는 주로 java web start를 사용해서 배포하게 된다.
물런 안그럴수도 있겠지만...
swing인 경우는 update도 web start를 통해 진행해주면 되겟고, rcp나 plug-in인 경우는 update site(???)를 만들면 되겟다.
아효, 이 날림 글.. 다음은 web쪽 개발을.. 더..
토요일, 5월 10, 2008
burn out
엇그제 bong bong 이에게 burn out에 대해 이야기를 들었다
주변에 몇명이 그런 이야기를 하고 있으며, 나도 역시나 그런 기미가 오래 전부터 보였기에...
별로 새삼 스럽진 않지만, 봉봉이는 아직 학생이고..
좋은 프로그래머가 될수 있다는 생각이었는데.. 벌써 부터 그런생각을 하다니 아쉽거나..
혼나야 하는 그런 시기인데...
혼나긴 보다, 개발의 아푼 상황을 격고 있기에 모라 변명을 못하겟다.
분석 설계하고 코딩하고 테스트하고 이런 일련의 작업은 재미있다.
타버리기 전까지 만 일하고 회복할수 있는 직업이 되었으면...
주변에 몇명이 그런 이야기를 하고 있으며, 나도 역시나 그런 기미가 오래 전부터 보였기에...
별로 새삼 스럽진 않지만, 봉봉이는 아직 학생이고..
좋은 프로그래머가 될수 있다는 생각이었는데.. 벌써 부터 그런생각을 하다니 아쉽거나..
혼나야 하는 그런 시기인데...
혼나긴 보다, 개발의 아푼 상황을 격고 있기에 모라 변명을 못하겟다.
분석 설계하고 코딩하고 테스트하고 이런 일련의 작업은 재미있다.
타버리기 전까지 만 일하고 회복할수 있는 직업이 되었으면...
금요일, 5월 09, 2008
InstallFactory를 이용한 배포

자바로 개발한 어플리케이션을 배포하려면 보통 java webstart를 이용하거나
혹은 InstallFactory로 인스톨 본을 만들어서 배포한다.
InstallFactory로 배포판을 만들어서 배포하려면 JRE를 함께 배포해야하는데,
여기서 몇가지 문제가 발생한다.
jre를 시스템 패스에 걸어주어야 하는 부담이 존재한다. InstallFactory에는 이 기능이 미약해서, 위와 같이 jre를 인스톨할수있도록 첨부했다.
끙.. 누군가 코멘트 해주지 않으므로 올바른 것인지도 잘 모르겟다는...
테스터들의 의견은 괸찮은듯 하니.. =고고싱...
수요일, 5월 07, 2008
Visual Editor, SWT Designer사용시.. 팁

Eclipse RCP로 view나 edit만들때 혹은 기타 에디터를 사용하여 개발할때 팁입니다.
(참고로 현재는 SWT Designer로 작업중입니다)
디자인을 도와주는 툴이 고마운건 직관적이고 빠르게 디자인 가능하게 해준다는 겁니다. 그래서 사용하구요.
근데, 원래 AView.java가 view라고 가정하고 코딩하다 보면, view이외의 업무가 붙으면서 지저분 해지기 마련입니다.
이런 저런 덕지 덕지 코드 붙고, 그러다 보면 어느 순간 위에서 디자인했던 ve와 코드 싱크가 맞지 않아서 더이상 디자이너의 도움을 받지 못할때가 있습니다. 흠..
여기서 쓰는 방법인데..
디자인은 일단 정상적인 방법으로 디자인합니다. 그리고 업무코드가 들어가는 부분은
public class AViewExtends extend AView {
...
}
이런 식으로 사용하는 겁니다.
이런 단순한 상속과 재활용을 생각 안하다니... aop이런걸알면 모한~~~~
초짜 한금씨~~
흠.. 정봉씨가 사용하는 방법인데.. 나름 view와 control을 어느정도 분리하여서 좋고 ve도 싱크 맞아서 좋구요.
괸찮은 방법가틉니다.
개인적으로 2000년 부터 계속 거의 자바를 사용해서 일을 해왔다.
물런 중간에 딱한번 c#으로 개발을 했지만, 그때도 swing도 함께 개발하며 병행했어야 했다.
물런, 내가 java가 최고이고 최강이다라고 이야기하는것도 아니고 밥먹고 살아야할 어쩔수 없는 선택이었다. -.0;;
이런 내가 visual basic, crystal report로 나의 모양을 바꾸어야 할 일이 발생할지도 모르겟다.
그러면서, 개발이라는 것은 똑같지만, 언어가 바뀌고 플렛폼이 바뀌게 된다.
그래서 ms의 개발 방향 흐름을 알고 싶어졌으나.... 어디를 어캐 찾아봐야 할지 모르겟다.
물런 zdnet이나 기타 매채를 통해 접근 할수 있지만, 가끔 그것은 꿈에 가까운 이야기 이기 때문에.. 나는 현업에서 잘 사용하는 그런 정보를 얻고 싶은 것이다.
그래서, 그동안 자바(?) 진영에 있으면서 내가 개발했던 환경을 틈틈히 써보고자 한다.
누군가는 도움이 될지도 모르니....
난 2002년부터는 계속 eclipse라는 걸 써왔다. web programing을 하던, stand application을 만들던.. 자바로 무슨 짖을 하던 eclipse을 사용했다.
to be continue...
물런 중간에 딱한번 c#으로 개발을 했지만, 그때도 swing도 함께 개발하며 병행했어야 했다.
물런, 내가 java가 최고이고 최강이다라고 이야기하는것도 아니고 밥먹고 살아야할 어쩔수 없는 선택이었다. -.0;;
이런 내가 visual basic, crystal report로 나의 모양을 바꾸어야 할 일이 발생할지도 모르겟다.
그러면서, 개발이라는 것은 똑같지만, 언어가 바뀌고 플렛폼이 바뀌게 된다.
그래서 ms의 개발 방향 흐름을 알고 싶어졌으나.... 어디를 어캐 찾아봐야 할지 모르겟다.
물런 zdnet이나 기타 매채를 통해 접근 할수 있지만, 가끔 그것은 꿈에 가까운 이야기 이기 때문에.. 나는 현업에서 잘 사용하는 그런 정보를 얻고 싶은 것이다.
그래서, 그동안 자바(?) 진영에 있으면서 내가 개발했던 환경을 틈틈히 써보고자 한다.
누군가는 도움이 될지도 모르니....
난 2002년부터는 계속 eclipse라는 걸 써왔다. web programing을 하던, stand application을 만들던.. 자바로 무슨 짖을 하던 eclipse을 사용했다.
to be continue...
금요일, 5월 02, 2008
헉, 내 블로그를 구경 오는 사람들은 누굴까? 궁금해지는데..
도대체 누구세요? 들..
하루에 70번이나 누군가 다녀갔는데..
물런 내가 나의 블로그를 몇명에게 알려주긴했지만.. 그래도 상당히 오버된 숫자다.
??????????????????????????????????????????????
??????????????????????????????????????????????
??????????????????????????????????????????????
??????????????????????????????????????????????
??????????????????????????????????????????????
여튼 쌩큐.. 합니다.
아 bcel의 sample은 ClassLoader을 약간 수정하고, 동적으로 호출된 클래스 목록을 뽑아보고 실행 시켜 보는 것으로 예제를 마무리 해야하지 않을까 싶습니다.
아니면, 더 좋은 아이디가 있으시면 그걸로...
아니면, 좀더 그럴싸한 제품 내지는 보시는 분의 모시기가 있으면 그걸로 만들어 보도록 하겠습니다.
도대체 누구세요? 들..
하루에 70번이나 누군가 다녀갔는데..
물런 내가 나의 블로그를 몇명에게 알려주긴했지만.. 그래도 상당히 오버된 숫자다.
??????????????????????????????????????????????
??????????????????????????????????????????????
??????????????????????????????????????????????
??????????????????????????????????????????????
??????????????????????????????????????????????
여튼 쌩큐.. 합니다.
아 bcel의 sample은 ClassLoader을 약간 수정하고, 동적으로 호출된 클래스 목록을 뽑아보고 실행 시켜 보는 것으로 예제를 마무리 해야하지 않을까 싶습니다.
아니면, 더 좋은 아이디가 있으시면 그걸로...
아니면, 좀더 그럴싸한 제품 내지는 보시는 분의 모시기가 있으면 그걸로 만들어 보도록 하겠습니다.
월요일, 4월 28, 2008
개발 추억 되집기
(http://hangumkj.blogspot.com/2005/10/blog-post_18.html)
오늘 다른 일로 위의 날자에 개발한 은행 담당자와 전화 통화를 했습니다.
아직도 같은 팀에 있었으며, 팀원이었으나 팀장이 되어 있었습니다.
그때 개발한 결과물을 잘 사용하고 있냐고 조심 스럽게 물었습니다.

혹여 삽질해서 내가 개발한 프레임웍을 엎어 버렸으면....
혹은 항상 에러에 문제로 고민거리 산출물이면 어떨까 싶어서.. 내심 걱정스럽게...
담당자와 통화 하였고, 그때 내가 개발한 결과물에 더해, 그때 보다 두배가 넘는 보고서를 출력하고 있으며, 유지보수 계약도 안맺고 직접 수정하고 있다 하였습니다.
(사실 동적으로 보고서를 추가삭제하고, 동적으로 모시기 해주는 기능이 많은 아이라, 사용법이 복잡해 내심 걱정했습니다.)
거기다 사용해보니 아주 잘된 프레임웍이라고 아주 고맙다고 아주 잘 쓰고 있다고 합니다.
(물런, 상투적일수도 있겠습니다만)
내심 걱정하고 전화했는데.. '고맙다'는 이야기를 들으니..
ㅎㅎ
오늘 다른 일로 위의 날자에 개발한 은행 담당자와 전화 통화를 했습니다.
아직도 같은 팀에 있었으며, 팀원이었으나 팀장이 되어 있었습니다.
그때 개발한 결과물을 잘 사용하고 있냐고 조심 스럽게 물었습니다.

혹여 삽질해서 내가 개발한 프레임웍을 엎어 버렸으면....
혹은 항상 에러에 문제로 고민거리 산출물이면 어떨까 싶어서.. 내심 걱정스럽게...
담당자와 통화 하였고, 그때 내가 개발한 결과물에 더해, 그때 보다 두배가 넘는 보고서를 출력하고 있으며, 유지보수 계약도 안맺고 직접 수정하고 있다 하였습니다.
(사실 동적으로 보고서를 추가삭제하고, 동적으로 모시기 해주는 기능이 많은 아이라, 사용법이 복잡해 내심 걱정했습니다.)
거기다 사용해보니 아주 잘된 프레임웍이라고 아주 고맙다고 아주 잘 쓰고 있다고 합니다.
(물런, 상투적일수도 있겠습니다만)
내심 걱정하고 전화했는데.. '고맙다'는 이야기를 들으니..
ㅎㅎ
라이센스, 제품에 대하여...
개발이 거의 마무리 되어 제품의 '라이센스', '제품에대하여'를 작성해야 합니다.
그러다 이런 이야기에 대해 잼이있게 읽었던 알탱이 알집의 제품에 대하여를 읽고 있습니다.
몇년전에 읽었을때는 그냥 재미있기만 했는데, 지금은 몬가 느껴지는 듯 합니다.
베타버전에 대하여도 그렇고, 무료 라이센스에 대한 이야기도 그렇습니다.
사용자가 원하는 제품을 빌드하는 것은 어렵긴 어려운 모양 입니다.
이런 일을 할때마다 좀더 노력해야지 하지만, 천천히 편안함을 추구하고 싶습니다.
사실 경제적인 부분과 어느정도 나의 시간이 보장된다면 다시한번 힘을 내보고 싶기는 합니다.
살짝만요.
그러다 이런 이야기에 대해 잼이있게 읽었던 알탱이 알집의 제품에 대하여를 읽고 있습니다.
몇년전에 읽었을때는 그냥 재미있기만 했는데, 지금은 몬가 느껴지는 듯 합니다.
베타버전에 대하여도 그렇고, 무료 라이센스에 대한 이야기도 그렇습니다.
사용자가 원하는 제품을 빌드하는 것은 어렵긴 어려운 모양 입니다.
이런 일을 할때마다 좀더 노력해야지 하지만, 천천히 편안함을 추구하고 싶습니다.
사실 경제적인 부분과 어느정도 나의 시간이 보장된다면 다시한번 힘을 내보고 싶기는 합니다.
살짝만요.
화요일, 4월 22, 2008
bcel을 사용하여 메소드 내용삭제
/**
* 이번 3번째 예제에서는 클래스 메소드 삭제를 해보도록 하겠습니다.
*
* 이번 예제에서는 TestAppendMethodBuild에서 만들었던 TestAppend 클래스의 메소드 private static void
* appendMethod(String str)의 내용을 삭제하는 예제를 만들어 보도록 하겠다.
*
* 3번재 예제에서야 조금 bcel의 면목을 보는듯 하다.
* 사실 위의 예제도 상속을 사용하면 정상적으로 수정가능하겠으나, 지금까지는 예제를 만들고 있으므로 이해해주시기를....
*
* 그럼, 본격적인 예제를 만들어보도록 하자.
*
* 프로그램을 실행하고 난 다음에는 다음과 같은 결과를 예상할 수 있다.
*
* public class TestAppend {
* private static void appendMethod(String str) {
* }
*
* public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str);
* appendMethod(str);
* }
* }
*
* 이 예제가 끝나면 TestAppend 예제의 main 메소드를 수정하는 예제를 만들어 보도록 하겠다.
package com.test;
import com.sun.org.apache.bcel.internal.classfile.ClassParser;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.Method;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.Instruction;
import com.sun.org.apache.bcel.internal.generic.InstructionHandle;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.MethodGen;
/**
* 이번 3번째 예제에서는 클래스 메소드 삭제를 해보도록 하겠습니다.
*
* 이번 예제에서는 TestAppendMethodBuild에서 만들었던 TestAppend 클래스의 메소드 private static void
* appendMethod(String str)의 내용을 삭제하는 예제를 만들어 보도록 하겠다.
*
* 3번재 예제에서야 조금 bcel의 면목을 보는듯 하다.
* 사실 위의 예제도 상속을 사용하면 정상적으로 수정가능하겠으나, 지금까지는 예제를 만들고 있으므로 이해해주시기를....
*
* 그럼, 본격적인 예제를 만들어보도록 하자.
*
* 프로그램을 실행하고 난 다음에는 다음과 같은 결과를 예상할 수 있다.
*
public class TestAppend {
* private static void appendMethod(String str) {
* }
*
* public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str);
* appendMethod(str);
* }
* }
* 이 예제가 끝나면 TestAppend 예제의 main 메소드를 수정하는 예제를 만들어 보도록 하겠다.
*
* @author hangum
*
*/
public class TestDeleteMethodBuilder {
static String orgClassName = "build/TestAppend.class";
/**
* @param args
*/
public static void main(String[] args) {
// 해당 클래스를 불러온다.
JavaClass classz = null;
try {
classz = new ClassParser(orgClassName).parse();
} catch (Exception e) {
System.out.println(orgClassName + "가 존재 하지 않습니다.");
System.exit(0);
}
Method[] methods = classz.getMethods();
ConstantPoolGen cp = new ConstantPoolGen(classz.getConstantPool());
for (int i = 0; i < methods.length; i++) {
MethodGen mg = new MethodGen(methods[i], classz.getClassName(), cp);
// appendMethod delete
if("appendMethod".equals(methods[i].getName())) {
System.out.println(" ### [작업 method name] " + mg.getName() + " [Signature] " + methods[i].getSignature());
InstructionList il = mg.getInstructionList();
InstructionHandle[] ih = il.getInstructionHandles();
for(int j=0; j < ih.length; j++) {
Instruction inst = ih[j].getInstruction();
try {
if(!"return".equals(inst.getName())) il.delete(inst);
} catch(Exception e) {
System.out.println("==> error rise on [name] " + inst.getName() + " [message] " + e.getMessage());
e.printStackTrace();
}
}
methods[i] = mg.getMethod();
il.dispose();
}
} // end for
/*
* Dump the class to "class name"_.class
*/
String dumpClassName = "c:/temp/" + classz.getClassName() + ".class";
try {
classz.setConstantPool(cp.getFinalConstantPool());
classz.dump(dumpClassName);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("== 종료했습니다.");
}
}
* 이번 3번째 예제에서는 클래스 메소드 삭제를 해보도록 하겠습니다.
*
* 이번 예제에서는 TestAppendMethodBuild에서 만들었던 TestAppend 클래스의 메소드 private static void
* appendMethod(String str)의 내용을 삭제하는 예제를 만들어 보도록 하겠다.
*
* 3번재 예제에서야 조금 bcel의 면목을 보는듯 하다.
* 사실 위의 예제도 상속을 사용하면 정상적으로 수정가능하겠으나, 지금까지는 예제를 만들고 있으므로 이해해주시기를....
*
* 그럼, 본격적인 예제를 만들어보도록 하자.
*
* 프로그램을 실행하고 난 다음에는 다음과 같은 결과를 예상할 수 있다.
*
* public class TestAppend {
* private static void appendMethod(String str) {
* }
*
* public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str);
* appendMethod(str);
* }
* }
*
* 이 예제가 끝나면 TestAppend 예제의 main 메소드를 수정하는 예제를 만들어 보도록 하겠다.
package com.test;
import com.sun.org.apache.bcel.internal.classfile.ClassParser;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.Method;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.Instruction;
import com.sun.org.apache.bcel.internal.generic.InstructionHandle;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.MethodGen;
/**
* 이번 3번째 예제에서는 클래스 메소드 삭제를 해보도록 하겠습니다.
*
* 이번 예제에서는 TestAppendMethodBuild에서 만들었던 TestAppend 클래스의 메소드 private static void
* appendMethod(String str)의 내용을 삭제하는 예제를 만들어 보도록 하겠다.
*
* 3번재 예제에서야 조금 bcel의 면목을 보는듯 하다.
* 사실 위의 예제도 상속을 사용하면 정상적으로 수정가능하겠으나, 지금까지는 예제를 만들고 있으므로 이해해주시기를....
*
* 그럼, 본격적인 예제를 만들어보도록 하자.
*
* 프로그램을 실행하고 난 다음에는 다음과 같은 결과를 예상할 수 있다.
*
public class TestAppend {
* private static void appendMethod(String str) {
* }
*
* public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str);
* appendMethod(str);
* }
* }
* 이 예제가 끝나면 TestAppend 예제의 main 메소드를 수정하는 예제를 만들어 보도록 하겠다.
*
* @author hangum
*
*/
public class TestDeleteMethodBuilder {
static String orgClassName = "build/TestAppend.class";
/**
* @param args
*/
public static void main(String[] args) {
// 해당 클래스를 불러온다.
JavaClass classz = null;
try {
classz = new ClassParser(orgClassName).parse();
} catch (Exception e) {
System.out.println(orgClassName + "가 존재 하지 않습니다.");
System.exit(0);
}
Method[] methods = classz.getMethods();
ConstantPoolGen cp = new ConstantPoolGen(classz.getConstantPool());
for (int i = 0; i < methods.length; i++) {
MethodGen mg = new MethodGen(methods[i], classz.getClassName(), cp);
// appendMethod delete
if("appendMethod".equals(methods[i].getName())) {
System.out.println(" ### [작업 method name] " + mg.getName() + " [Signature] " + methods[i].getSignature());
InstructionList il = mg.getInstructionList();
InstructionHandle[] ih = il.getInstructionHandles();
for(int j=0; j < ih.length; j++) {
Instruction inst = ih[j].getInstruction();
try {
if(!"return".equals(inst.getName())) il.delete(inst);
} catch(Exception e) {
System.out.println("==> error rise on [name] " + inst.getName() + " [message] " + e.getMessage());
e.printStackTrace();
}
}
methods[i] = mg.getMethod();
il.dispose();
}
} // end for
/*
* Dump the class to "class name"_.class
*/
String dumpClassName = "c:/temp/" + classz.getClassName() + ".class";
try {
classz.setConstantPool(cp.getFinalConstantPool());
classz.dump(dumpClassName);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("== 종료했습니다.");
}
}
bcel을 사용하여 메소드 내용삭제
/**
* 이번 3번째 예제에서는 클래스 메소드 삭제를 해보도록 하겠습니다.
*
* 이번 예제에서는 TestAppendMethodBuild에서 만들었던 TestAppend 클래스의 메소드 private static void
* appendMethod(String str)의 내용을 삭제하는 예제를 만들어 보도록 하겠다.
*
* 3번재 예제에서야 조금 bcel의 면목을 보는듯 하다.
* 사실 위의 예제도 상속을 사용하면 정상적으로 수정가능하겠으나, 지금까지는 예제를 만들고 있으므로 이해해주시기를....
*
* 그럼, 본격적인 예제를 만들어보도록 하자.
*
* 프로그램을 실행하고 난 다음에는 다음과 같은 결과를 예상할 수 있다.
*
* public class TestAppend {
* private static void appendMethod(String str) {
* }
*
* public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str);
* appendMethod(str);
* }
* }
*
* 이 예제가 끝나면 TestAppend 예제의 main 메소드를 수정하는 예제를 만들어 보도록 하겠다.
package com.test;
import com.sun.org.apache.bcel.internal.classfile.ClassParser;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.Method;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.Instruction;
import com.sun.org.apache.bcel.internal.generic.InstructionHandle;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.MethodGen;
/**
* 이번 3번째 예제에서는 클래스 메소드 삭제를 해보도록 하겠습니다.
*
* 이번 예제에서는 TestAppendMethodBuild에서 만들었던 TestAppend 클래스의 메소드 private static void
* appendMethod(String str)의 내용을 삭제하는 예제를 만들어 보도록 하겠다.
*
* 3번재 예제에서야 조금 bcel의 면목을 보는듯 하다.
* 사실 위의 예제도 상속을 사용하면 정상적으로 수정가능하겠으나, 지금까지는 예제를 만들고 있으므로 이해해주시기를....
*
* 그럼, 본격적인 예제를 만들어보도록 하자.
*
* 프로그램을 실행하고 난 다음에는 다음과 같은 결과를 예상할 수 있다.
*
* public class TestAppend {
* private static void appendMethod(String str) {
* }
*
* public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str);
* appendMethod(str);
* }
* }
*
* 이 예제가 끝나면 TestAppend 예제의 main 메소드를 수정하는 예제를 만들어 보도록 하겠다.
*
* @author hangum
*
*/
public class TestDeleteMethodBuilder {
static String orgClassName = "build/TestAppend.class";
/**
* @param args
*/
public static void main(String[] args) {
// 해당 클래스를 불러온다.
JavaClass classz = null;
try {
classz = new ClassParser(orgClassName).parse();
} catch (Exception e) {
System.out.println(orgClassName + "가 존재 하지 않습니다.");
System.exit(0);
}
Method[] methods = classz.getMethods();
ConstantPoolGen cp = new ConstantPoolGen(classz.getConstantPool());
for (int i = 0; i < methods.length; i++) {
MethodGen mg = new MethodGen(methods[i], classz.getClassName(), cp);
// appendMethod delete
if("appendMethod".equals(methods[i].getName())) {
System.out.println(" ### [작업 method name] " + mg.getName() + " [Signature] " + methods[i].getSignature());
InstructionList il = mg.getInstructionList();
InstructionHandle[] ih = il.getInstructionHandles();
for(int j=0; j < ih.length; j++) {
Instruction inst = ih[j].getInstruction();
try {
if(!"return".equals(inst.getName())) il.delete(inst);
} catch(Exception e) {
System.out.println("==> error rise on [name] " + inst.getName() + " [message] " + e.getMessage());
e.printStackTrace();
}
}
methods[i] = mg.getMethod();
il.dispose();
}
} // end for
/*
* Dump the class to "class name"_.class
*/
String dumpClassName = "c:/temp/" + classz.getClassName() + ".class";
try {
classz.setConstantPool(cp.getFinalConstantPool());
classz.dump(dumpClassName);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("== 종료했습니다.");
}
}
* 이번 3번째 예제에서는 클래스 메소드 삭제를 해보도록 하겠습니다.
*
* 이번 예제에서는 TestAppendMethodBuild에서 만들었던 TestAppend 클래스의 메소드 private static void
* appendMethod(String str)의 내용을 삭제하는 예제를 만들어 보도록 하겠다.
*
* 3번재 예제에서야 조금 bcel의 면목을 보는듯 하다.
* 사실 위의 예제도 상속을 사용하면 정상적으로 수정가능하겠으나, 지금까지는 예제를 만들고 있으므로 이해해주시기를....
*
* 그럼, 본격적인 예제를 만들어보도록 하자.
*
* 프로그램을 실행하고 난 다음에는 다음과 같은 결과를 예상할 수 있다.
*
* public class TestAppend {
* private static void appendMethod(String str) {
* }
*
* public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str);
* appendMethod(str);
* }
* }
*
* 이 예제가 끝나면 TestAppend 예제의 main 메소드를 수정하는 예제를 만들어 보도록 하겠다.
package com.test;
import com.sun.org.apache.bcel.internal.classfile.ClassParser;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
import com.sun.org.apache.bcel.internal.classfile.Method;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.Instruction;
import com.sun.org.apache.bcel.internal.generic.InstructionHandle;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.MethodGen;
/**
* 이번 3번째 예제에서는 클래스 메소드 삭제를 해보도록 하겠습니다.
*
* 이번 예제에서는 TestAppendMethodBuild에서 만들었던 TestAppend 클래스의 메소드 private static void
* appendMethod(String str)의 내용을 삭제하는 예제를 만들어 보도록 하겠다.
*
* 3번재 예제에서야 조금 bcel의 면목을 보는듯 하다.
* 사실 위의 예제도 상속을 사용하면 정상적으로 수정가능하겠으나, 지금까지는 예제를 만들고 있으므로 이해해주시기를....
*
* 그럼, 본격적인 예제를 만들어보도록 하자.
*
* 프로그램을 실행하고 난 다음에는 다음과 같은 결과를 예상할 수 있다.
*
* public class TestAppend {
* private static void appendMethod(String str) {
* }
*
* public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str);
* appendMethod(str);
* }
* }
*
* 이 예제가 끝나면 TestAppend 예제의 main 메소드를 수정하는 예제를 만들어 보도록 하겠다.
*
* @author hangum
*
*/
public class TestDeleteMethodBuilder {
static String orgClassName = "build/TestAppend.class";
/**
* @param args
*/
public static void main(String[] args) {
// 해당 클래스를 불러온다.
JavaClass classz = null;
try {
classz = new ClassParser(orgClassName).parse();
} catch (Exception e) {
System.out.println(orgClassName + "가 존재 하지 않습니다.");
System.exit(0);
}
Method[] methods = classz.getMethods();
ConstantPoolGen cp = new ConstantPoolGen(classz.getConstantPool());
for (int i = 0; i < methods.length; i++) {
MethodGen mg = new MethodGen(methods[i], classz.getClassName(), cp);
// appendMethod delete
if("appendMethod".equals(methods[i].getName())) {
System.out.println(" ### [작업 method name] " + mg.getName() + " [Signature] " + methods[i].getSignature());
InstructionList il = mg.getInstructionList();
InstructionHandle[] ih = il.getInstructionHandles();
for(int j=0; j < ih.length; j++) {
Instruction inst = ih[j].getInstruction();
try {
if(!"return".equals(inst.getName())) il.delete(inst);
} catch(Exception e) {
System.out.println("==> error rise on [name] " + inst.getName() + " [message] " + e.getMessage());
e.printStackTrace();
}
}
methods[i] = mg.getMethod();
il.dispose();
}
} // end for
/*
* Dump the class to "class name"_.class
*/
String dumpClassName = "c:/temp/" + classz.getClassName() + ".class";
try {
classz.setConstantPool(cp.getFinalConstantPool());
classz.dump(dumpClassName);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("== 종료했습니다.");
}
}
일요일, 4월 20, 2008
bcel 셈플을 만들어서 블로그에 공개하고 있는데, 흠 사실 예제야 모 어찌 저찌 해서 고생하면 다 만들수 있는 문제일수도 있다.
사실은 bcel을 사용하여 jvm의 기본 원리 및 구조를 파악하는 것이 먼저 이겠으나, 흠냐리 봐야할거 좀 많다. jvm spec을 어느정도는 알고 있어야 가능하겠다.
SUN 공식 JVM SPEC 책
http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html
JVM SPEC 책
http://www.artima.com/insidejvm/ed2/jvm.html
BCEL 홈
http://jakarta.apache.org/bcel/manual.html
ASM 홈
http://asm.objectweb.org/
BCEL을 어느정도 보신 분이라면 알겠지만, 자료가 너무 부족하다. 나는 약간 미완성인듯한 느낌까지 받았다.
ASM 경우는 ECLIPSE PLUG-IN이 있는데, 이것도 많이 유용하다 하겠습니다.
이름은 Bytecode Outline이고 http://andrei.gmxhome.de/bytecode/index.html입니다.
이런거 저런거 귀찮다면 자바에디터로 eclipse를 사용하실텐데 f3를 눌러보시면 된다.
물런 이런 코드를 처음에는 보기 어렵겠지만, 위의 문서를 어느정도 본다면 눈에 차차 들어 올테니.. 도움이 될것이다.
셈플 만드는 작업이 끝나면 어떤 모양으로든 다른 분들에게 도움이 되는 것을 만들어보도록 하겠습니다.
좋은 아이디어 있는 분 말씀해주세요
사실은 bcel을 사용하여 jvm의 기본 원리 및 구조를 파악하는 것이 먼저 이겠으나, 흠냐리 봐야할거 좀 많다. jvm spec을 어느정도는 알고 있어야 가능하겠다.
SUN 공식 JVM SPEC 책
http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html
JVM SPEC 책
http://www.artima.com/insidejvm/ed2/jvm.html
BCEL 홈
http://jakarta.apache.org/bcel/manual.html
ASM 홈
http://asm.objectweb.org/
BCEL을 어느정도 보신 분이라면 알겠지만, 자료가 너무 부족하다. 나는 약간 미완성인듯한 느낌까지 받았다.
ASM 경우는 ECLIPSE PLUG-IN이 있는데, 이것도 많이 유용하다 하겠습니다.
이름은 Bytecode Outline이고 http://andrei.gmxhome.de/bytecode/index.html입니다.
이런거 저런거 귀찮다면 자바에디터로 eclipse를 사용하실텐데 f3를 눌러보시면 된다.
물런 이런 코드를 처음에는 보기 어렵겠지만, 위의 문서를 어느정도 본다면 눈에 차차 들어 올테니.. 도움이 될것이다.
셈플 만드는 작업이 끝나면 어떤 모양으로든 다른 분들에게 도움이 되는 것을 만들어보도록 하겠습니다.
좋은 아이디어 있는 분 말씀해주세요
bcel 두번째 sample
미력하나마 두번째 예제 소스 입니다.
처음 예제는 bcel을 사용하여 기본 Test코드를 생성 하였다면 두번째 예제는
그 예제에 간단한 메소드 하나를 추가하는 것으로 예제를 만들어 보도록 하겠습니다.
아래 보시면 알겠지만 appendMethod(str)을 추가한것이고 private static 으로 시작하는 메소드가 추가 되어 있습니다.
참고로 sun jdk 1.6을 사용했고, apache에 있는 bcel 5.2와 같은 것으로 생각됩니다
* public class TestAppend {
* public static void main(String[] args) {
* System.out.println("BCEL Start...");
*
* String str = "..test bcel..."; *
* System.out.println("Str Value " + str);
*
* appendMethod(str);
* }
*
* private static void appendMethod(String str) {
* System.out.println("appendMethod value is " + str);
* }
* }
bcel로 다음과 같은 소스를 만들어 보겠습니다.
package com.test;
import java.io.IOException;
import org.apache.bcel.verifier.structurals.LocalVariables;
import com.sun.org.apache.bcel.internal.Constants;
import com.sun.org.apache.bcel.internal.generic.ALOAD;
import com.sun.org.apache.bcel.internal.generic.ASTORE;
import com.sun.org.apache.bcel.internal.generic.ArrayType;
import com.sun.org.apache.bcel.internal.generic.ClassGen;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.INVOKESTATIC;
import com.sun.org.apache.bcel.internal.generic.InstructionConstants;
import com.sun.org.apache.bcel.internal.generic.InstructionFactory;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.LocalVariableGen;
import com.sun.org.apache.bcel.internal.generic.MethodGen;
import com.sun.org.apache.bcel.internal.generic.ObjectType;
import com.sun.org.apache.bcel.internal.generic.PUSH;
import com.sun.org.apache.bcel.internal.generic.Type;
/**
* jdk 1.6에 있는 것으로..
*
* 이번 것은 메소드를 추가한다.
*
* public class Test {
* public static void main(String[] args) {
* System.out.println("BCEL Start...");
*
* String str = "..test bcel..."; *
* System.out.println("Str Value " + str);
*
* appendMethod(str);
* }
*
* private static void appendMethod(String str) {
* System.out.println("appendMethod value is " + str);
* }
* }
*
* @author hangum
*
*/
public class TestAppendMethodBuilder {
/**
* method를 추가한다
*
* @param cg ClassGen
* @param msg mag index
*/
public static void appendMethod(ClassGen cg) {
InstructionList il = new InstructionList();
MethodGen mg = new MethodGen(
Constants.ACC_STATIC | Constants.ACC_PRIVATE,
Type.VOID,
new Type[]{ Type.STRING },
new String[]{ "str" },
"appendMethod",
"TestAppend",
il,
cg.getConstantPool()
);
InstructionFactory factory = new InstructionFactory(cg);
il.append(
factory.createFieldAccess(
"java.lang.System",
"out",
new ObjectType("java.io.PrintStream"),
Constants.GETSTATIC)
);
// variable setting
LocalVariableGen[] arLvg = mg.getLocalVariables();
il.append(new ALOAD(arLvg[0].getIndex()));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(InstructionConstants.RETURN);
mg.setMaxStack();
cg.addMethod(mg.getMethod());
}
/**
*
* @param args
*/
public static void main(String[] args) {
System.out.println("== 작업을 시작했습니다. ");
ClassGen cg = new ClassGen("TestAppend", // class name
"java.lang.Object", // super class
"",
Constants.ACC_PUBLIC | Constants.ACC_SUPER,
null);
ConstantPoolGen cp = cg.getConstantPool();
InstructionList il = new InstructionList();
// method 생성
MethodGen mg = new MethodGen(
Constants.ACC_STATIC | Constants.ACC_PUBLIC,
Type.VOID,
new Type[] {
new ArrayType(Type.STRING, 1)
},
new String[] { "args" },
"main",
"TestAppend",
il,
cp);
InstructionFactory factory = new InstructionFactory(cg);
ObjectType p_stream = new ObjectType("java.io.PrintStream");
il.append(factory.createFieldAccess("java.lang.System", "out",
p_stream, Constants.GETSTATIC));
il.append(new PUSH(cp, "BCEL Start..."));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
// 변수 str 생성
LocalVariableGen lvgStr = mg.addLocalVariable("str", Type.STRING, null,
null);
int str = lvgStr.getIndex();
il.append(new PUSH(cp, "..test bcel..."));
lvgStr.setStart(il.append(new ASTORE(str)));
// str Value + str
il.append(factory.createFieldAccess("java.lang.System", "out",
p_stream, Constants.GETSTATIC));
il.append(factory.createNew(Type.STRINGBUFFER));
il.append(InstructionConstants.DUP);
il.append(new PUSH(cp, "Str Value, "));
il.append(factory.createInvoke("java.lang.StringBuffer",
"", Type.VOID, new Type[] { Type.STRING },
Constants.INVOKESPECIAL));
il.append(new ALOAD(str));
il.append(factory.createInvoke("java.lang.StringBuffer", "append",
Type.STRINGBUFFER, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.lang.StringBuffer", "toString",
Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
// method 추가하고 호출하는 코드를 삽입한다
appendMethod(cg);
il.append(new ALOAD(str));
int appendMethod = cp.addMethodref("TestAppend", "appendMethod", "(Ljava/lang/String;)V");
il.append(new INVOKESTATIC(appendMethod));
// return void
il.append(InstructionConstants.RETURN);
mg.setMaxStack();
cg.addMethod(mg.getMethod());
il.dispose();
// construct
cg.addEmptyConstructor(Constants.ACC_PUBLIC);
// 파일생성
try {
cg.getJavaClass().dump("build/TestAppend.class");
} catch (IOException ioe) {
ioe.printStackTrace();
}
System.out.println("== 작업을 끝냈습니다.");
}
}
처음 예제는 bcel을 사용하여 기본 Test코드를 생성 하였다면 두번째 예제는
그 예제에 간단한 메소드 하나를 추가하는 것으로 예제를 만들어 보도록 하겠습니다.
아래 보시면 알겠지만 appendMethod(str)을 추가한것이고 private static 으로 시작하는 메소드가 추가 되어 있습니다.
참고로 sun jdk 1.6을 사용했고, apache에 있는 bcel 5.2와 같은 것으로 생각됩니다
* public class TestAppend {
* public static void main(String[] args) {
* System.out.println("BCEL Start...");
*
* String str = "..test bcel..."; *
* System.out.println("Str Value " + str);
*
* appendMethod(str);
* }
*
* private static void appendMethod(String str) {
* System.out.println("appendMethod value is " + str);
* }
* }
bcel로 다음과 같은 소스를 만들어 보겠습니다.
package com.test;
import java.io.IOException;
import org.apache.bcel.verifier.structurals.LocalVariables;
import com.sun.org.apache.bcel.internal.Constants;
import com.sun.org.apache.bcel.internal.generic.ALOAD;
import com.sun.org.apache.bcel.internal.generic.ASTORE;
import com.sun.org.apache.bcel.internal.generic.ArrayType;
import com.sun.org.apache.bcel.internal.generic.ClassGen;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.INVOKESTATIC;
import com.sun.org.apache.bcel.internal.generic.InstructionConstants;
import com.sun.org.apache.bcel.internal.generic.InstructionFactory;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.LocalVariableGen;
import com.sun.org.apache.bcel.internal.generic.MethodGen;
import com.sun.org.apache.bcel.internal.generic.ObjectType;
import com.sun.org.apache.bcel.internal.generic.PUSH;
import com.sun.org.apache.bcel.internal.generic.Type;
/**
* jdk 1.6에 있는 것으로..
*
* 이번 것은 메소드를 추가한다.
*
* public class Test {
* public static void main(String[] args) {
* System.out.println("BCEL Start...");
*
* String str = "..test bcel..."; *
* System.out.println("Str Value " + str);
*
* appendMethod(str);
* }
*
* private static void appendMethod(String str) {
* System.out.println("appendMethod value is " + str);
* }
* }
*
* @author hangum
*
*/
public class TestAppendMethodBuilder {
/**
* method를 추가한다
*
* @param cg ClassGen
* @param msg mag index
*/
public static void appendMethod(ClassGen cg) {
InstructionList il = new InstructionList();
MethodGen mg = new MethodGen(
Constants.ACC_STATIC | Constants.ACC_PRIVATE,
Type.VOID,
new Type[]{ Type.STRING },
new String[]{ "str" },
"appendMethod",
"TestAppend",
il,
cg.getConstantPool()
);
InstructionFactory factory = new InstructionFactory(cg);
il.append(
factory.createFieldAccess(
"java.lang.System",
"out",
new ObjectType("java.io.PrintStream"),
Constants.GETSTATIC)
);
// variable setting
LocalVariableGen[] arLvg = mg.getLocalVariables();
il.append(new ALOAD(arLvg[0].getIndex()));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(InstructionConstants.RETURN);
mg.setMaxStack();
cg.addMethod(mg.getMethod());
}
/**
*
* @param args
*/
public static void main(String[] args) {
System.out.println("== 작업을 시작했습니다. ");
ClassGen cg = new ClassGen("TestAppend", // class name
"java.lang.Object", // super class
"",
Constants.ACC_PUBLIC | Constants.ACC_SUPER,
null);
ConstantPoolGen cp = cg.getConstantPool();
InstructionList il = new InstructionList();
// method 생성
MethodGen mg = new MethodGen(
Constants.ACC_STATIC | Constants.ACC_PUBLIC,
Type.VOID,
new Type[] {
new ArrayType(Type.STRING, 1)
},
new String[] { "args" },
"main",
"TestAppend",
il,
cp);
InstructionFactory factory = new InstructionFactory(cg);
ObjectType p_stream = new ObjectType("java.io.PrintStream");
il.append(factory.createFieldAccess("java.lang.System", "out",
p_stream, Constants.GETSTATIC));
il.append(new PUSH(cp, "BCEL Start..."));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
// 변수 str 생성
LocalVariableGen lvgStr = mg.addLocalVariable("str", Type.STRING, null,
null);
int str = lvgStr.getIndex();
il.append(new PUSH(cp, "..test bcel..."));
lvgStr.setStart(il.append(new ASTORE(str)));
// str Value + str
il.append(factory.createFieldAccess("java.lang.System", "out",
p_stream, Constants.GETSTATIC));
il.append(factory.createNew(Type.STRINGBUFFER));
il.append(InstructionConstants.DUP);
il.append(new PUSH(cp, "Str Value, "));
il.append(factory.createInvoke("java.lang.StringBuffer",
"
Constants.INVOKESPECIAL));
il.append(new ALOAD(str));
il.append(factory.createInvoke("java.lang.StringBuffer", "append",
Type.STRINGBUFFER, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.lang.StringBuffer", "toString",
Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
// method 추가하고 호출하는 코드를 삽입한다
appendMethod(cg);
il.append(new ALOAD(str));
int appendMethod = cp.addMethodref("TestAppend", "appendMethod", "(Ljava/lang/String;)V");
il.append(new INVOKESTATIC(appendMethod));
// return void
il.append(InstructionConstants.RETURN);
mg.setMaxStack();
cg.addMethod(mg.getMethod());
il.dispose();
// construct
cg.addEmptyConstructor(Constants.ACC_PUBLIC);
// 파일생성
try {
cg.getJavaClass().dump("build/TestAppend.class");
} catch (IOException ioe) {
ioe.printStackTrace();
}
System.out.println("== 작업을 끝냈습니다.");
}
}
수요일, 4월 16, 2008
일요일, 4월 06, 2008
월요일, 3월 24, 2008
August Rush
August Rush를 보다 울어 버릴뻔 했다.
머리가 복잡하고, 집중 안될때 시간때우기 용 영화를 보려고..
이리저리 찾던중, .. 그냥 받아지던 영화였다.
으~~~ 보면서,.. 점점 빠져 드는게... 눈물이 나는듯하다.
이런~ 감동이다. 난 왜이럴까.. 아저씨가 되서도.. 눈물 타령이라니... 못할짖이다.
그렇지만, 어쩌랴... 나오는 눈물인것을,....
감동이다. 오호라 추천이다.
보실때는 이양이면 자신이 가지고 있는 가장 좋은 사운드 시스템으로 보시길 부탁드린다.
저는 오늘 엠프 주문해야겟어요
머리가 복잡하고, 집중 안될때 시간때우기 용 영화를 보려고..
이리저리 찾던중, .. 그냥 받아지던 영화였다.
으~~~ 보면서,.. 점점 빠져 드는게... 눈물이 나는듯하다.
이런~ 감동이다. 난 왜이럴까.. 아저씨가 되서도.. 눈물 타령이라니... 못할짖이다.
그렇지만, 어쩌랴... 나오는 눈물인것을,....
감동이다. 오호라 추천이다.
보실때는 이양이면 자신이 가지고 있는 가장 좋은 사운드 시스템으로 보시길 부탁드린다.
저는 오늘 엠프 주문해야겟어요
금요일, 3월 07, 2008
java collection 정리
일요일, 3월 02, 2008
피곤하다고 핑계되면서, 한동안 블로그에 블로그 짖을 못했다. --;;
요는 하고 싶었는데도 못했다는것이지.
요즘 하고 있는 일은 예전과 동일하다. --;;
다만, 좀 달라진 부분이있다면, 하루에 수십통의 전화를 감수해야하는정도.
순간 순간 걸려오는 전화와 버그로 인해 괴로운 정도.
이른반 plug-in 모듈로 인해 정신 없는 정도 이다.
몇개의 정도를 더 쓰고 싶지만, 여기서 그만해야 한다. 찌질이로 전락할수 있으므로..
3월부터 6월 말까지 분기계획서를 만들고 있다.
한정된 자원과 시간으로 기존제품 유지보수와 신제품에 대한 청사진을 만들어야한다.
신제품은 청사진 정도만 그친다면.. 결과는 상상하기 어렵기에...
현실성있는 안과, 회사의 정치적인 상황을 고려해야한다.
개인적으로 무엇보다 중요한것은 연구소 개발팀의 꿈을 만들어 가고싶은데, 역시나 이상은 현실에대해 참혹하다.
막내가 회사를 그만둔다고하여, 사직서에 사인을 해주었으고(누구 신체건강한 신입 추천 받습니다. 남녀구분 안합니다), 회사생활을 극치를 경험하고 있는 나 이기에, 당분간은 잘 견디는 것을 목표로 하고 싶다. --..-;; 이건 막가자는 이야기 인데... ㅋㅋ
이런, 희망적인 이야기를 하나도 못했네.
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
위에 불평한거 빼고 모든게 희망적인 이야기 입니다.
좀 특이한 사항은 온라인상에 q/a를 좀 했었는데, 엇그제 얼굴을 처음으로 봣다는...
많은 사람에게 q/a를 하지만, 고맙다고 인사듣기 힘든데, 오프에서까지 얼굴을 보니,
왠지 내가 고맙다는 생각이 들더군요.
요는 하고 싶었는데도 못했다는것이지.
요즘 하고 있는 일은 예전과 동일하다. --;;
다만, 좀 달라진 부분이있다면, 하루에 수십통의 전화를 감수해야하는정도.
순간 순간 걸려오는 전화와 버그로 인해 괴로운 정도.
이른반 plug-in 모듈로 인해 정신 없는 정도 이다.
몇개의 정도를 더 쓰고 싶지만, 여기서 그만해야 한다. 찌질이로 전락할수 있으므로..
3월부터 6월 말까지 분기계획서를 만들고 있다.
한정된 자원과 시간으로 기존제품 유지보수와 신제품에 대한 청사진을 만들어야한다.
신제품은 청사진 정도만 그친다면.. 결과는 상상하기 어렵기에...
현실성있는 안과, 회사의 정치적인 상황을 고려해야한다.
개인적으로 무엇보다 중요한것은 연구소 개발팀의 꿈을 만들어 가고싶은데, 역시나 이상은 현실에대해 참혹하다.
막내가 회사를 그만둔다고하여, 사직서에 사인을 해주었으고(누구 신체건강한 신입 추천 받습니다. 남녀구분 안합니다), 회사생활을 극치를 경험하고 있는 나 이기에, 당분간은 잘 견디는 것을 목표로 하고 싶다. --..-;; 이건 막가자는 이야기 인데... ㅋㅋ
이런, 희망적인 이야기를 하나도 못했네.
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
희망적인 이야기를
위에 불평한거 빼고 모든게 희망적인 이야기 입니다.
좀 특이한 사항은 온라인상에 q/a를 좀 했었는데, 엇그제 얼굴을 처음으로 봣다는...
많은 사람에게 q/a를 하지만, 고맙다고 인사듣기 힘든데, 오프에서까지 얼굴을 보니,
왠지 내가 고맙다는 생각이 들더군요.
목요일, 1월 31, 2008
코드 최적화
아래의 일반적인 코드를
Properties prop = System.getProperties();
Enumeration enums = prop.propertyNames();
while(enums.hasMoreElements()) {
String key = (String)enums.nextElement();
System.out.println("[key]" + key + "[value]" + prop.getProperty(key));
}
위의코드를 디컴파일 해보았다. 컴파일러는 다음과 같이 최적화 하였다.
Properties prop = System.getProperties();
String key;
for(Enumeration enums = prop.propertyNames();
enums.hasMoreElements();
System.out.println("[key]" + key + "[value]" + prop.getProperty(key)))
key = (String)enums.nextElement();
와 같이 된다.
그럼 다음과 같은 코드는 어떻게 되겠는가?
int i=0;
while(true) {
System.out.println("ahah");
if(i++ > 100) break;
}
다음과 같이 최적화된다.
int i = 0;
do
System.out.println("ahah");
while(i++ <= 100);
사람이 살작 빈틈있게 코드를 만들어도 컴파일러가 다음과 같이 최적화 해준다.
BCI 작업할때 참고해야겠으며 컴파일러의 자바 버전 별 최적화 패턴등도 어느정도는 정리를 해둬야겟다.
위의 최적화의 공통점은, while보다는 for문이, 두번 검사보다는 한번이, 반복문 내에 있는 변수는 밖으로 빼지 않았는가? 무심코 작성한 코드들이 전체 시스템에 얼마나 치명적인지...
최적화 하니 병아리 눈꼽만큼이겠지만, 모이면 큰 javac option -g:noe 옵션을 사용해볼만하다.
debugging info를 삭제하고 byte코드를 최적화 하는것이다.
또 다른 방법은 디컴파일 방지툴을 돌리는것도 하나의 방법이 되겟다. 보통 방지툴을 돌리면 클래스, 메소드,변수이름 자체를 a,b,c 이런식으로 만들어 버려서 결과적으로 바이트 코드 크기 자체가 줄어들게 되어서 jvm의 부담을 줄여주는 효과를 볼수 있게된다. 물런 이것 말고도, bci를 이용해서 줄여주는 방법이 있겠지만, 요새 같은 환경에서는 불필요한 과도한 환경이 되겟다.
시스템 튜닝하는데 가장먼저 손쉽게 할수 있는게 java option을 맟추는 것이라고, 어느 책에서 언급하였다는걸 세삼 실감한다.
Properties prop = System.getProperties();
Enumeration enums = prop.propertyNames();
while(enums.hasMoreElements()) {
String key = (String)enums.nextElement();
System.out.println("[key]" + key + "[value]" + prop.getProperty(key));
}
위의코드를 디컴파일 해보았다. 컴파일러는 다음과 같이 최적화 하였다.
Properties prop = System.getProperties();
String key;
for(Enumeration enums = prop.propertyNames();
enums.hasMoreElements();
System.out.println("[key]" + key + "[value]" + prop.getProperty(key)))
key = (String)enums.nextElement();
와 같이 된다.
그럼 다음과 같은 코드는 어떻게 되겠는가?
int i=0;
while(true) {
System.out.println("ahah");
if(i++ > 100) break;
}
다음과 같이 최적화된다.
int i = 0;
do
System.out.println("ahah");
while(i++ <= 100);
사람이 살작 빈틈있게 코드를 만들어도 컴파일러가 다음과 같이 최적화 해준다.
BCI 작업할때 참고해야겠으며 컴파일러의 자바 버전 별 최적화 패턴등도 어느정도는 정리를 해둬야겟다.
위의 최적화의 공통점은, while보다는 for문이, 두번 검사보다는 한번이, 반복문 내에 있는 변수는 밖으로 빼지 않았는가? 무심코 작성한 코드들이 전체 시스템에 얼마나 치명적인지...
최적화 하니 병아리 눈꼽만큼이겠지만, 모이면 큰 javac option -g:noe 옵션을 사용해볼만하다.
debugging info를 삭제하고 byte코드를 최적화 하는것이다.
또 다른 방법은 디컴파일 방지툴을 돌리는것도 하나의 방법이 되겟다. 보통 방지툴을 돌리면 클래스, 메소드,변수이름 자체를 a,b,c 이런식으로 만들어 버려서 결과적으로 바이트 코드 크기 자체가 줄어들게 되어서 jvm의 부담을 줄여주는 효과를 볼수 있게된다. 물런 이것 말고도, bci를 이용해서 줄여주는 방법이 있겠지만, 요새 같은 환경에서는 불필요한 과도한 환경이 되겟다.
시스템 튜닝하는데 가장먼저 손쉽게 할수 있는게 java option을 맟추는 것이라고, 어느 책에서 언급하였다는걸 세삼 실감한다.
월요일, 1월 28, 2008
몸살과 감기로 오늘 예배도 못 드리고.. 골골(?)하다.
작년부터 누나가 권해 읽고 있는 '하늘의언어'를 읽다가, 책에 나오는 최춘선 할아버지 이야기가 있어, 인터넷에 검색을 해보았다.
처음에는 도무지 알아먹지 못하는 말을 하시는 분이셨고, 이해되지 않는 말을 하시는 분이셨다.
흠... 동영상 4부 마지막을 볼때쯤 눈물이 난다.
사실 나이가 34살이 되고, 좀 아퍼서 인지..
여태껏 뭐했나 싶었는데...
여태껏 아무것도 못했는데, 앞으로도 무엇을 할수 있겠나 싶었는데...
그분이 30년동안 맨발로 복음을 전하며 돌아 다니셨다니...
적어도, 아직은 맨발로 돌아다닐 용기는 난다.
겸손함과 지혜위에 그분의 임재가 필요한게 맨발이려니,
내가 믿는 그분께 구해 보아야지.
인생을 고쳐 주시기를,
삶을 고쳐주시기를,
예수그리스도
작년부터 누나가 권해 읽고 있는 '하늘의언어'를 읽다가, 책에 나오는 최춘선 할아버지 이야기가 있어, 인터넷에 검색을 해보았다.
처음에는 도무지 알아먹지 못하는 말을 하시는 분이셨고, 이해되지 않는 말을 하시는 분이셨다.
흠... 동영상 4부 마지막을 볼때쯤 눈물이 난다.
사실 나이가 34살이 되고, 좀 아퍼서 인지..
여태껏 뭐했나 싶었는데...
여태껏 아무것도 못했는데, 앞으로도 무엇을 할수 있겠나 싶었는데...
그분이 30년동안 맨발로 복음을 전하며 돌아 다니셨다니...
적어도, 아직은 맨발로 돌아다닐 용기는 난다.
겸손함과 지혜위에 그분의 임재가 필요한게 맨발이려니,
내가 믿는 그분께 구해 보아야지.
인생을 고쳐 주시기를,
삶을 고쳐주시기를,
예수그리스도
목요일, 1월 24, 2008
입사후 처음으로 제품 build(Version 3.5.02.00)를 하였다.
제품번호도 마이너 버전업을 하였지...
비슷한 제품을 만드는 경쟁(?) 업체의 제품을 보자면, 살짝 짜증이...
정말 고민했구나... 기술과 사용자를 생각했구나..
이런 느낌이 드는 어플리케이션은 많지 않는데..
그런 생각이 드는걸 난들 어쩌나.
내가 버전업하는 나의 자식같은넘도 사용자들에게 그런 느낌을 주어야 하는데..
아직은 욕이나 들어먹고, 찬밥 신세에 더부 살이를 하고 있다니.. 눈물이 주르르다.
앞으로 좋아 지겟지..
입사후 계속 된 야근과 주말 출근으로.. 잠이 부족하다.
공부해야하는데..
이제야, 6년전 팀장님이 하셨던 말이 조금은 이해간다.
일하는곳 주변에 계신다는데.. 인사나 드리러 가봐야겟다.
제품번호도 마이너 버전업을 하였지...
비슷한 제품을 만드는 경쟁(?) 업체의 제품을 보자면, 살짝 짜증이...
정말 고민했구나... 기술과 사용자를 생각했구나..
이런 느낌이 드는 어플리케이션은 많지 않는데..
그런 생각이 드는걸 난들 어쩌나.
내가 버전업하는 나의 자식같은넘도 사용자들에게 그런 느낌을 주어야 하는데..
아직은 욕이나 들어먹고, 찬밥 신세에 더부 살이를 하고 있다니.. 눈물이 주르르다.
앞으로 좋아 지겟지..
입사후 계속 된 야근과 주말 출근으로.. 잠이 부족하다.
공부해야하는데..
이제야, 6년전 팀장님이 하셨던 말이 조금은 이해간다.
일하는곳 주변에 계신다는데.. 인사나 드리러 가봐야겟다.
일요일, 1월 13, 2008
토요일, 1월 12, 2008
BCEL Sample 코드
bcel 홈이나 다른 곳에서 예제가 너무나 빈곤하여 답답하던 차에
틈나는 대로 간단한 예제를 만들어 보기로 하였다.
우선 가장 간단하고 간단한 sample을 소개한다.
참고로 sun jdk 1.6을 사용했고, apache에 있는 bcel 5.2와 같은 것으로 생각됩니다.
public class Test {
public static void main(String[] args) {
System.out.println("BCEL Start...");
String str = "..test bcel...";
System.out.println("Str Value " + str);
}
}
와 같은 코드를 bcel로 만든다면 아래와 같다.
import java.io.IOException;
import com.sun.org.apache.bcel.internal.Constants;
import com.sun.org.apache.bcel.internal.generic.ALOAD;
import com.sun.org.apache.bcel.internal.generic.ASTORE;
import com.sun.org.apache.bcel.internal.generic.ArrayType;
import com.sun.org.apache.bcel.internal.generic.ClassGen;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.InstructionConstants;
import com.sun.org.apache.bcel.internal.generic.InstructionFactory;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.LocalVariableGen;
import com.sun.org.apache.bcel.internal.generic.MethodGen;
import com.sun.org.apache.bcel.internal.generic.ObjectType;
import com.sun.org.apache.bcel.internal.generic.PUSH;
import com.sun.org.apache.bcel.internal.generic.Type;
/**
* jdk 1.6에 있는 것으로
*
* public class Test { public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str); } }
*
* @author hangum
*
*/
public class TestBuilder {
public static void main(String[] args) {
System.out.println("== 작업을 시작했습니다. ");
ClassGen cg = new ClassGen("Test", // class name
"java.lang.Object", // super class
"",
Constants.ACC_PUBLIC | Constants.ACC_SUPER,
null);
ConstantPoolGen cp = cg.getConstantPool();
InstructionList il = new InstructionList();
// method 생성
MethodGen mg = new MethodGen(
Constants.ACC_STATIC | Constants.ACC_PUBLIC,
Type.VOID,
new Type[] {
new ArrayType(Type.STRING, 1)
},
new String[] { "args" },
"main",
"Test",
il,
cp);
InstructionFactory factory = new InstructionFactory(cg);
ObjectType p_stream = new ObjectType("java.io.PrintStream");
il.append(factory.createFieldAccess("java.lang.System", "out",
p_stream, Constants.GETSTATIC));
il.append(new PUSH(cp, "BCEL Start..."));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
// 변수 str 생성
LocalVariableGen lvgStr = mg.addLocalVariable("str", Type.STRING, null,
null);
int str = lvgStr.getIndex();
il.append(new PUSH(cp, "..test bcel..."));
lvgStr.setStart(il.append(new ASTORE(str)));
// str Value + str
il.append(factory.createFieldAccess("java.lang.System", "out",
p_stream, Constants.GETSTATIC));
il.append(factory.createNew(Type.STRINGBUFFER));
il.append(InstructionConstants.DUP);
il.append(new PUSH(cp, "Str Value, "));
il.append(factory.createInvoke("java.lang.StringBuffer",
"", Type.VOID, new Type[] { Type.STRING },
Constants.INVOKESPECIAL));
il.append(new ALOAD(str));
il.append(factory.createInvoke("java.lang.StringBuffer", "append",
Type.STRINGBUFFER, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.lang.StringBuffer", "toString",
Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(InstructionConstants.RETURN);
// return void
il.append(InstructionConstants.RETURN);
mg.setMaxStack();
cg.addMethod(mg.getMethod());
il.dispose();
// construct
cg.addEmptyConstructor(Constants.ACC_PUBLIC);
// 파일생성
try {
cg.getJavaClass().dump("build/Test.class");
} catch (IOException ioe) {
ioe.printStackTrace();
}
System.out.println("== 작업을 끝냈습니다.");
}
}
틈나는 대로 간단한 예제를 만들어 보기로 하였다.
우선 가장 간단하고 간단한 sample을 소개한다.
참고로 sun jdk 1.6을 사용했고, apache에 있는 bcel 5.2와 같은 것으로 생각됩니다.
public class Test {
public static void main(String[] args) {
System.out.println("BCEL Start...");
String str = "..test bcel...";
System.out.println("Str Value " + str);
}
}
와 같은 코드를 bcel로 만든다면 아래와 같다.
import java.io.IOException;
import com.sun.org.apache.bcel.internal.Constants;
import com.sun.org.apache.bcel.internal.generic.ALOAD;
import com.sun.org.apache.bcel.internal.generic.ASTORE;
import com.sun.org.apache.bcel.internal.generic.ArrayType;
import com.sun.org.apache.bcel.internal.generic.ClassGen;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.InstructionConstants;
import com.sun.org.apache.bcel.internal.generic.InstructionFactory;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.LocalVariableGen;
import com.sun.org.apache.bcel.internal.generic.MethodGen;
import com.sun.org.apache.bcel.internal.generic.ObjectType;
import com.sun.org.apache.bcel.internal.generic.PUSH;
import com.sun.org.apache.bcel.internal.generic.Type;
/**
* jdk 1.6에 있는 것으로
*
* public class Test { public static void main(String[] args) {
* System.out.println("BCEL Start..."); String str = "..test bcel...";
*
* System.out.println("Str Value " + str); } }
*
* @author hangum
*
*/
public class TestBuilder {
public static void main(String[] args) {
System.out.println("== 작업을 시작했습니다. ");
ClassGen cg = new ClassGen("Test", // class name
"java.lang.Object", // super class
"",
Constants.ACC_PUBLIC | Constants.ACC_SUPER,
null);
ConstantPoolGen cp = cg.getConstantPool();
InstructionList il = new InstructionList();
// method 생성
MethodGen mg = new MethodGen(
Constants.ACC_STATIC | Constants.ACC_PUBLIC,
Type.VOID,
new Type[] {
new ArrayType(Type.STRING, 1)
},
new String[] { "args" },
"main",
"Test",
il,
cp);
InstructionFactory factory = new InstructionFactory(cg);
ObjectType p_stream = new ObjectType("java.io.PrintStream");
il.append(factory.createFieldAccess("java.lang.System", "out",
p_stream, Constants.GETSTATIC));
il.append(new PUSH(cp, "BCEL Start..."));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
// 변수 str 생성
LocalVariableGen lvgStr = mg.addLocalVariable("str", Type.STRING, null,
null);
int str = lvgStr.getIndex();
il.append(new PUSH(cp, "..test bcel..."));
lvgStr.setStart(il.append(new ASTORE(str)));
// str Value + str
il.append(factory.createFieldAccess("java.lang.System", "out",
p_stream, Constants.GETSTATIC));
il.append(factory.createNew(Type.STRINGBUFFER));
il.append(InstructionConstants.DUP);
il.append(new PUSH(cp, "Str Value, "));
il.append(factory.createInvoke("java.lang.StringBuffer",
"
Constants.INVOKESPECIAL));
il.append(new ALOAD(str));
il.append(factory.createInvoke("java.lang.StringBuffer", "append",
Type.STRINGBUFFER, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.lang.StringBuffer", "toString",
Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
il.append(factory.createInvoke("java.io.PrintStream", "println",
Type.VOID, new Type[] { Type.STRING },
Constants.INVOKEVIRTUAL));
il.append(InstructionConstants.RETURN);
// return void
il.append(InstructionConstants.RETURN);
mg.setMaxStack();
cg.addMethod(mg.getMethod());
il.dispose();
// construct
cg.addEmptyConstructor(Constants.ACC_PUBLIC);
// 파일생성
try {
cg.getJavaClass().dump("build/Test.class");
} catch (IOException ioe) {
ioe.printStackTrace();
}
System.out.println("== 작업을 끝냈습니다.");
}
}
월요일, 1월 07, 2008
토요일, 12월 29, 2007
소스분석에 대한 고찰
누군가의 소스 분석하려면... 아무리 잘 만들어진 것이라 할지라도, 대략 난감하기 이를때 없다.
검색과 경험을 통해 몇가지 방안을 소개
- eclipse(eclipse.org)의 call hierarchy (ctrl + alt + h)
어디에서 자신을 호출 한것과 사용하는 리스트 보여줌.
- RSA(Rational Software Architech 7):
아시다 싶이 IBM에서 나온 Eclipse기반 개발 툴이지요. 역공학이 가능합니다. 좀더 설명하자면, visual 하게 class diagram을 볼수 있고, source와 diagram이 동기화 되고 클래스 전체 구조를 볼수 있어 좋은 듯 합니다. 하지만, 인스톨 하기 쉽지않고, 약간의 사전 지식이 있어야 사용할수 있습니다. 위에 있는 call hierarchy와 같이 사용하면 그나마 좀 수고를 덜 수 있습니다.
- doxgen(http://www.stack.nl/~dimitri/doxygen) : 문서가 없다면 문서를 만들어 주고 정리해 줍니다만, 소스 doc작업이 안되어 있다면 허당입니다. 소스상에 doc 작업이 되있다면 쉽게 해볼수 있는 작업이 되겠습니다. 소스에 주석을 안달려고 노력하신 분이 있다는 것에 한숨입니다만..
- Magnum1.26(http://blog.naver.com/joneyrio) : 인스톨없이 쉽게 사용하고 visual하게 보여줍니다. 잠깐 잠깐 몇개의 클래스 보기에는 괸찮은 툴로 생각됩니다. 위에있는 rsa처럼 막대한 기능은 없지만, 작은만큼 그때 그때 편하게 사용할 수 있을것으로 생각됩니다.
- mind map을 이용한 소스분석(http://blog.naver.com/mis8855?Redirect=Log&logNo=150016760089)
저도 이것을 사용합니다만, 이것 저것 기억하고 정리해야할 부분이 많은 것을 효과적으로 정리하게 해줍니다. 소스 분석에서도 예외는 아닙니다. 저는 mind manager pro 7.0을 사용하고 있습니다.
- 기타 상용툴이 있겠습니다만,.. 베타라도 사용해 보기 쉽지 않네요.
제가 사용하는 플러그인
- eclipse europa & myeclipse 6.0
- OOP와는 별로 친하지 않지만 현실세계의 영원한 큰 형님이신 ERD도 필수 이겠습니다.( http://www.azzurri.co.jp)
- java byte code 분석 밎 보기위해(bytecode outline plug-in)
- 버그검색 밎 일관성있는 관리를 위해(FindBugs Plug-in)
- decompile을 편하게 하기위한 jadclipse
- svn과 trac 연동을위한 플러그인들
- vocibulary plug-in
- Log4E가 빠졋네요
그 다음에 작업별 workspace(회사용1,2,3.., 공부workspace, project1,2)가 따로 존재하고, eclipse version도 같은 이유로 몇개(?) 존재합니다.
검색과 경험을 통해 몇가지 방안을 소개
- eclipse(eclipse.org)의 call hierarchy (ctrl + alt + h)
어디에서 자신을 호출 한것과 사용하는 리스트 보여줌.
- RSA(Rational Software Architech 7):
아시다 싶이 IBM에서 나온 Eclipse기반 개발 툴이지요. 역공학이 가능합니다. 좀더 설명하자면, visual 하게 class diagram을 볼수 있고, source와 diagram이 동기화 되고 클래스 전체 구조를 볼수 있어 좋은 듯 합니다. 하지만, 인스톨 하기 쉽지않고, 약간의 사전 지식이 있어야 사용할수 있습니다. 위에 있는 call hierarchy와 같이 사용하면 그나마 좀 수고를 덜 수 있습니다.
- doxgen(http://www.stack.nl/~dimitri/doxygen) : 문서가 없다면 문서를 만들어 주고 정리해 줍니다만, 소스 doc작업이 안되어 있다면 허당입니다. 소스상에 doc 작업이 되있다면 쉽게 해볼수 있는 작업이 되겠습니다. 소스에 주석을 안달려고 노력하신 분이 있다는 것에 한숨입니다만..
- Magnum1.26(http://blog.naver.com/joneyrio) : 인스톨없이 쉽게 사용하고 visual하게 보여줍니다. 잠깐 잠깐 몇개의 클래스 보기에는 괸찮은 툴로 생각됩니다. 위에있는 rsa처럼 막대한 기능은 없지만, 작은만큼 그때 그때 편하게 사용할 수 있을것으로 생각됩니다.
- mind map을 이용한 소스분석(http://blog.naver.com/mis8855?Redirect=Log&logNo=150016760089)
저도 이것을 사용합니다만, 이것 저것 기억하고 정리해야할 부분이 많은 것을 효과적으로 정리하게 해줍니다. 소스 분석에서도 예외는 아닙니다. 저는 mind manager pro 7.0을 사용하고 있습니다.
- 기타 상용툴이 있겠습니다만,.. 베타라도 사용해 보기 쉽지 않네요.
제가 사용하는 플러그인
- eclipse europa & myeclipse 6.0
- OOP와는 별로 친하지 않지만 현실세계의 영원한 큰 형님이신 ERD도 필수 이겠습니다.( http://www.azzurri.co.jp)
- java byte code 분석 밎 보기위해(bytecode outline plug-in)
- 버그검색 밎 일관성있는 관리를 위해(FindBugs Plug-in)
- decompile을 편하게 하기위한 jadclipse
- svn과 trac 연동을위한 플러그인들
- vocibulary plug-in
- Log4E가 빠졋네요
그 다음에 작업별 workspace(회사용1,2,3.., 공부workspace, project1,2)가 따로 존재하고, eclipse version도 같은 이유로 몇개(?) 존재합니다.
생각하기에 따라 가치가 다른 소프트웨어를 사용하고, 그 것을 만드는 직업을 갖고 있는 나 입니다.
사실, 소프트웨어의 가치는 내가 재미있고 즐기기 위한 것(게임, WORD, EXCEL등)과,
내가 불편한(날새기 삽질, 계산, 확인등 반복되는 작업, HTS, 온라인거래, 쇼핑, IOC, AOP, APM등)것들을 자동화 해주는 것들 때문에 사용하는 것 갖습니다.
그래서 나는 게으르기 때문에 이걸 만들었어.. 혹은 이걸 사용해 하는 사람을 볼수 있을 것 입니다.
게으르기 때문에 손이 한번 더 가는 작업을 한다는 것이지요.
역설적이긴 합니다만, 게으른 사람의 항변이 맞는 듯 합니다.
사실, 이클립스도 게으른 사람이 만들었다는 느낌이 듭니다. 각종 자동화 툴과 기능 팁들이 게으름을 대표하고 있습니다. 물런 사용하는 사람에 따라 틀리겟지만, 이클립스는 어느정도 게으른 자들의 결과물 이라고 생각해봅니다.
하지만, 게으른 사람을 위한 툴도 가끔은 부지런하게 만들어 버리는 사람들이 있습니다.
끙샤, 회사에서 부지런해야하는 것들을 좀더 게으르게 만들어야 겠습니다.
가정의 행복과 나 회사를 위해서...
더욱 게으르기위해 공부해야겟습니다.
사실, 소프트웨어의 가치는 내가 재미있고 즐기기 위한 것(게임, WORD, EXCEL등)과,
내가 불편한(날새기 삽질, 계산, 확인등 반복되는 작업, HTS, 온라인거래, 쇼핑, IOC, AOP, APM등)것들을 자동화 해주는 것들 때문에 사용하는 것 갖습니다.
그래서 나는 게으르기 때문에 이걸 만들었어.. 혹은 이걸 사용해 하는 사람을 볼수 있을 것 입니다.
게으르기 때문에 손이 한번 더 가는 작업을 한다는 것이지요.
역설적이긴 합니다만, 게으른 사람의 항변이 맞는 듯 합니다.
사실, 이클립스도 게으른 사람이 만들었다는 느낌이 듭니다. 각종 자동화 툴과 기능 팁들이 게으름을 대표하고 있습니다. 물런 사용하는 사람에 따라 틀리겟지만, 이클립스는 어느정도 게으른 자들의 결과물 이라고 생각해봅니다.
하지만, 게으른 사람을 위한 툴도 가끔은 부지런하게 만들어 버리는 사람들이 있습니다.
끙샤, 회사에서 부지런해야하는 것들을 좀더 게으르게 만들어야 겠습니다.
가정의 행복과 나 회사를 위해서...
더욱 게으르기위해 공부해야겟습니다.
수요일, 12월 26, 2007
토요일, 12월 15, 2007
오랫만에 그동안 자주(?) 못 가본 분들을 방문했다.
그렇다고 해봐야, 몇명 되지 않지만..
게시물을 읽고 있으면, 작아진다는...
오늘은 토비님 게시물 TheSpringExperience2007 첫날을 읽으면서, 2007년 초에 계획은 spring experience를 가보는 것과 책 번역을 한 권쯤 하는것이었는데.. 영어공부부터 좀더 하고.. 말을 하던지.. -,.-;;;
어느것 하나 하지 못했다는 것을 알게 되었다.
사실 유난히 일이 많아서 거의 미친 것 처럼 보낸 한해였다고 나름 위로 하지만...
끙~~~ 그건 너무 약하다는걸 내가 너무 잘 안다.
얼마 남지 않은 한해이지만, 다시 시작해야지~~
혹시 토비님 글을 읽지 못하셨으면, 읽어보시길 권합니다.
저는, 다시 책상에 앉아 영어공부 내지는 컴터를 부여잡게 되네요. BCEL 아..
성의없는 QCon San Francisco 2007 후기
TheSpringExperience2007 첫날
그렇다고 해봐야, 몇명 되지 않지만..
게시물을 읽고 있으면, 작아진다는...
오늘은 토비님 게시물 TheSpringExperience2007 첫날을 읽으면서, 2007년 초에 계획은 spring experience를 가보는 것과 책 번역을 한 권쯤 하는것이었는데.. 영어공부부터 좀더 하고.. 말을 하던지.. -,.-;;;
어느것 하나 하지 못했다는 것을 알게 되었다.
사실 유난히 일이 많아서 거의 미친 것 처럼 보낸 한해였다고 나름 위로 하지만...
끙~~~ 그건 너무 약하다는걸 내가 너무 잘 안다.
얼마 남지 않은 한해이지만, 다시 시작해야지~~
혹시 토비님 글을 읽지 못하셨으면, 읽어보시길 권합니다.
저는, 다시 책상에 앉아 영어공부 내지는 컴터를 부여잡게 되네요. BCEL 아..
성의없는 QCon San Francisco 2007 후기
TheSpringExperience2007 첫날
금요일, 12월 14, 2007
BCEL(Byte Code Engineering Library)
입사 3일째, BCEL(Byte Code Engineering Library)를 보고 있다.
class파일을 조작(수정, 삭제, 추가)가능하게 해주는 거란다.
평소에 해보지 않는거라, 복잡하고 어렵다. 처음에는 개념도 잘 안잡혔다는..
아직도 마찬 가지 이지만, 역시나 생각하기에 따라 가능성이 몇 천배될 놈인건 분명하다.
이것을 사용하는 대표적인 것들이, 자바에서 사용하는 퍼포먼스, 테스트, 프로파일러 등이고,
AspectJ와 같은 aop도 출발은 이렇다니... 물런 자바의 annotation을 이용하기도 하지만서도..
역시나 해봐야 앞단 프레임웍만 삽질하고 있는내가 좀 한심했다.
좀 의아한것은, BCEL이나 ASM 자료가 한국에는 거의 없다는.. 것이다.
역시나 한국 IT를 대변해 주는것이 아닌가 하여.. 못내 씁쓸하다. ㅡ,.ㅡ;;
class파일을 조작(수정, 삭제, 추가)가능하게 해주는 거란다.
평소에 해보지 않는거라, 복잡하고 어렵다. 처음에는 개념도 잘 안잡혔다는..
아직도 마찬 가지 이지만, 역시나 생각하기에 따라 가능성이 몇 천배될 놈인건 분명하다.
이것을 사용하는 대표적인 것들이, 자바에서 사용하는 퍼포먼스, 테스트, 프로파일러 등이고,
AspectJ와 같은 aop도 출발은 이렇다니... 물런 자바의 annotation을 이용하기도 하지만서도..
역시나 해봐야 앞단 프레임웍만 삽질하고 있는내가 좀 한심했다.
좀 의아한것은, BCEL이나 ASM 자료가 한국에는 거의 없다는.. 것이다.
역시나 한국 IT를 대변해 주는것이 아닌가 하여.. 못내 씁쓸하다. ㅡ,.ㅡ;;
수요일, 12월 12, 2007
Vocabulary Plug-in 1.1.0 Upgrade Plan
조금씩 조금씩 수정 되고 있는 Vocabulary plug-in 입니다.
애초에 의도된 만큼 발전 할수 있을지 미지 수 이지만, 아주 조금씩 발전해 가는 걸 봅니다.
화이팅 해주세요.
또다른 의견 주시면 적극 반영 하겠습니다.
- 기본 기능 수정
. 틀렸으면 틀렸다고 표시하고..1,2초 후에 자동으로 넘어가거나...
. 답을 빨간색으로 표시해주고..그거 클릭하면 다음 문제 나오게 해야 할 듯..
이건 5지 선다를 무조건 찍는다는 분이 있어서, 타당하다 생각 됨.
- 신규단어 추가 및 기존단어 수정 삭제 기능
기존에 자신이 모르는 단어 추가 밎 수정, 삭제 기능

- 기존 단어 export 기능 추가
신규단어가 추가 삭제 등으로 원본 text 파일을 export 할수 있도록 기능 추가
- Dictation 기능 개선
기존에는 정답을 맞춘 것만 출력하였으나, 옵션을 두어서 전체를 대상으로 테스트 할수 있도록 수정
물런, 정답인 단어는 아는 것으로 추가하거나 관리로 넘어갈수 있도록 수정
- 기타 잡다한 버그 수정
인터넷이 연결 안되어 있을때, 정보 메시지 출력.
이렇게 잡았다.
마지막 배포버전 다운로드와 전체 설명은 :
http://cafe.naver.com/ArticleRead.nhn?clubid=11492512&menuid=28&boardtype=L&page=1&articleid=1768
애초에 의도된 만큼 발전 할수 있을지 미지 수 이지만, 아주 조금씩 발전해 가는 걸 봅니다.
화이팅 해주세요.
또다른 의견 주시면 적극 반영 하겠습니다.
- 기본 기능 수정
. 틀렸으면 틀렸다고 표시하고..1,2초 후에 자동으로 넘어가거나...
. 답을 빨간색으로 표시해주고..그거 클릭하면 다음 문제 나오게 해야 할 듯..
이건 5지 선다를 무조건 찍는다는 분이 있어서, 타당하다 생각 됨.
- 신규단어 추가 및 기존단어 수정 삭제 기능
기존에 자신이 모르는 단어 추가 밎 수정, 삭제 기능

- 기존 단어 export 기능 추가
신규단어가 추가 삭제 등으로 원본 text 파일을 export 할수 있도록 기능 추가
- Dictation 기능 개선
기존에는 정답을 맞춘 것만 출력하였으나, 옵션을 두어서 전체를 대상으로 테스트 할수 있도록 수정
물런, 정답인 단어는 아는 것으로 추가하거나 관리로 넘어갈수 있도록 수정
- 기타 잡다한 버그 수정
인터넷이 연결 안되어 있을때, 정보 메시지 출력.
이렇게 잡았다.
마지막 배포버전 다운로드와 전체 설명은 :
http://cafe.naver.com/ArticleRead.nhn?clubid=11492512&menuid=28&boardtype=L&page=1&articleid=1768

한 이라크 여인이 지난 9월 16일 바그다드 동북쪽 바쿼바에서 총을 맞고 죽어가는 6살난 아들의 시신을 껴안고 흐느끼고 있다. 2003년 미국의 침공 이래 이라크는 사회 안정은 커녕 올해도 매월 수백명이 교전과 무력충돌 등으로 사망했다. 굶주림과 분쟁을 피해 고향을 떠난 400여만명의 난민이 주변 국가를 떠돌고 있다. 미군도 올 한해 800여명 이상이 죽어 ‘최악의 해’를 맞았다.
기사를 보고 가슴이 아파 눈물이 나와요. 누군가 같이 울어줄 사람이 필요한데...
전쟁 게임(Company of Heroes, Call of Duty 4 - Modern Warfear)을 유난히 좋아한데..
잠시나마 반성해 봅니다.
게임시간을 줄여서, 다른 누군가의 도움이 되고자 노력하겟다고..
금요일, 12월 07, 2007
오늘 그디어 36부작 중국드라마 손자병법(삼십육계, 손빈,방연) 편을 보았다.
제나라의 30만 위나라의 30만 대군의 싸움이 아니라,
양국의 책사 역할을 하는 손빈과 방연의 싸움을 본다.
10대말 인생의 진로를 결정해야할 때, 삼국지(지금 생각에 금성출판사에서 나온 46권으로 이루어졌었다는??)에 나오는 제갈공명을 보면서 대학으로 진로를 바꾸었는데.. 오늘도 역시나 같은 결론이 나온다.
그때에 나는 조금만 도장의 사범(지금은 배나온 아저씨에 불과하므로.. 비교불가) 생활을 하고 있었던 지라 관우, 장비, 조자룡등의 맹장이 훨씬 멋져 보였었다. 그러나, 공명의 말에 움직여야하는, 승리하한다는....
....
사람은 각 사람의 크기가 있나보다. 좋고 나쁜 크기가 아니 쓰임새의 크기라 표현해야 하나..
산으로 비유하자면, 우리집 뒷동산인 대모산과 남산과 백두산 금강산 지리산등 많은 산이 있는것이다.
어느 누가 대모산이 쓸모없는 산이라 말하겠는가? (몇번 올라가봣지만, 3시간이면 왕복할수있는 아주 멋진 산이다.)
이 산의 크기는 태어날(어느 정도는 만들어 지기도 하지만)때 부터 어느정도 만들어 지기도 하기에, 사람의 영역이 아닌 신의 영역인듯하다. 제일 높은산도 하늘 아래 있는것이고, 제일 작은 산도 마찬가지고, 산이라 부르기에 창피한 언덕도 하늘아래에 있다.
위나라 방연 분명 뛰어난사람으로 주위 많은 나라를 점령하였으나, 손빈이 방연에 대해 말하길 자신의 잘난것에만 치우쳣다고 다른 사람을 무시한다고 평한다.
자신의 그릇을 알고... 신에대해 감사하며 겸손하는 것이 사람이 도가 아닐까?
'Do not despise these small beginnings' ZECHARIAH 4:10
제나라의 30만 위나라의 30만 대군의 싸움이 아니라,
양국의 책사 역할을 하는 손빈과 방연의 싸움을 본다.
10대말 인생의 진로를 결정해야할 때, 삼국지(지금 생각에 금성출판사에서 나온 46권으로 이루어졌었다는??)에 나오는 제갈공명을 보면서 대학으로 진로를 바꾸었는데.. 오늘도 역시나 같은 결론이 나온다.
그때에 나는 조금만 도장의 사범(지금은 배나온 아저씨에 불과하므로.. 비교불가) 생활을 하고 있었던 지라 관우, 장비, 조자룡등의 맹장이 훨씬 멋져 보였었다. 그러나, 공명의 말에 움직여야하는, 승리하한다는....
....
사람은 각 사람의 크기가 있나보다. 좋고 나쁜 크기가 아니 쓰임새의 크기라 표현해야 하나..
산으로 비유하자면, 우리집 뒷동산인 대모산과 남산과 백두산 금강산 지리산등 많은 산이 있는것이다.
어느 누가 대모산이 쓸모없는 산이라 말하겠는가? (몇번 올라가봣지만, 3시간이면 왕복할수있는 아주 멋진 산이다.)
이 산의 크기는 태어날(어느 정도는 만들어 지기도 하지만)때 부터 어느정도 만들어 지기도 하기에, 사람의 영역이 아닌 신의 영역인듯하다. 제일 높은산도 하늘 아래 있는것이고, 제일 작은 산도 마찬가지고, 산이라 부르기에 창피한 언덕도 하늘아래에 있다.
위나라 방연 분명 뛰어난사람으로 주위 많은 나라를 점령하였으나, 손빈이 방연에 대해 말하길 자신의 잘난것에만 치우쳣다고 다른 사람을 무시한다고 평한다.
자신의 그릇을 알고... 신에대해 감사하며 겸손하는 것이 사람이 도가 아닐까?
'Do not despise these small beginnings' ZECHARIAH 4:10
토요일, 12월 01, 2007
경험보다 실제 자료가 중요하다
오늘 '이클립스 실전 플러그인 개발'에 관한 스터디가 9시30분에 있었다.
장소는 토즈 강남역점에서 하였다. 물런, 토즈 강남역점은 강남역에서 좀 멀리 있고, 짐(노트북 배낭과, 에이콘에서 협찬해주신 책 5권)도 무지 많아서 걸음을 최대한 아끼고 싶었다.
평소에 강남역에 가려면, 집에서 06번 버스를 타고 삼성역으로가서 강남역까지 지하철을 타고 가면 30분-40분정도 여유있게 갈수 있는거리다.
허나.. 짐이 많아... 좀 적게 걸어볼 요량으로...
예전에 몇번 버스를 타본 05번 마을버스를 어디서 내려 양재역까지 가면 강남역까지 가는 버스가 있었던듯 했다. -,.-;;; 이것만 알고 무턱대고 05번 버스를 타고 출발했다. 흠, 어디서 내려야하는데.. 가는 도중에 잘 기억안나서... 느낌상으로 대강 내림... 택시를 탈까하다.. 중간에.. 좀 걸고.. 찾아 어디서 내려타는 양재역가는 버스 발견해서 겨우 양재역 도착... 양재역에서 강남역까지 무사히 도착..
결국 도착해 보니 1시간 30분이 걸렸고.. 으.. 지각해버렸고.. 킁
-------------------------------------------------------------------
역시나 경험이 중요하지만, 잘 알지 못한 모호한 경험은 독이 된다.
오늘도 약속 시간이 정해져 있는 일이어서, 평소에 잘 알고 있는 길로 가야 했어야 하는데.. 흠...
잘 알지 못하는 길은 좀더 찾아보고, 확실히 알아둬야 했는데..
좋은 경험을 한것 같다.
장소는 토즈 강남역점에서 하였다. 물런, 토즈 강남역점은 강남역에서 좀 멀리 있고, 짐(노트북 배낭과, 에이콘에서 협찬해주신 책 5권)도 무지 많아서 걸음을 최대한 아끼고 싶었다.
평소에 강남역에 가려면, 집에서 06번 버스를 타고 삼성역으로가서 강남역까지 지하철을 타고 가면 30분-40분정도 여유있게 갈수 있는거리다.
허나.. 짐이 많아... 좀 적게 걸어볼 요량으로...
예전에 몇번 버스를 타본 05번 마을버스를 어디서 내려 양재역까지 가면 강남역까지 가는 버스가 있었던듯 했다. -,.-;;; 이것만 알고 무턱대고 05번 버스를 타고 출발했다. 흠, 어디서 내려야하는데.. 가는 도중에 잘 기억안나서... 느낌상으로 대강 내림... 택시를 탈까하다.. 중간에.. 좀 걸고.. 찾아 어디서 내려타는 양재역가는 버스 발견해서 겨우 양재역 도착... 양재역에서 강남역까지 무사히 도착..
결국 도착해 보니 1시간 30분이 걸렸고.. 으.. 지각해버렸고.. 킁
-------------------------------------------------------------------
역시나 경험이 중요하지만, 잘 알지 못한 모호한 경험은 독이 된다.
오늘도 약속 시간이 정해져 있는 일이어서, 평소에 잘 알고 있는 길로 가야 했어야 하는데.. 흠...
잘 알지 못하는 길은 좀더 찾아보고, 확실히 알아둬야 했는데..
좋은 경험을 한것 같다.
일요일, 11월 25, 2007
여명학교 후원의 밤
제3회 여명학교 후원의 밤에 다녀왔다.
여명학교는 북한 탈북자(세터민)을 위한 비인가 교육기관이라고한다.
후원을 하고 있거나 그러지는 않지만, 티켓 2장을 사서 갓으니... -,.-;;
나름대로, 나름 후원이라면 후원이라는 마음으로 ...
뭐..
교감선생님의 말이 기억에 남는다.
후원을 부탁한다. 선생님인 자신들은 위험할때는 목숨을 걸고 아이들을 보호할것이며, 평상시에는 인격으로 아이들을 가르키겟다고.. 사명으로 알겟다고... 후원을 부탁하셧다.
평생 저렇게 사명으로.. 사는 삶에는 힘들어도 기쁨이 넘칠것이라는...
ps) 여명학교는 요셉과 갖은 사람을 준비시킨다고 합니다. 가정, 나라를 위해 준비되고 사용되어지는 사람이지요. 북한을 위해 준비되고 통일을 위해 준비되어지는 사람을 만드는 것이 학교의 목표라고 합니다.
통일한국과 사람에게 관심 있는 분이면 한번쯤 가보시는것도 좋겟어요.
여명학교는 북한 탈북자(세터민)을 위한 비인가 교육기관이라고한다.
후원을 하고 있거나 그러지는 않지만, 티켓 2장을 사서 갓으니... -,.-;;
나름대로, 나름 후원이라면 후원이라는 마음으로 ...
뭐..
교감선생님의 말이 기억에 남는다.
후원을 부탁한다. 선생님인 자신들은 위험할때는 목숨을 걸고 아이들을 보호할것이며, 평상시에는 인격으로 아이들을 가르키겟다고.. 사명으로 알겟다고... 후원을 부탁하셧다.
평생 저렇게 사명으로.. 사는 삶에는 힘들어도 기쁨이 넘칠것이라는...
ps) 여명학교는 요셉과 갖은 사람을 준비시킨다고 합니다. 가정, 나라를 위해 준비되고 사용되어지는 사람이지요. 북한을 위해 준비되고 통일을 위해 준비되어지는 사람을 만드는 것이 학교의 목표라고 합니다.
통일한국과 사람에게 관심 있는 분이면 한번쯤 가보시는것도 좋겟어요.
목요일, 11월 22, 2007
meebo plug-in 작성

아시는 분은 잘 아시겠지만...
방화벽이 막힌곳에서 메신저를 사용 하고싶을때는 'http://www.meebo.com'을 이용하곤하는데..
그렇지 않아도 화면이 많이 떠서 힘든게 현실인 개발자에게...
사실은 nilriri 아저씨가 답답했던지, 메일을 보냈다는...
보여주니 역시 좋아하고 보여주니 요구사항도 있네요.
플러그인을 설치하고 창 -> 보기표시 ->기타 -> mebo를 선택하면 화면이 뜬다.
사실 1분 이라 좀 Browser 하나 열고 URL주고 오픈해 버렸으니..
내일은 재홍아저씨 말대로 수정을 좀 해봐야겟다.
글쓰는데, plug-in 오타 보인다.. 킁...
수요일, 11월 21, 2007
vocabulary plug-in 제작

nilrir 아저씨의 아이디어를 따와 eclipse plug-in으로 만들었습니다.
처음 만들때는 요새 자료를 보는 emf, gmf 예제로 활용해 볼 요량으로 몇 시간이면 만들수 있을듯 싶어 시작했는데.. 이산이.. 좀 높네. -,.-;; 거의 2틀이나 걸려버린 넘이었는데..
만들고 나니 나름 쓸모가 있을듯 싶습니다.
잔소리 생략하고, 설명 들어 갑니다.
이 프로그램은 단어장 및 사전 입니다.
'단어'에 있는 단어를 '문제목록'에서 맞추어 봅니다.
제대로 맞춘다면 자동으로 다음으로 넘어가게 됩니다. 그리고 맞춘 단어는 다시는 보이지 않습니다.
단어를 잘 모르겠고, 계속해서 보고싶다면 '관리'버튼을 누르세요. 그럼 '관리하기'창에 보여집니다.
'듣기' 버튼은 왼쪽 단어의 소리를 듣는겁니다.(야후 사전 이용했습니다)
'Next'버튼은 그냥 다음 단어 보는 거구요.
단어를 '사전'에서 찾고 싶으실때 '단어'텍스트 박스에서 엔터를 치시면 'Dictionary'에 검색이 됩니다(야후 사전 이용했습니다.)
기본으로 제공되는 단어는 1800단어 입니다. 새로운 단어장을 만들어서 위와같은 방법으로 테스트 하실수 있습니다. 창 -> 환경설정 -> Vocabulary에서 파일을 선택해 주시면 되겠습니다.
처음에는 c:/temp/vocabulary/vocabulary.txt 파일이 자동으로 생겼을 겁니다. 위와 같은 형식으로 파일을 만드시면 되겠습니다.
어쩌면, nilrir와 hangum이만 사용하는 plug-in이 될지도 모르겠습니다.
화면의 오픈은 창 -> 보기표시 -> Vocabulary -> Vocabulary를 선택하면 화면이 뜬다
이 플러그인은 3.2, 3.3이상에서테스트 되었습니다.
앞으로는 애초의 생각대로 EMF, GMF 기능을 구겨 넣어 보도록 하겠습니다
테스트를 거의 못해서 에러있을텐데.. 크~ -,.-;;
쓸모있다 생각 되시면 옆사람에게 추천해주시면 좋겠어요.
관련 정보가 문제가 된다면 PLUG-IN 바로 삭제 하겠습니다. 야후 형님께 다시 한번 감사를 전합니다.
화요일, 11월 20, 2007
The Unit Season 3가 좀 지리하다 생각 되었는데...
제작진이 극단의 처방을 해버렸다.
헥터 윌리암스가 down하엿다.
평소의 극의 주변에 맴돌던 헥터가 어쩐지 극의 중심에서 스토리를 이끌어 갔고,
애인도 생겼는데.
임무수행중에 절친한 친구 그래이가 총에 맞고 그를 구하며 치료까지 했는데...
그리고, 모든 unit 대원들이 전멸할 듯한 극적인 상황에서, 구출되는 찰라에 저격수의 총에 죽어버렷다.
처음 이장면을 보았을때, 무슨 환상을 보는 듯.. 공황상태에 갑자기 빠져 버렷다.
눈물이 주르륵...
제작진에 항의 하려고 홈피에 갔더니만.... flash play가 컴터에 인스톨이 안돼...
이런 젠장... 헥터를 살려줘...
제작진이 극단의 처방을 해버렸다.
헥터 윌리암스가 down하엿다.
평소의 극의 주변에 맴돌던 헥터가 어쩐지 극의 중심에서 스토리를 이끌어 갔고,
애인도 생겼는데.
임무수행중에 절친한 친구 그래이가 총에 맞고 그를 구하며 치료까지 했는데...
그리고, 모든 unit 대원들이 전멸할 듯한 극적인 상황에서, 구출되는 찰라에 저격수의 총에 죽어버렷다.
처음 이장면을 보았을때, 무슨 환상을 보는 듯.. 공황상태에 갑자기 빠져 버렷다.
눈물이 주르륵...
제작진에 항의 하려고 홈피에 갔더니만.... flash play가 컴터에 인스톨이 안돼...
이런 젠장... 헥터를 살려줘...
월요일, 11월 12, 2007
Tablet 노트북 사용기
토요일, 11월 10, 2007
오랫만에 음악회 갔다.
세라믹팔레스홀에서 하는 밀알음악회로 모든 연령을 대상으로 하는 음악회였다.
이런 음악회가 좋은점은 모든 연령이 들을수 있어 가족들이 갈수 있는 것이고(보통은 만 8세이상이니), 그리 형식을 갖춰가지 않아도 되는것이다.
게다가 오늘은 평소보다 사람이 적어서 앞자리에 앉아서 감상하는 특권도 누릴수 있었다.
연주자의 근육떨리는 것 까지 볼수있고, 들을수 있는 자리는 좀처럼 쉽지 않는데말이다.
오늘따라 바이얼린 소리가 왜이리 좋게 들리는지....
연주중에 챌로의 활이 끊어지는 특이한 광경이 연출되었는데, 와이프 말로는 좀처럼 없는 일이고, 챌로 연주자가 힘이 넘쳐서 그럴거라는 이야기를 해줬다.
다행이 여분이 있으셨는지 공연은 이어서 바로 시작했고, 공연은 계속 진행 되었다.
몇일 하다 만 바이얼린을 다시 배워 봐야겟다.
세라믹팔레스홀에서 하는 밀알음악회로 모든 연령을 대상으로 하는 음악회였다.
이런 음악회가 좋은점은 모든 연령이 들을수 있어 가족들이 갈수 있는 것이고(보통은 만 8세이상이니), 그리 형식을 갖춰가지 않아도 되는것이다.
게다가 오늘은 평소보다 사람이 적어서 앞자리에 앉아서 감상하는 특권도 누릴수 있었다.
연주자의 근육떨리는 것 까지 볼수있고, 들을수 있는 자리는 좀처럼 쉽지 않는데말이다.
오늘따라 바이얼린 소리가 왜이리 좋게 들리는지....
연주중에 챌로의 활이 끊어지는 특이한 광경이 연출되었는데, 와이프 말로는 좀처럼 없는 일이고, 챌로 연주자가 힘이 넘쳐서 그럴거라는 이야기를 해줬다.
다행이 여분이 있으셨는지 공연은 이어서 바로 시작했고, 공연은 계속 진행 되었다.
몇일 하다 만 바이얼린을 다시 배워 봐야겟다.
토요일, 11월 03, 2007
카페에 구직광고를 내었는데.. 연락이 없다.
몸을 좀더 낫추고, 즐겁게 일할수 있고, 나를 필요로 하는 곳을 찾아봐야겟다.
http://cafe.naver.com/eclipseplugin/1598
안녕하세요.
새로운 일을 구합니다.
제가 할 수 있는 것으로는,
Eclipse RCP, Plug-in, SWT, SWING으로 된 어플리케이션을 개발했습니다.
물런 기반 프레임웍이나, 웹 프로젝트도 해왔습니다.(struts, spring)
분석 부터 테스트 까지 설계가능합니다.
자주 구직광고를 내니 좀 쑥쓰럽기도 하고 어색하기도합니다.
목구멍이 포도청이라 이렇게 올려봅니다.
더 자세한 정보원하시면 이력서 보내드리겠습니다. 연락주십시오.
연락처: hangum@지메일.com
공일공 - 7331 - 3601
몸을 좀더 낫추고, 즐겁게 일할수 있고, 나를 필요로 하는 곳을 찾아봐야겟다.
http://cafe.naver.com/eclipseplugin/1598
안녕하세요.
새로운 일을 구합니다.
제가 할 수 있는 것으로는,
Eclipse RCP, Plug-in, SWT, SWING으로 된 어플리케이션을 개발했습니다.
물런 기반 프레임웍이나, 웹 프로젝트도 해왔습니다.(struts, spring)
분석 부터 테스트 까지 설계가능합니다.
자주 구직광고를 내니 좀 쑥쓰럽기도 하고 어색하기도합니다.
목구멍이 포도청이라 이렇게 올려봅니다.
더 자세한 정보원하시면 이력서 보내드리겠습니다. 연락주십시오.
연락처: hangum@지메일.com
공일공 - 7331 - 3601
요새 무엇을 해도 집중이 되지 않는다.
쌓아논 각종 책들은 먼지가 자욱해 다시 책장에 집어 넣어야 할지도 모르겟다.
틈틈히 해오던, 작은 프로젝트(?)도 진행이 되지 않는다.
나의 도움이 필요한 일에도 더이상 나의 손길이 가지 않는다.
모든게 멈춤(?) 상태가 된듯하다.
한가지 오히려 좋은 점이라면, 그나마 성경책 보는건 즐겁다.
성경책 볼때 예전에 미쳐 보지 못했던 부분을 보면서 약간은 흥미롭기까지 하다.
33살 인생의 중반전인데, 멈춰버린 나인듯 하지만....
다시 움직이기를 소망해 본다.
너무 절망적으로 글을 적는건지도 모르겟지만......
내일부터는 공부도 다시 시작해야지.. 중간에 놔두었던 gmf를 다시 좀 봐둬야 할듯 싶고...
작은 프로젝트도 다시 정리해야할 필요가 있다.
쌓아논 각종 책들은 먼지가 자욱해 다시 책장에 집어 넣어야 할지도 모르겟다.
틈틈히 해오던, 작은 프로젝트(?)도 진행이 되지 않는다.
나의 도움이 필요한 일에도 더이상 나의 손길이 가지 않는다.
모든게 멈춤(?) 상태가 된듯하다.
한가지 오히려 좋은 점이라면, 그나마 성경책 보는건 즐겁다.
성경책 볼때 예전에 미쳐 보지 못했던 부분을 보면서 약간은 흥미롭기까지 하다.
33살 인생의 중반전인데, 멈춰버린 나인듯 하지만....
다시 움직이기를 소망해 본다.
너무 절망적으로 글을 적는건지도 모르겟지만......
내일부터는 공부도 다시 시작해야지.. 중간에 놔두었던 gmf를 다시 좀 봐둬야 할듯 싶고...
작은 프로젝트도 다시 정리해야할 필요가 있다.
월요일, 10월 29, 2007
사람의 거래는 역시 주고 받는 것인가보다.
어떤사람에게 그냥 거의 아무조건없이 주려고 했을때 상대방이 거절하기도 하며(?),
어떤사람에게 그렇게 받아보려고 했을때 이기적으로 보이기 때문인듯하다.
이 평범한 사실로 아직도 헤매고 있다니 우습기까지하다.
개인적으로는 이러한 작은 이기심때문에 우리의 삶과 그 환경이 더 팍팍해(?)져 가는것이 아닌가하다.
어느 사람은 진실을 몰라줘 힘들고,
어느 사람은 그 진실은 이상하게 비꼬는가 하면,
어느 사람은 그 진실을 이용하기 때문이다.
이제 막 사회에 발들여 놓은 친구들에게는 이 사실을 좀더 인지시켜야겟다.
굳이 잔인하게 보일지라도, 그렇게 하는게 도움이 될것이다.
나 자신도 역시나 그래야겟지...
자 댓가를 지불하고, 내가 원하는 것을 얻을 준비가 됏는지 나에게 물어보자.
어떤사람에게 그냥 거의 아무조건없이 주려고 했을때 상대방이 거절하기도 하며(?),
어떤사람에게 그렇게 받아보려고 했을때 이기적으로 보이기 때문인듯하다.
이 평범한 사실로 아직도 헤매고 있다니 우습기까지하다.
개인적으로는 이러한 작은 이기심때문에 우리의 삶과 그 환경이 더 팍팍해(?)져 가는것이 아닌가하다.
어느 사람은 진실을 몰라줘 힘들고,
어느 사람은 그 진실은 이상하게 비꼬는가 하면,
어느 사람은 그 진실을 이용하기 때문이다.
이제 막 사회에 발들여 놓은 친구들에게는 이 사실을 좀더 인지시켜야겟다.
굳이 잔인하게 보일지라도, 그렇게 하는게 도움이 될것이다.
나 자신도 역시나 그래야겟지...
자 댓가를 지불하고, 내가 원하는 것을 얻을 준비가 됏는지 나에게 물어보자.
토요일, 10월 27, 2007
목요일, 10월 25, 2007
이클립스관련 개인 질문자들에게 받은 커피(http://hangumkj.blogspot.com/2007/10/blog-post_17.html)를 때이는 사태가 발생했습니다.
개인적으로 참 어처구니 없는 사건이기에 블로그에 적어 기록하고자 합니다.
카페에 질문이 하나 올라왔습니다. 질문도 잘 이해가 되지 않는 질문 이었지요.(링크를 걸고 싶지만, 삭제되고 없네요)
3일동안 헤메고 있노라고 도와주라는 절박한 메시지도 있었지요. 그래서 아는 만큼 방법을 달아 주었지요. 그 다음날 (지난 10월 17일에) SWT소스와 함께 메일이 왔더랬습니다.
아래는 전문입니다.
===========================================================
한금님 바쁘시겠지만 제가 배움이 부족해서 이렇게 도움 청합니다.소스 첨부해서 보내드립니다.
제가 말씀드린
이전 페이는 사라지고 새 화면이 나오는 방법좀,,,,
구현해 주시면..합니다.
============================================================
그래서 답변과 함께 커피이야기도 첨부해서 소스를 수정하여 보내주었습니다.
흠, 그랬더니 보내준다던 커피소식이 없더니 저녁쯤에야 기프트콘 하나와 또다른 절박한 메일이 왔더군요. 여기서 기프트콘이 늦게 도착한 이유를 눈치 챘어야 했는데.
그 다음날 네이트온 메신저로 연결해서 보내준 소스를 또 수정해주었습니다.
(솔직히 swt화면을 웹처럼 구성하는 것은 처음보았습니다. ㅡ,.ㅡ;;)
기프트콘을 이야기를 했지요. 정말감사하다라고 이야기를 정중히 하고더군요.
그분과 했던 마지막 메시지 전문입니다.
===========================================================
/해/[An]/차/_Driver_/사진//해/ 님의 말 :
팝스쪽 하다가 막히면 질문 드려두 될까여..?
Generating an Extended Model 님의 말 :
네 질문 한계당 커피 하나씩 이면 됩니다
/해/[An]/차/_Driver_/사진//해/ 님의 말 :
ㅎㅎ
/해/[An]/차/_Driver_/사진//해/ 님의 말 :
넵
===========================================================
몇일이지난 지금 그사람과 저의 관계는 이렇습니다.
지금은 커피소식도 없고, 메신저도 블럭 당했으면, 카페의 질문도 삭제 당했습니다.
이것 참, 커피를 때이다니 이걸 어캐 표현해야할지 모르겠습니다.
이제 갓 입사한 한달째 신입이라고 자기는 안승?이고 메일로는 너무 정중하게 보냈던데..
역시 사람은 겪어봐야 아나 봅니다.
그 후 몇 일이 지나서, 제가할수 있는 최대한 인내을 보였습니다.
그 신입의 인생을 위해, 커피보내라는 메일을 보냈습니다.
그 후 몇 일이 지났지만, 답변이 없네요. 카페에 공지를 할까 하다..(카페 제명 조치를 해야할까 봅니다) 그냥 넘어가 봅니다.
내 인생도 아닌데요. 커피 한잔에 왜 그랬을까 싶습니다.
내가 너무 과한걸까요?
질문 하나에 커피 하나가 과한 걸까요?
개인적으로 참 어처구니 없는 사건이기에 블로그에 적어 기록하고자 합니다.
카페에 질문이 하나 올라왔습니다. 질문도 잘 이해가 되지 않는 질문 이었지요.(링크를 걸고 싶지만, 삭제되고 없네요)
3일동안 헤메고 있노라고 도와주라는 절박한 메시지도 있었지요. 그래서 아는 만큼 방법을 달아 주었지요. 그 다음날 (지난 10월 17일에) SWT소스와 함께 메일이 왔더랬습니다.
아래는 전문입니다.
===========================================================
한금님 바쁘시겠지만 제가 배움이 부족해서 이렇게 도움 청합니다.소스 첨부해서 보내드립니다.
제가 말씀드린
이전 페이는 사라지고 새 화면이 나오는 방법좀,,,,
구현해 주시면..합니다.
============================================================
그래서 답변과 함께 커피이야기도 첨부해서 소스를 수정하여 보내주었습니다.
흠, 그랬더니 보내준다던 커피소식이 없더니 저녁쯤에야 기프트콘 하나와 또다른 절박한 메일이 왔더군요. 여기서 기프트콘이 늦게 도착한 이유를 눈치 챘어야 했는데.
그 다음날 네이트온 메신저로 연결해서 보내준 소스를 또 수정해주었습니다.
(솔직히 swt화면을 웹처럼 구성하는 것은 처음보았습니다. ㅡ,.ㅡ;;)
기프트콘을 이야기를 했지요. 정말감사하다라고 이야기를 정중히 하고더군요.
그분과 했던 마지막 메시지 전문입니다.
===========================================================
/해/[An]/차/_Driver_/사진//해/ 님의 말 :
팝스쪽 하다가 막히면 질문 드려두 될까여..?
Generating an Extended Model 님의 말 :
네 질문 한계당 커피 하나씩 이면 됩니다
/해/[An]/차/_Driver_/사진//해/ 님의 말 :
ㅎㅎ
/해/[An]/차/_Driver_/사진//해/ 님의 말 :
넵
===========================================================
몇일이지난 지금 그사람과 저의 관계는 이렇습니다.
지금은 커피소식도 없고, 메신저도 블럭 당했으면, 카페의 질문도 삭제 당했습니다.
이것 참, 커피를 때이다니 이걸 어캐 표현해야할지 모르겠습니다.
이제 갓 입사한 한달째 신입이라고 자기는 안승?이고 메일로는 너무 정중하게 보냈던데..
역시 사람은 겪어봐야 아나 봅니다.
그 후 몇 일이 지나서, 제가할수 있는 최대한 인내을 보였습니다.
그 신입의 인생을 위해, 커피보내라는 메일을 보냈습니다.
그 후 몇 일이 지났지만, 답변이 없네요. 카페에 공지를 할까 하다..(카페 제명 조치를 해야할까 봅니다) 그냥 넘어가 봅니다.
내 인생도 아닌데요. 커피 한잔에 왜 그랬을까 싶습니다.
내가 너무 과한걸까요?
질문 하나에 커피 하나가 과한 걸까요?
월요일, 10월 22, 2007
모처에 올렸던 책 리뷰인데.. 흠냐... 시간이 어찌나 빨리 가네요.
-----------------------------------------------------------------------
제목 Professional 소프트웨어 개발 (2004-05-31 13:39:53.0 )
이름 한금이

이 직업으로 밥 먹고 산지도 언뜻 개산해보니 x년이 넘었네요.
무척이나 오래 되었지요.
이 직업을 처음 시작 할 때는 그냥 개발하는 것이 재미 있어서 시작했는데,
시간이 가면 갈수록 힘들다는 생각이 무척이나 듭니다.
Professional 소프트웨어 개발이라는 책을 읽고 있습니다. 115 page 에 이런 내용이 있어 소개합니다.
대부분의 프로그래머는 시간이 지남에 따라 점진적으로 자기 직업에 눈을 뜨게 된다.
처음 프로그래밍 할 때, "내가 이 프로그램의 문법 에러를 모두 잡아내고 컴파일이 될 때쯤이면, 컴퓨터 프로그래밍이 도대체 무엇인지 알게 될 거야."라고 생각했다. 그러나 모든 문법 에러를 잡아낸 후에도, 내 프로그램은 여전히 작동하지 않았다. 프로그램에 내재 된 여러 문제는 문법 에러보다 훨씬 찾기 어려웠다. 나는 맘을 고쳐 먹었다. "내가 이 프로그램을 완벽히 디버깅 할 때쯤이면, 프로그래밍이 무엇인지 알게 될 거야." 이 생각은 내가 좀더 큰 프로그램을 작성하기 전까지 유효하게 적용되었다. 그러나 더 긴 코드를 작성하면서, 내가 만든 모듈들이 생각한 것만큼 서로 잘 들어맞지 않으면서 새로운 무제가 발생하였다. 이 때 새로운 목표가 생겼다. "멋진 설계를 어떻게 하는 지 알게 될 때쯤, 소프트웨어 개발이 뭔지 알게 될 거야." 그 이후 나는 멋진 설계들을 만들어 냈다. 그러나 자꾸 요구사항이 바뀌어 버렸기 때문에 어떤 설계들은 자꾸 변경돼야만 했다. 이 시점에서 또 생각을 바꿀 수 밖에 없었다. "내가 요구사항을 잘 뽑아내는 방법을 알게 될 때쯤, 나는 소프트웨어 개발이 뭔지 알게 될 거야." 요구사항을 잘 분석하는 방법을 익히면서, 소프트웨어 개발이 뭔지 알게 될 거야." 요구사항을 잘 분석하는 방법을 익히면서, 소프트웨어 개발이 도대체 무엇인지 결코 알아 낼 수 없다는 생각이 들기 시작했다. 그러나 이런 깨달음이 바로 소프트웨어공학을 향한 첫 발걸음이었다.
많은 프로그래머가 깨달음을 위해 먼 곳으로 돌아가는 길을 택한다. 대게 내가 갔던 길과 비슷하거나, 약간 다른 방식일 것이다. 많은 개발자는 각자의 전공 분야에 대해 잘 교육 받았지만, 정작 소프트웨어 개발에 대해서는 대부분 독학의 길을 걷는다.
이 글을 읽으면서 지금까지 가슴 한편으로 답답했던 것들이 내려 가는 것 갖습니다. 아 이것이 구나..... 그러면서 무릎을 치며 호탕하게 웃어 봅니다.
그 웃음의 의미를 배움으로 옮길 수 있을지 어떨지는 잘 모릅니다. 그렇지만, 근 몇 년간 헤매어 오던 답을 찾은 것 갖습니다.
요새 음악 듣는 것이 즐거워 헤드폰을 샀습니다. GRADO SR-80이라는 제품인데, GRADO가 사람 이름 이라는 군요.
이름을 걸고 만드는 제품을 쓰고 있노라면, 기술자로서 부끄러운 생각이 듭니다. --;;
저도 이름을 걸고 자부심으로 일하고 싶습니다. 그런 사회가 되었으면 하는 바람입니다.
못 읽어 보셨다면 한 번 쯤은 꼭 읽어 보셨으면 합니다.
-----------------------------------------------------------------------
제목 Professional 소프트웨어 개발 (2004-05-31 13:39:53.0 )
이름 한금이

이 직업으로 밥 먹고 산지도 언뜻 개산해보니 x년이 넘었네요.
무척이나 오래 되었지요.
이 직업을 처음 시작 할 때는 그냥 개발하는 것이 재미 있어서 시작했는데,
시간이 가면 갈수록 힘들다는 생각이 무척이나 듭니다.
Professional 소프트웨어 개발이라는 책을 읽고 있습니다. 115 page 에 이런 내용이 있어 소개합니다.
대부분의 프로그래머는 시간이 지남에 따라 점진적으로 자기 직업에 눈을 뜨게 된다.
처음 프로그래밍 할 때, "내가 이 프로그램의 문법 에러를 모두 잡아내고 컴파일이 될 때쯤이면, 컴퓨터 프로그래밍이 도대체 무엇인지 알게 될 거야."라고 생각했다. 그러나 모든 문법 에러를 잡아낸 후에도, 내 프로그램은 여전히 작동하지 않았다. 프로그램에 내재 된 여러 문제는 문법 에러보다 훨씬 찾기 어려웠다. 나는 맘을 고쳐 먹었다. "내가 이 프로그램을 완벽히 디버깅 할 때쯤이면, 프로그래밍이 무엇인지 알게 될 거야." 이 생각은 내가 좀더 큰 프로그램을 작성하기 전까지 유효하게 적용되었다. 그러나 더 긴 코드를 작성하면서, 내가 만든 모듈들이 생각한 것만큼 서로 잘 들어맞지 않으면서 새로운 무제가 발생하였다. 이 때 새로운 목표가 생겼다. "멋진 설계를 어떻게 하는 지 알게 될 때쯤, 소프트웨어 개발이 뭔지 알게 될 거야." 그 이후 나는 멋진 설계들을 만들어 냈다. 그러나 자꾸 요구사항이 바뀌어 버렸기 때문에 어떤 설계들은 자꾸 변경돼야만 했다. 이 시점에서 또 생각을 바꿀 수 밖에 없었다. "내가 요구사항을 잘 뽑아내는 방법을 알게 될 때쯤, 나는 소프트웨어 개발이 뭔지 알게 될 거야." 요구사항을 잘 분석하는 방법을 익히면서, 소프트웨어 개발이 뭔지 알게 될 거야." 요구사항을 잘 분석하는 방법을 익히면서, 소프트웨어 개발이 도대체 무엇인지 결코 알아 낼 수 없다는 생각이 들기 시작했다. 그러나 이런 깨달음이 바로 소프트웨어공학을 향한 첫 발걸음이었다.
많은 프로그래머가 깨달음을 위해 먼 곳으로 돌아가는 길을 택한다. 대게 내가 갔던 길과 비슷하거나, 약간 다른 방식일 것이다. 많은 개발자는 각자의 전공 분야에 대해 잘 교육 받았지만, 정작 소프트웨어 개발에 대해서는 대부분 독학의 길을 걷는다.
이 글을 읽으면서 지금까지 가슴 한편으로 답답했던 것들이 내려 가는 것 갖습니다. 아 이것이 구나..... 그러면서 무릎을 치며 호탕하게 웃어 봅니다.
그 웃음의 의미를 배움으로 옮길 수 있을지 어떨지는 잘 모릅니다. 그렇지만, 근 몇 년간 헤매어 오던 답을 찾은 것 갖습니다.
요새 음악 듣는 것이 즐거워 헤드폰을 샀습니다. GRADO SR-80이라는 제품인데, GRADO가 사람 이름 이라는 군요.
이름을 걸고 만드는 제품을 쓰고 있노라면, 기술자로서 부끄러운 생각이 듭니다. --;;
저도 이름을 걸고 자부심으로 일하고 싶습니다. 그런 사회가 되었으면 하는 바람입니다.
못 읽어 보셨다면 한 번 쯤은 꼭 읽어 보셨으면 합니다.
수요일, 10월 17, 2007
카페에서 올라오는 질문에 답해주노라면, 답변으로 해결이 안될때가 많습니다.
그럴때면 가끔씩 메신저 주소를 알려 드리는데요.
답변을 하기전에 정중히 부탁드리곤 합니다. 이번은 특별한 경우이니앞으로 메신저로는 자재해달라구요. 카페에는 수시로 답변을 하니 카페에 질문을 올리시면 감사하겟다고 말씀드리곤 합니다.
의외로 잘 이해해 주시는 분들도 있는가 하면, 말을 아주 곱게 드시는 분도 있습니다.
개인 답변자 처럼 아주 당당하게, 몇번을 그렇게 하시는 분도 있지요.
질문 하시는 분들은 가끔씩 서운 하기도 하겠지만.. 아는거 그냥 말해주지.. 그것좀 안다고... 뻐긴다구요.
아참, 메신저로 열심히 답했는데, 정작 6시가 넘으면 답변을 받은 분들은 메신저에 사라져 있습니다. 누구는 열심히 야근 중이죠. 이런 젠장할 소리가나옵니다. 아마 찔리시는 분도 있으리라 짐작해 봅니다. 크하하.. 누구야...
물런, 저에게까지 질문을 하실정도로 급하시면, 많이 급하시고 그렇겠지요.
하지만, 저도 먹고사는 일이 있기때문에, 또 질문하시는 분은 혼자지만, 그런분들이 많은 저는 감당이 안됩니다. 어떤 질문은 한참을 듯고 고민해야 나오는 답변도 있습니다. 이런 알바를 할까나 봅니다.
이 자리를 통해 살짝 미안 함을 전해드립니다.
그리고, 한가지 룰을 만들어 시행하려고 합니다.
메신저로 질문 하실때 앞으로는 네이트온 기프트콘 한개당 질문 하나씩으로 말입니다.
ㅋㅋ 당분간 커피 걱정이 없을지 사뭇 기대합니다만...
몇분께 말씀 드리고 시행해 본 결과로는 질문이 거의 안드러올듯 합니다. 푸하하하...
그럴때면 가끔씩 메신저 주소를 알려 드리는데요.
답변을 하기전에 정중히 부탁드리곤 합니다. 이번은 특별한 경우이니앞으로 메신저로는 자재해달라구요. 카페에는 수시로 답변을 하니 카페에 질문을 올리시면 감사하겟다고 말씀드리곤 합니다.
의외로 잘 이해해 주시는 분들도 있는가 하면, 말을 아주 곱게 드시는 분도 있습니다.
개인 답변자 처럼 아주 당당하게, 몇번을 그렇게 하시는 분도 있지요.
질문 하시는 분들은 가끔씩 서운 하기도 하겠지만.. 아는거 그냥 말해주지.. 그것좀 안다고... 뻐긴다구요.
아참, 메신저로 열심히 답했는데, 정작 6시가 넘으면 답변을 받은 분들은 메신저에 사라져 있습니다. 누구는 열심히 야근 중이죠. 이런 젠장할 소리가나옵니다. 아마 찔리시는 분도 있으리라 짐작해 봅니다. 크하하.. 누구야...
물런, 저에게까지 질문을 하실정도로 급하시면, 많이 급하시고 그렇겠지요.
하지만, 저도 먹고사는 일이 있기때문에, 또 질문하시는 분은 혼자지만, 그런분들이 많은 저는 감당이 안됩니다. 어떤 질문은 한참을 듯고 고민해야 나오는 답변도 있습니다. 이런 알바를 할까나 봅니다.
이 자리를 통해 살짝 미안 함을 전해드립니다.
그리고, 한가지 룰을 만들어 시행하려고 합니다.
메신저로 질문 하실때 앞으로는 네이트온 기프트콘 한개당 질문 하나씩으로 말입니다.
ㅋㅋ 당분간 커피 걱정이 없을지 사뭇 기대합니다만...
몇분께 말씀 드리고 시행해 본 결과로는 질문이 거의 안드러올듯 합니다. 푸하하하...
월요일, 10월 15, 2007
목요일, 10월 11, 2007
java.util.zip.ZipException: Too many open files C:\Program Files_IBM\SDP70Shared\plugins\org.eclipse.xsd.nl1_2.2.1.v200609270227.jar
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:238)
at java.util.zip.ZipFile.(ZipFile.java:268)
at org.eclipse.osgi.framework.util.SecureAction.getZipFile(SecureAction.java:225)
at org.eclipse.osgi.baseadaptor.bundlefile.ZipBundleFile.basicOpen(ZipBundleFile.java:79)
at org.eclipse.osgi.baseadaptor.bundlefile.ZipBundleFile.getZipFile(ZipBundleFile.java:92)
at org.eclipse.osgi.baseadaptor.bundlefile.ZipBundleFile.checkedOpen(ZipBundleFile.java:65)
at org.eclipse.osgi.baseadaptor.bundlefile.ZipBundleFile.getEntry(ZipBundleFile.java:234)
at org.eclipse.osgi.baseadaptor.BaseData.getEntry(BaseData.java:96)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.getEntry(AbstractBundle.java:1281)
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.getContributionsTimestamp(RegistryStrategyOSGI.java:242)
at org.eclipse.core.internal.registry.ExtensionRegistry.computeTimeStamp(ExtensionRegistry.java:729)
at org.eclipse.core.internal.registry.ExtensionRegistry.stop(ExtensionRegistry.java:660)
at org.eclipse.core.internal.registry.osgi.Activator.stopRegistry(Activator.java:141)
at org.eclipse.core.internal.registry.osgi.Activator.stop(Activator.java:61)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$3.run(BundleContextImpl.java:1032)
at java.security.AccessController.doPrivileged(AccessController.java:242)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.stop(BundleContextImpl.java:1028)
at org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker(BundleHost.java:396)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.stop(AbstractBundle.java:400)
at org.eclipse.core.runtime.internal.adaptor.BundleStopper.basicStopBundles(BundleStopper.java:86)
at org.eclipse.core.runtime.internal.adaptor.BundleStopper.stopBundles(BundleStopper.java:73)
at org.eclipse.core.runtime.internal.adaptor.EclipseAdaptorHook.frameworkStopping(EclipseAdaptorHook.java:156)
at org.eclipse.osgi.baseadaptor.BaseAdaptor.frameworkStopping(BaseAdaptor.java:288)
at org.eclipse.osgi.framework.internal.core.Framework.shutdown(Framework.java:538)
at org.eclipse.osgi.framework.internal.core.Framework.close(Framework.java:449)
at org.eclipse.osgi.framework.internal.core.OSGi.close(OSGi.java:41)
at org.eclipse.core.runtime.adaptor.EclipseStarter.shutdown(EclipseStarter.java:423)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:193)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:615)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
at org.eclipse.core.launcher.Main.run(Main.java:977)
at org.eclipse.core.launcher.Main.main(Main.java:952)
플러그인실행시 아래와 같은 에러가 난다면, 다음과 같이 수정해 보도록한다.
http://www.ibm.com/support/docview.wss?rs=3045&context=SSSRXA&dc=DB520&uid=swg21255417
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.
at java.util.zip.ZipFile.
at org.eclipse.osgi.framework.util.SecureAction.getZipFile(SecureAction.java:225)
at org.eclipse.osgi.baseadaptor.bundlefile.ZipBundleFile.basicOpen(ZipBundleFile.java:79)
at org.eclipse.osgi.baseadaptor.bundlefile.ZipBundleFile.getZipFile(ZipBundleFile.java:92)
at org.eclipse.osgi.baseadaptor.bundlefile.ZipBundleFile.checkedOpen(ZipBundleFile.java:65)
at org.eclipse.osgi.baseadaptor.bundlefile.ZipBundleFile.getEntry(ZipBundleFile.java:234)
at org.eclipse.osgi.baseadaptor.BaseData.getEntry(BaseData.java:96)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.getEntry(AbstractBundle.java:1281)
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.getContributionsTimestamp(RegistryStrategyOSGI.java:242)
at org.eclipse.core.internal.registry.ExtensionRegistry.computeTimeStamp(ExtensionRegistry.java:729)
at org.eclipse.core.internal.registry.ExtensionRegistry.stop(ExtensionRegistry.java:660)
at org.eclipse.core.internal.registry.osgi.Activator.stopRegistry(Activator.java:141)
at org.eclipse.core.internal.registry.osgi.Activator.stop(Activator.java:61)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$3.run(BundleContextImpl.java:1032)
at java.security.AccessController.doPrivileged(AccessController.java:242)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.stop(BundleContextImpl.java:1028)
at org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker(BundleHost.java:396)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.stop(AbstractBundle.java:400)
at org.eclipse.core.runtime.internal.adaptor.BundleStopper.basicStopBundles(BundleStopper.java:86)
at org.eclipse.core.runtime.internal.adaptor.BundleStopper.stopBundles(BundleStopper.java:73)
at org.eclipse.core.runtime.internal.adaptor.EclipseAdaptorHook.frameworkStopping(EclipseAdaptorHook.java:156)
at org.eclipse.osgi.baseadaptor.BaseAdaptor.frameworkStopping(BaseAdaptor.java:288)
at org.eclipse.osgi.framework.internal.core.Framework.shutdown(Framework.java:538)
at org.eclipse.osgi.framework.internal.core.Framework.close(Framework.java:449)
at org.eclipse.osgi.framework.internal.core.OSGi.close(OSGi.java:41)
at org.eclipse.core.runtime.adaptor.EclipseStarter.shutdown(EclipseStarter.java:423)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:193)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:615)
at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
at org.eclipse.core.launcher.Main.run(Main.java:977)
at org.eclipse.core.launcher.Main.main(Main.java:952)
플러그인실행시 아래와 같은 에러가 난다면, 다음과 같이 수정해 보도록한다.
http://www.ibm.com/support/docview.wss?rs=3045&context=SSSRXA&dc=DB520&uid=swg21255417
목요일, 10월 04, 2007
JDepend를 이용하여 진행중인 프로젝트 분석
화요일, 10월 02, 2007
월요일, 10월 01, 2007
The unit Season 3 - Air
나를 웃게 해주는 재밌는 기사
토비님(http://toby.epril.com/?p=351) 블로그에서 재미있는 기사가 실려 업어와 봣습니다.
정희용기자 블로그에서 JCO개발자 리서치을 결과와 보도자료가 나왔다고 해서 읽어봤다.
보도자료를 보자.
먼저 조사결과를 보면 “응답자의 58%가 40세까지만, 72%는 45세까지만 개발하겠다”고 응답했다고 한다.
... 후반 생략....
대부분 마음은 저럴것이라 생각해봅니다.
토비님 말대로 그냥 웃고 넘어갈 일이라 생각도 해보게 됩니다.
요새 it현장에 젊은(?) 친구들이 유난이 적어 보입니다. 흠...
이것에 대해서 기자님의 평가들인지도 모르겠구요. 현실을 너무 않좋게만 이야기하는...
정희용기자 블로그에서 JCO개발자 리서치을 결과와 보도자료가 나왔다고 해서 읽어봤다.
보도자료를 보자.
먼저 조사결과를 보면 “응답자의 58%가 40세까지만, 72%는 45세까지만 개발하겠다”고 응답했다고 한다.
... 후반 생략....
대부분 마음은 저럴것이라 생각해봅니다.
토비님 말대로 그냥 웃고 넘어갈 일이라 생각도 해보게 됩니다.
요새 it현장에 젊은(?) 친구들이 유난이 적어 보입니다. 흠...
이것에 대해서 기자님의 평가들인지도 모르겠구요. 현실을 너무 않좋게만 이야기하는...
RSA7.0나름 빠르게설치하기
RSA7.0 설치하려면 최소 하루는잡아야한다.-.,-;;
이게 RSA를사용하기를망설이게 하는최대의적이 아닌가하다.
하루 잡은것은 시디 7장을인스톨하고 난 다음 최신 업데이트인 7.0.0.3 을 설치했을때로 가정하겟다.
그나마 가끔한번씩 실패해주는센스를 발휘하므로,실패라도 하면 이 툴은 절대 사람이 쓸만한 툴이 아니라고 가정해 버린다.ㅋㅋㅋ
그래도 쓰고 싶다면,최대한 빠른시간에 설치및 업데이트하는 방법을 소개한다.
(참고로,IBM도 이 문제를 인식했는지 초기 RSA버전에는 없고 Inatallation Manager 1.1(앞으로는 IM으로 명명하겟다)버전에 존재한다.방법은 설명하겟다)
RSA를 인스톨하면 시디 1번장으로 INSTALL을 하게되는데, RSA의 인스톨을 관장하는 IM인스톨이 된 후에
RSA를인스톨하게 된다. 일반적으로는 IM인스톨후에 RSA를 바로 인스톨하게되나 이렇게 인스톨하면 RSA 7.0을 인스톨한 후에
7.0.3을 다시 업데이트 해야하므로 시간이 두배는더 걸린다. 위에서 언급하였지만, IM1.1부터는 그럴필요가 없다.
그러므로, IM을 업데이트해야할 필요가 있다. IM을 인스톨하고 처음 IM이 구동되면 바로 RSA를 인스톨하려고 할것이다. 그러나 IM을 업데이트 해야하므로 인스톨하지 말고, IM을종료하고 다시 시작한다.
그러면IM이 자신을 업데이트 해야한다며 열심히 업데이트를 한다.(ㅜㅜ)
이러면 업데이트가 됐을것이다. 이제부터 RSA를 설치해야한다.
패키지 설치클릭하면, 자신이 설치하려고하는것들이 보인다. 오른쪽하단에 보면 '업데이트확인' 이런게 보일것이다.
이것을클릭하고 시작하면 업데이트되면서 설치가 된다. 참고 별표 두개 반이다.
혹시 패키지 설치를 클릭했을때 저장소 어쩌구 저쩌구 에러가 보인다면 저장소를 지정해주어야한다.
지정해주지못할경우 IM을 인스톨을 다시 시도하면, 업데이트된 IM이 시작할것이고 저장소가 설정 되어 있을것이다.
크....
이게 RSA를사용하기를망설이게 하는최대의적이 아닌가하다.
하루 잡은것은 시디 7장을인스톨하고 난 다음 최신 업데이트인 7.0.0.3 을 설치했을때로 가정하겟다.
그나마 가끔한번씩 실패해주는센스를 발휘하므로,실패라도 하면 이 툴은 절대 사람이 쓸만한 툴이 아니라고 가정해 버린다.ㅋㅋㅋ
그래도 쓰고 싶다면,최대한 빠른시간에 설치및 업데이트하는 방법을 소개한다.
(참고로,IBM도 이 문제를 인식했는지 초기 RSA버전에는 없고 Inatallation Manager 1.1(앞으로는 IM으로 명명하겟다)버전에 존재한다.방법은 설명하겟다)
RSA를 인스톨하면 시디 1번장으로 INSTALL을 하게되는데, RSA의 인스톨을 관장하는 IM인스톨이 된 후에
RSA를인스톨하게 된다. 일반적으로는 IM인스톨후에 RSA를 바로 인스톨하게되나 이렇게 인스톨하면 RSA 7.0을 인스톨한 후에
7.0.3을 다시 업데이트 해야하므로 시간이 두배는더 걸린다. 위에서 언급하였지만, IM1.1부터는 그럴필요가 없다.
그러므로, IM을 업데이트해야할 필요가 있다. IM을 인스톨하고 처음 IM이 구동되면 바로 RSA를 인스톨하려고 할것이다. 그러나 IM을 업데이트 해야하므로 인스톨하지 말고, IM을종료하고 다시 시작한다.
그러면IM이 자신을 업데이트 해야한다며 열심히 업데이트를 한다.(ㅜㅜ)
이러면 업데이트가 됐을것이다. 이제부터 RSA를 설치해야한다.
패키지 설치클릭하면, 자신이 설치하려고하는것들이 보인다. 오른쪽하단에 보면 '업데이트확인' 이런게 보일것이다.
이것을클릭하고 시작하면 업데이트되면서 설치가 된다. 참고 별표 두개 반이다.
혹시 패키지 설치를 클릭했을때 저장소 어쩌구 저쩌구 에러가 보인다면 저장소를 지정해주어야한다.
지정해주지못할경우 IM을 인스톨을 다시 시도하면, 업데이트된 IM이 시작할것이고 저장소가 설정 되어 있을것이다.
크....
금요일, 9월 21, 2007
eclipse 3.3에서 ve사용
이제 wtp가 있는 eclipse와 충돌 문제가 해결(?)되었나보다. 나름 반가운 소식인데..
나만 반가운건지도 모르겟네요. ㅋㅋ
here you can find zip-files of my working visual editor for eclipse 3.3.
These files are non official builds. So you use it on your own risk.
2007-09-03: these are new files: ChooseBeanDialog (tested with jfc) should be working - could not test on all Platfroms, jem is not included - so you should install the latest WTP
link: ve_eclipse_33_v200709032215_lin_mac.zip
link: ve_eclipse_33_v200709032215_win.zip
link: ve_src_33_v200709032215.zip
and here are the patches:
link: CDMFactoryImpl.txt
link: ChooseBeanSelector.txt
link: all_patches_ve.txt
2007-07-16: all files are updated and packaged with source, for information look in the newsgroup eclipse.tools.ve
link: ve_eclipse_33_lin_macosx.zip
link: ve_eclipse_33_win32.zip
원본 url: http://www.ehecht.com/eclipse_ve/ve.html
나만 반가운건지도 모르겟네요. ㅋㅋ
here you can find zip-files of my working visual editor for eclipse 3.3.
These files are non official builds. So you use it on your own risk.
2007-09-03: these are new files: ChooseBeanDialog (tested with jfc) should be working - could not test on all Platfroms, jem is not included - so you should install the latest WTP
link: ve_eclipse_33_v200709032215_lin_mac.zip
link: ve_eclipse_33_v200709032215_win.zip
link: ve_src_33_v200709032215.zip
and here are the patches:
link: CDMFactoryImpl.txt
link: ChooseBeanSelector.txt
link: all_patches_ve.txt
2007-07-16: all files are updated and packaged with source, for information look in the newsgroup eclipse.tools.ve
link: ve_eclipse_33_lin_macosx.zip
link: ve_eclipse_33_win32.zip
원본 url: http://www.ehecht.com/eclipse_ve/ve.html
수요일, 9월 19, 2007
http://cafe.naver.com/eclipseplugin.cafe 에 질문에 대한 답글을 달고 있으나, 답답하다.
현재 9월 19일이고 카페의 질문 글중에 감사하다는 이야기는 9월8일에 내가 올린 질문에 내가 감사하는 답글과 그 이전으로는 9월5일에 하늘지기님의 감사정도가 다이다.
몇십개의 질문을 올라왔고 답을 했건만, 겨우 나를 빼고는 한건의 감사정도의 인사가 다라니..
이건 심각한 상황인듯하다.
기본적으로 자신이 올린 질문에 대해 감사정도는 할수 있는사람들이 많았음 좋겠는데, 그것도 안돼니..
애라이, 술이나 쳐먹어야지... 뭐.. 다른 방법이 있겠나. ㅋㅋㅋㅋ
끙~~
현재 9월 19일이고 카페의 질문 글중에 감사하다는 이야기는 9월8일에 내가 올린 질문에 내가 감사하는 답글과 그 이전으로는 9월5일에 하늘지기님의 감사정도가 다이다.
몇십개의 질문을 올라왔고 답을 했건만, 겨우 나를 빼고는 한건의 감사정도의 인사가 다라니..
이건 심각한 상황인듯하다.
기본적으로 자신이 올린 질문에 대해 감사정도는 할수 있는사람들이 많았음 좋겠는데, 그것도 안돼니..
애라이, 술이나 쳐먹어야지... 뭐.. 다른 방법이 있겠나. ㅋㅋㅋㅋ
끙~~
피드 구독하기:
글 (Atom)







