Perspective

이클립스 워크벤치에서 perspective라고 하는 것은 툴바와 메뉴에 위치하게될 action들의 사용여부와 view의 초기 레이아웃을 정의하는 역할을 담당한다. 아래의 그림의 우측상단에 VICODE라고 선택되어 있는 부분이 바로 perspective를 의미한다.


이클립스에 기본적으로 제공되는 perspective가 몇가지 있다. Java를 선택하면 자바 어플리케이션을 개발하는데 필요한 action이 메뉴와 툴바에 나타날 것이고, Debug를 선택하면 디버깅을 위한 view들이 화면에 배치되는 것을 확인할 수 있다.

따라서 특정 목적(VICODE의 경우 임베디드 시스템 개발)을 가지는 개발환경을 이클립스에서 구현한다면, 이에 해당하는 action들만을 메뉴나 툴바에 나타내고 특정 정보를 화면에 보여주기 위한 view를 원하는 레이아웃에 따라 배치하고 싶을 것이다.

VICODE perspective를 선택했을 때를 살펴보면, Project 메뉴 아래에 필자가 여기저기서 주워와서 갔다 붙인 조악한 툴바 아이콘을 볼 수 있고 화면의 하단에는 따로 만들어서 추가한 Log, Result view가 존재하는 것을 알 수 있다. 이와 같이 perspective는 플러그인이 제공하는 특정 개발 환경을 정의하는 역할을 한다.

개념의 대한 설명은 여기서 마치고 구현방법을 소개하자면,
다음과 같이 org.eclipse.ui.perspectives 확장점을 이용한다.  

  <!– VICODE Perspective –>
  <extension
        point=”org.eclipse.ui.perspectives”>
     <perspective
           class=”edu.kaist.vicode.perspective.PerspectiveFactory”
           fixed=”true”
           icon=”icons/jdg2eProd.gif”
           id=”edu.kaist.vicode.perspective”
           name=”VICODE”/>
  </extension>

PerspectiveFactory.java의 내용은 다음과 같다.

package edu.kaist.vicode.perspective;import org.eclipse.ui.IFolderLayout;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
public class PerspectiveFactory implements IPerspectiveFactory {
public static final String ID_VICODE_ACTIONS = “edu.kaist.vicode.actionset”;
public static final String ID_VICODE_PROJECT_WIZARD =
  “edu.kaist.vicode.projectwizard”;
public static final String ID_VICODE_MODULE_WIZARD =
  “edu.kaist.vicode.modulewizard”;
public static final String ID_VICODE_LOG_VIEW = “edu.kaist.vicode.logview”;
public static final String ID_VICODE_RESULT_VIEW = “edu.kaist.vicode.resultview”;

public void createInitialLayout(IPageLayout layout) {
// Navigator
layout.addView(IPageLayout.ID_RES_NAV, IPageLayout.LEFT, 0.20f,
  IPageLayout.ID_EDITOR_AREA);
// Bottom : Another folder area, to stack additional views
IFolderLayout bottom = layout.createFolder(“bottom”,
  IPageLayout.BOTTOM, 0.8f, IPageLayout.ID_EDITOR_AREA);
bottom.addView(ID_VICODE_LOG_VIEW);
bottom.addView(ID_VICODE_RESULT_VIEW);
bottom.addView(IPageLayout.ID_PROBLEM_VIEW);

// Add Outline View
layout.addView(IPageLayout.ID_OUTLINE, IPageLayout.RIGHT, 0.80f,
IPageLayout.ID_EDITOR_AREA);
   
// Add new wizard shortcut
layout.addNewWizardShortcut(ID_VICODE_PROJECT_WIZARD);
layout.addNewWizardShortcut(ID_VICODE_MODULE_WIZARD);

// Add our actions
layout.addActionSet(ID_VICODE_ACTIONS);
}
}

위의 VICODE perspective가 선택된 화면과 소스코드를 비교해보면 이해하기가 수월 할 것이다. createInitialLayout() 메서드에서 넘어온 IPageLayout 인스턴스를 이용하여 레이아웃을 지정할 수 있다. 차례로 왼쪽의 Navigator를 추가하고 하단에 3개의 view를 추가한다. 그리고 우측의 Outline view를 정의한 후 추후에 다루게 될 마법사를 추가한다. 마지막으로 action에서 다루었던 action set을 추가한다. action set의 visible 속성이 false로 지정되었다면 이렇게 perspective에서 추가해주어야만 화면에 나타나게된다. 모든 것의 참조는 plugin.xml에서 정의한 ID로 이루어진다.

물론 이미 존재하는 perspective에 자신의 view나 action을 추가할 수 있는데 (JDT를 확장하는 경우) 이럴 때는 org.eclipse.ui.perspectiveExtensions 확장점을 이용해야 한다.

지름신

대부분의 남자들은 여자들에 비해서 평소에 돈을 쓸일이 많지 않다. 그러나 짧지 않은 시간동안 쓴 돈을 모아보면 결코 적지 않은 것은 주기적으로 지름신이 강림하시기 때문일 것이다. 나 역시 대학생일 때 과외를 해서 쏠쏠히 벌었던 돈이 다 어디로 갔는가에 대해서 생각해보면 컴퓨터를 비롯해 온갖 전자기기를 사는데 쏟아부었던 것 같다.

이번달은 랩비지급도 추석이후로 늦춰지고, 쌍춘년의 여파로 적잖은 축의금과 그 밖에 졸업앨범비와 같은 예상치 못한 지출이 발생하며 CMA계좌 잔고가 20만원대를 기록하고 있다. 그런데도 불구하고 지름신이 강림하시려고 한다. 요즘 사고 싶다는 생각이 드는 물건은 바로 이녀석!

아이팟 나노 2세대

오늘 쥬크온에서 MP3 한곡에 10원 상품권을 구입했고, 이미 CD로 주문해놓은 이승철 8집을 다운받았다. 320 kbps로 다운받을 수 있어서 역시 음질이 좋았고, 이승철 8집의 노래는 더욱 좋았다. 실제 CD는 다음주에나 도착할 것이기에 구입한 mp3를 쥬크온 플레이어에서 음악 CD로 구워서 듣게 되었는데, 컴퓨터로 들을 때와는 전혀 다른 느낌. 똑같은 헤드폰을 쓰고 듣고 있는데도 풍부한 음량과 타격감은 감동을 선사하기에 충분. 어차피 320 kbps 정도의 샘플링 레이트라면 사람이 듣기에 음질의 손상은 없을테고 기기가 들려주는 음색의 차이가 아닐까? 따라서 나의 CDP를 아끼고 사랑하는 것으로 지름신을 외면해보아야겠다.

 

Google Notebook

다른 사람의 블로그를 구경하다가 깜짝 놀랐다. 구글 노트북?  차분히 글을 읽어보니 구글랩에서 새롭게 개발한 웹페이지 스크랩을 위한 서비스의 이름이였다. 구글의 직원들에게는 자신이 맡고 있는 일 이외에 새로운 아이디어로 하고 싶은 일을 도전해볼 수 있는 시간이 주어진다고 하는데, 이렇게 시도되는 여러가지 서비스가 우리를 즐겁게 하고 있다.


웹서핑을 하다보면 두고두고 다시 읽고 싶은 좋은 글들을 만날 때가 많은데 막상 이를 어떻게 보관해야할지 막막하다. 지금까지는 네이버 블로그에 저장해두었는데 이제는 해당내용을 긁고 오른버튼 눌러서 나오는 Note this 버튼을 누르는 것으로 간단히 보관할 수 있게 되었다.

익스플로어나 불여우에 플러그인 형태로 설치되며 사용법은 매우 간단하다. 처음 플러그인을 설치하면 스크랩 방법과 열람하는 방법을 간단히 설명해준다. 구글 UI의 매력은 무엇보다도 단순함과 실용성에 있다는 것을 다시 한번 느끼끼게 해주었다. 웹서핑 중 만나는 간간히 보관하고 싶은 문서가 있는 분들은 도전해보시길.

http://www.google.com/notebook/

백전백패

나의 생활 패턴은 점차 과거로 회귀하고 있다. CD로 음악을 듣고, TV를 보기 보다는 책을 읽고, 컴퓨터 보다는 손으로 글을 쓰는 것에 만족을 느낀다. 이에 흐름을 같이하여 놀이문화(?)에도 변화를 시도하기로했다. 그래서 선택한 것은 바둑! 선택의 이유는 바둑이 여러가지로 도움이 많이 된다는 생각이 들었기 때문이다. 특히나 산만한 나에게는 집중력의 측면에서!

즐길 줄 알려면 배워야 한다. 바둑의 룰은 어렸을 때 동네 친구들과 땅바닥에 앉아서 장기, 오목 둘 때 어렴풋이 배워두었다. 하지만 룰만 알고 바둑을 두면 ‘바둑돌따먹기’ 게임이 되기 쉽다는 것은 바둑을 처음 두어본 사람은 누구나 경험했을 것이다.

시간나는대로 틈틈히 온라인 강좌를 보며 감을 잡고 있다. 돌을 움직이는 방법인 ‘행마’와 초반의 세력을 구축하는 ‘포석’, 생사를 가늠하는 ‘사활’ 등등. 어설프게 스스로 배워나가며 온라인에서 대국을 즐기고 있는데 아직 이긴적이 없다. 공부한 것들을 실전에 적용하기란 쉽지 않으나 조금씩 바둑판을 넓게 바라보는 안목이 생기는 것 같다.

이번 추석 연휴에는 바둑의 기본을 닦을 수 있는 시간을 갖으려고 한다. 셀 수 없이 많은 전략이 존재하는 바둑이라는 게임이야 말로 제대로 즐기는 법만 터득한다면 그 어떤 컴퓨터 게임보다 재밌지 않을까?

건강검진

학교에서 무료로 제공하는 건강검진을 어제 받았다. 물론 건강검진을 받아야 기숙사에 들어갈 수 있긴 하지만, 내년에 기숙사에 들어가는 일은 없어야 하겠지. 어제는 졸업사진을 찍는 날이기도 했는데 워낙 프로필 사진과 그룹사진을 찍는데 시간이 오래 걸려 기다리는 시간에 정장차림으로 건강검진을 다녀왔다.

대부분의 검사항목이야 이미 많이 받아봐서 별로 흥미가 없지만 모두들 체지방측정에는 관심이 많다.  체지방 측정과 스트레스 검사는 원하는 사람에 한해서 이루어지고 검사결과를 프린트해서 주기 때문에 검사 후에 이를 살펴보고 주변사람과 비교해보는 재미가 있다.

한창 달리기를 해서 살이 빠지고 있던 작년과  간간히 운동을 하는 올해의 결과는 조금(?) 달랐다. 외형적인 변화는 일단 신기하게도 키가 컸다! 177.6cm에서 178.1cm가 되었고 몸무게도 늘어서 75kg에서 78.6kg이 되었다. 체지방률은 17.9%에서 19.3%로 증가했으며 적정체중은 74.6kg이라고 한다. (작년 72.8kg) 한마디로 정리하자면 벌크의 향상!

지방량을 4kg만 줄이면 바람직한 몸매! 요즘 운동을 꾸준히 안하고 양껏 먹었더니 살이 많이 쪘는데, 새벽에 학원갈 생각하면 밤에 뛰기가 부담스럽다. 쌀쌀한 날씨에 뛰는 기분도 그다지 반갑지 않고. 꾸준히 달리던 작년에는 감기와 소원하게 지냈었는데 최근에는 환절기를 맞아 감기를 달고 산다. 뭔가 대책이 필요하다!

잔디구장

카이스트에 잔디구장이 생겼다! 지난 여름방학중 시작된 동측 원운동장 공사는 한동안 우리의 궁금증을 자아냈다. ‘설마 잔디를 깔기야 하겠어?  그냥 우레탄 트렉을 만드는거겠지.’ 정도로 예상하고 있었는데 언젠가 부터 운동장이 초록색으로 물들기 시작했고 밤마다 커다란 조명탑에서 불 빛이 쏟아졌다. 카포전 직전(?)에 완성된 잔디구장은 매일 밤 12시까지 밝은 조명이 쏟아지고 있다.

졸업하기 전에 꼭 잔디구장에서 축구를 해보고 싶어서 룸메이트인 순일군의 연구실과의 경기를 추진하여 어제밤 게임이 이루어졌다.  각 팀당 몇명의 용병(DB랩, TC랩)을 포함한 PL랩 vs NC랩의 경기였다. 밤 9시에 운동장에 가보니 이미 십수명의 사람들이 경기를 하고 있었기에 1시간 넘게 기다려야했다. 그 동안 골대 뒷 쪽 공터(?)에서 미니게임을 하면서 시간을 보냈는데 사실 이 미니 게임이 더 힘들었다.

시간이 흘러 NC랩도 모두 도착하고 10시 20분쯤에서야 비로소 게임이 시작되었다. 우리랩 사람들은 이미 미니 게임으로 지쳐있었고 NC랩은 전력이 고르고 탄탄하다고 생각했기에 우리가 이길꺼라는 예상은 할 수가 없었다. 쉽게 가능한 예상대로 전반전은 우리가 내내 밀렸다. 난 오른쪽 공격수였는데 공이 수비지역에서만 머물었기에 공을 몇 번 못잡았다. 워낙 수세에 몰리다 보니 공격할 기회가 와도 공격지역에 사람이 없어서 결정적으로 드리블을 못하는 나는 어찌할 바를 모르다가 한번의 힘없는 유효슈팅을 날린 것에 만족해야했다. 하지만 우리의 수비는 건철형을 필두로 상대방의 파상공세를 훌륭하게 막아주었기에 전반전은 득점없이 비길 수 있었다.

후반전이 시작되어 용병인 DB랩의 경모형과 우리랩의 재호형이 공격으로 치고 올라 오면서 공격의 실마리가 풀리기 시작. 상대편의 최종수비수가 재호형을 제끼려고 하는 것을 본 순간 생각하기를 만약에 수비수의 약간 오른쪽에 있는 재호형을 제끼기 위해 수비수가 왼쪽으로 치고 나올 때 공이 길다면 분명 나에게 찬스가 올 것 같았다.  내 예상은 적중했고 공이 나에게로 굴러와 본능적으로 슛을 날렸는데 거짓말 처럼 골키퍼의 키를 넘기고 들어가버렸다. 나의 어설픈 볼 처리 능력에 방심하던 상대편은 아마도 적잖이 당황했을 것이다. 나에게 킬러본능이???

그 순간부터 우리가 이길 수 있다는 분위기가 느껴졌다. 상대의 코너킥 이후 혼전상황에서 날라온 골이나 다름없는 슛팅을 골키퍼 창범이가 펀칭으로 걷어냈는데 이는 한골을 넣은 것이나 다름 없었다. 아니 그 이상일지도 모르겠다. 우리는 계속 대등한 경기를 펼칠 수 있었고 경모형의 추가골로 2:0으로 깔끔하게 승리를 챙길 수 있었다. 잔디구장에서의 야간게임은 정말 즐거웠다. 졸업이 얼마남지 않은 것이 아쉬울 정도로. 다음주에는 리턴매치?

펀드수익율


지난 8월 14일 동양종금에 CMA 계좌를 개설하면서 수수료 면제 혜택을 받기 위해 적립식 펀드에 가입했다. 모든 금융자산을 우리은행에서 동양종금으로 이동하면서 두개의 펀드에 가입하고 나머지 금액은 CMA계좌에 넣어두었다. 두 펀드 모두 한달이 조금 넘은 지금 시점에서 4%를 상회하는 좋은 수익률을 올리고 있다.

돈이 돈을 만든다. 현재 원금 50만원으로 대략 2만원의 수익을 올리고 있는데, 만약 원금이 5천만원이였다면 한달사이에 2백만원의 수익을 올렸을 것이다. 주식에 대해서 무지했던 어린시절에는 주식으로 수익을 올리는 것을 불노소득이라 단정지어 버리고는 부정적으로만 바라보았는데, 단타매매가 아닌 장기적인 관점에서의 투자로써 기업에 자금을 빌려주고 경제활동으로 생산된 파이를 공평하게 나눈다고 생각한다면 경제에 기여하는 일일지도 모르겠다.

한동안 경제관련 책을 읽으면서 알게된 사실(?)은 우리나라도 곧 미국의 다우지수가 10년사이에 10배로 상승한 것과 같은 시기가 올 거라는 것이다. 부동산 시장의 가치하락과 베이비붐 세대들이 경제의 중심에 서면서 투자의 방향이 주식시장으로 쏠리게 되는 등의 근거는 그럴듯해 보인다. 내년부터 돈을 벌어 투자할 수 있다는 사실이 다행스럽게 느껴지는 요즘이다. 나는 우리의 경제를 믿는다. 어차피 우리는 대한민국이라는 배를 함께 타고 있다.

Plug-in Development Environment

Plug-in Development Environment(이하 PDE)는 그 자신이 플러그인이면서 플러그인을 개발하는 환경을 제공한다. 우리가 일반적으로 다운받는 Eclipse SDK에 기본적으로 포함되어 있다. 이는 플러그인 개발의 편의를 도모하기 위해 플러그인의 정보를 담고 있는 plugin.xml을 효과적으로 편집할 수 있는 플러그인 설명서 편집기와 개발 중인 플러그인를 실행하고 디버깅할 수 있는 환경을 제공한다.


위의 그림은 여러 페이지로 구성되어 있는 플러그인 설명서 편집기이며 plugin.xml 파일을 쉽게 편집할 수 있도록 도와주는 역할을 한다. 이클립스 3.0에서 개발을 시작하였고 현재는 3.2 버전을 사용하고 있는데 플러그인의 구조가 적잖이 변경되었다. 이전에는 대부분의 정보가 plugin.xml에 저장되었던 것에 반하여 3.2 버전에서는 일부정보가 MANIFEST.MF 파일에 저장된다. 따라서 3.2 버전에서의 plugin.xml은 확장점과 확장에 관한 내용만 담고 있다.

각각의 페이지에 대해서 간략히 설명하자면,

Overview – 플러그인의 ID, 이름, 버전, 제작자등의 정보
Dependencies – 플러그인이 의존하고 있는 다른 플러그인의 집합
Runtime – 런타임에 client에게 export할 package의 집합
Extenstion – 확장정의
Extension Points – 확장점정의
Build – 빌드할때 포함해야할 파일등 플러그인 빌드 관련 설정
MANIFEST.MF – MANIFEST.MF 파일 텍스트 편집기
plugin.xml – plugin.xml 파일 텍스트 편집기
build.properties – build.properties 파일 텍스트 편집기  

정리하자면,

Overview, Dependencies, Runtime 페이지를 수정하면 MANIFEST.MF 파일이, Extenstion, Extenstion Points 페이지를 수정하면 plugin.xml 파일이, Build 페이지를 수정하면 build.properties 파일이 수정된다. 텍스트 편집기에서 파일을 직접 수정한 내용도 각 페이지의 폼에 바로 적용되어 상호보완적으로 편집할 수 있다.

플러그인의 실행을 이해하기 위해서는 host 워크벤치와 runtime 워크벤치의 개념을 이해해야한다. 먼저 host 워크벤치는 현재 PDE를 이용해 플러그인을 개발하고 있는 워크벤치를 의미한다. host 워크벤치에서 개발 중인 플러그인의 Run을 구성해 실행시키면 쉽게 말해서 이클립스가 하나 더 뜬다! 이 것이 바로 runtime 워크벤치다.


위의 그림에서는 PDE에서 vicode 플러그인의 Run을 구성하고 있다. 여기서 Plug-ins 탭으로 들어가보면 host 워크벤치와 runtime 워크벤치의 개념을 이해할 수 있다. 여기서 선택된 것은 runtime 워크벤치를 실행할 때 포함하는 플러그인을 의미한다. 다시 말하면 runtime 워크벤치는 host 워크벤치에 포함된 플러그인에 더하여 현재 개발 중인 플러그인을 추가한 워크벤치를 의미한다. (물론 개발하는 플러그인과 의존관계가 없는 플러그인은 제외하고 수행해도 무방하다)  

개념을 잡는 것에 도움을 드리기 위해 씌여지고 있는 글이기 때문에 실제 PDE를 사용하는 예제를 수행해보고 싶으신 분은 이클립스 메뉴의 Help > Help Contents를 클릭하시고 나오는 메뉴얼에서 Platform Plug-in Developer Guide > Simple plug-in example을 참조하시기 바랍니다.

1리터의 눈물


지난 주말 이틀동안 한번에 몰아보았던 일본 드라마 “1리터의 눈물”. 드라마 내용이 슬퍼서 1리터까지는 아니였지만 11화를 보면서 내내 울었던 것 같다. 이 드라마는 실제 인물을 바탕으로 하고 있어서 더 마음이 아팠다. 시간이 지날 수록 소뇌가 부서지면서 운동능력을 상실하여 점차 걸을 수도 말할 수도 없게 되는 ‘척수소뇌변성증’이라는 불치병을 앓게되는 15세의 소녀가 이 병을 받아들이고 현실을 인정하면서 끊임없이 삶의 의미를 찾고자 노력하는 과정을 그리고 있다. 주인공인 아야가 25세에 숨을 거두기까지 썼던 일기들이 모여 책으로 출판되었고 일본에서 많은 사랑을 받고 있다고 한다. 지금까지 보았던 어떤 드라마보다도 감동적이였고 많은 생각을 하게 해주었다. 15세의 아야가 의사에게서 자신의 병을 듣고 나서 이런 질문을 한다.

“왜 제가 병에 걸린거죠?”

그 누구도 이 질문에 대답할 수 없었다. 운명으로 받아들이라고 하기에는 너무 가혹하다. 공평하다고 믿고 싶은 이 세상에서 일어나는 이러한 불공평한 일들을 나는 어떻게 설명할 도리가 없다. 하지만 한가지는 분명한 것은 자신의 의지로 장애를 짊어지고 살아가는 사람은 없기에 우리는 서로 돕고 살아야 한다는 것. 건강하게 살아갈 수 있다는 것 만으로도 열심히 살아가야 할 의무가 있지 않을까?