Action

Eclipse 플러그인 개발에서 action이라고 하는 것을 간단히 정의하자면 메뉴나 툴바의 아이콘을 클릭하였을 때 수행되는 어떤 일이라고 이야기 할 수 있다. IDE에서 소스를 편집하는 editor 혹은 무언가 정보를 보여주는 viewer를 제외하면 대부분의 기능이 바로 action의 형태로 기여된다고 할 수 있다.

action에 대해서 공부하기 이전에 알아야 할 것이 있는데 action set 이라고 하는 녀석이다. 이는 menu와 action으로 구성되어 있는 action을 정의하기 위한 논리적인 집합이라고 생각하면 되는데 일단 다음의 plugin.xml의 일부를 읽어보자.

<!– Action Definition –>
  <extension
        point=”org.eclipse.ui.actionSets“>
        <actionSet
              id=”edu.kaist.vicode.actionset”
              label=”Co-Design Actions”
              visible=”false”>

           <menu
                 id=”edu.kaist.vicode.interfacemenu”
                 label=”Interface”>
              <separator name=”actionGroup”/>
           </menu>
            <menu
                 id=”edu.kaist.vicode.verificationmenu”
                 label=”Verification”>
              <separator name=”actionGroup”/>
           </menu> 
            <!–  Generate Interface for Simulation –>
           <action
                 class=”edu.kaist.vicode.actions.SimulationInterfaceGenAction
                 disabledIcon=”icons/config-linker.gif”
                 enablesFor=”1″
                 hoverIcon=”icons/config-linker.gif”
                 icon=”icons/config-linker.gif”
                 id=”edu.kaist.vicode.actions.simulationinterfacegen”
                 label=”Generate Interface for Simulation”
                 menubarPath=”edu.kaist.vicode.interfacemenu/actionGroup”
                 style=”push”
                 toolbarPath=”edu.kaist.vicode.interfacemenu”
                 tooltip=”Generate Interface for Simulation”>
              <!– Project에 대해서만 적용가능한 Action –>
              <selection class=”org.eclipse.core.resources.IProject”/>
           </action>

action에 대한 기여는 action 기여를 위한 확장점(extenstion point)이 있어서 여기에 바로 기여(extenstion)하는 것이 아니라 그 것을 둘러싼 action set에 해당하는 확장점(org.eclipse.ui.actionSets)에 기여 함으로써 이루어진다.

menu는 action의 분류를 제공한다. 아래에 정의되어 있는 각 action들이 UI에 나타나려면 적어도 하나 이상의 menu를 지정해야한다. 위의 플러그인을 수행하면 “Interface”와 “Verification”이라는 최상위 메뉴가 (실제로 그 메뉴에 기여하는 action이 존재하는 경우) 메뉴바에 나타난다. menu의 정의는 메뉴바뿐만 아니라 툴바의 분류가 되기도 하며 어떻게 사용되는지는 action 태그의 menubarPathtoolbarPath에 달려있다.

메뉴는 하나 이상의 separator를 가진다. 쉽게 설명하자면 인터넷 익스플로러에 파일 메뉴를 클릭하면 4가지 그룹의 메뉴가 나타나는 것을 볼 수 있으며 이는 4개의 separator를 하나의 menu 태그에서 정의하는 것으로 구현될 수 있다. 그리고 각각의 action은 그들이 속해야 하는 menubarPath = “menu의 id/separator의 name” 형태로 자신이 UI의 어디에 나타나야 하는지를 지정할 수 있다. 툴바에 기여하는 경우에는 separator를 지정할 필요가 없다.

여기서 action set의 중요한 속성을 하나 살펴보자. Eclipse 플랫폼은 다수의 플러그인을 포함하여 동작하고 있다. 모든 플러그인이 제공하는 action과 menu가 UI에 모두 나타난다고 상상해보면 어떨까?

나중에 perspective에 대한 글에서 자세히 설명하겠지만, 이와 같은 문제를 해결하기 위해서 플러그인이 제공하는 환경과 기능을 관리할 수 있는 perspective라는 개념을 도입하였다. Eclipse 플랫폼에 기본적으로 포함되어 있는 perspective에는 Java, Debug, Resource등이 있다. Java라는 perspective를 선택하면 자바프로그램을 편집하는데 필요한 에디터와 뷰어 그리고 툴바의 아이콘등이 나타나는 것을 알 수 있다. Java와 Resource perspective를 변경하면서 툴바를 살펴보면 그 차이를 알 수 있을 것이다.

action set에서 visible 속성을 이용하여 action set에 포함되는 menu와 action들이 perspective와 상관없이 무조건 UI에 나타날 것인지 아닌지를 true, false로 지정할 수 있다. 다시 말하면 이 값이 true인 경우 항상 action set에 포함되는 것들이 UI에 표현되고, false인 경우에는 특정 perspective에 action set을 포함시켜 그 perspective로 전환되었을 때만 UI에 표현하게 한다. 자세한 내용은 perspective에 대한 글에서 다룰 생각이다.

지금까지는 action set의 구조와 메뉴(menubarPath)와 툴바(toolbarPath)에 각 action이 어떻게 추가될 수 있는지를 살펴보았다. 지금부터는 action 자체에 대해서 살펴보자. action에서 지정되는 클래스는 IWorkbenchWindowActionDelegate 인터페이스를 상속해야 한다.

public class SimulationInterfaceGenAction implements
IWorkbenchWindowActionDelegate {
private IStructuredSelection selection;

public void dispose() {
// TODO Auto-generated method stub
}
public void init(IWorkbenchWindow window) {
// TODO Auto-generated method stub
}
public void run(IAction action)
{
// TODO Auto-generated method stub
IProject project = (IProject) selection.getFirstElement();



}
public void selectionChanged(IAction action, ISelection selection) {
// TODO Auto-generated method stub
if (selection instanceof IStructuredSelection) {
  this.selection = (IStructuredSelection) selection;
}

}
}

action을 구현한 클래스는 위와 같은 구조를 가지게 된다. 툴바의 아이콘이나 메뉴를 클릭하면 해당 action의 run() 메서드가 호출되어 특정 작업이 수행된다. 여기서 추가로 알아야 할 것은 특정 action은 특정 selection과 관계를 맺을 수 있다는 것! 즉 action을 수행하는 대상이 무엇인지 알아야 한다. 예를 들어 JDT에서 메서드의 이름을 바꾸는 리펙토링 액션을 수행한다고 한다면 분명 선택한 메서드가 있을 것이다. 이러한 선택을 selection이라고 하며 selectionChanged() 메서드에서 이 selection을 얻어올 수 있다. 이렇게 얻어온 selection을 통해 특정 영역에 해당하는 action을 수행하게 된다.

action은 selection의 형태에 따라 enable/disable 될 수 있다. 이를테면 어떤 action은 프로젝트(IProject)만을 선택으로 받아들일 수 있고, 어떤 action은 디렉토리(IFolder)에 대해서만 작업을 수행할 수 있다.  이는 plugin.xml에서 selection 태그로 지정할 수 있다. 심지어 name 속성을 이용하면 특정 파일명에 대해서만 action을 제한할 수 있다.

Are You Windows Vista Ready?


여기를 방문하면 현재 자신의 컴퓨팅환경에서 Vista를 돌릴 수 있는 확인할 수 있다. 연구실에서 사용하고 있는 나의 시스템에 자부심을 가지고 있었는데 어이없게도 결과는 Minimum Pass! Vista의 GUI가 화려하기 때문인지 다른 부분은 충분하였지만 그래픽 카드에서 많은 부족함을 나타내었다. 살펴보면 CPU 파워도 그리 넉넉한 편은 아닌 것 같다.

어렸을 때 부터 항상 새로운 운영체제가 나타나면 꼭 설치를 해보아야 직성이 풀렸다. 덕분에 리눅스는 수십번도 더 깔았던 것 같다. 매우 다양한 배포판이 수시로 배포되었기 때문이다.

Window Vista RC1이 발표되었고, 여기를 방문하면 인증키를 얻을 수 있다. 현재 64비트 버젼으로 이미지 파일을 다운받고 있는데 그 용량이 3.59GB로 DVD를 이용해야한다. 과연 오늘 새로운 윈도우를 볼 수 있을것인가?

배려

배려
한상복 지음/위즈덤하우스

영어회화 수업에서 J. J. 라는 분과 이야기를 나누었을 때 이 책에 대해서 소개해주셨다. 그저 흔한 베스트셀러중에 하나이지 않을까 하는 마음에 무심코 읽기 시작했는데, 내용이 흥미롭기도 했거니와 적잖은 감동을 전해주기도 했다. 한국분이 쓴 이야기라서 그런지 더 마음에 잘 와닿은 것 같다.

중학교 시절 PC통신으로 친하게 지냈던 친구가 있었다. (같은 중학교 동창이기도 했던) 그 친구에게 허심탄회하게 나의 단점에 대해서 물어본 적이 있었는데, 그 친구의 대답은 내가 남을 배려할 줄 모르는 것 같다는 것이였다. 그때 나는 부끄럽게도 배려라는 단어에 대해서 처음 생각하게되었다. 솔직히 이전의 나의 언어와 행동을 생각해보면 나밖에 몰랐다. 직언을 해준 그 친구에게 지금도 고마운 마음을 가지고 있다.

책을 읽고 생각하고 사람들과 이야기하다 보면 정말 중요한 것은 무엇인가에 대해서 고민하게 된다. 최소한 자신의 행복을 추구하며 다른 사람에게 피해를 주지 않아야 할테고, 더욱 바람직한 것은 나를 둘러싼 그들과 조화로운 관계를 맺으며 그 속에서 모두의 행복을 발견할 수 있다면 금상첨화가 아닐까 하는 생각이 든다.

이 책에서는 양적인(?) 성공을 위해서 정작 중요한 것을 놓치고 살아온 주인공의 직장생활 이야기를 통해 다른 사람들과 행복하게 어울려 살아갈 수 있는 지혜를 소개하고 있다.

영어회화 수업시간에 선생님에게 ‘배려’라는 단어를 영어로 설명했던 기억이 난다. 어설픈 영어로 설명하기가 수월하지 않아서 최대한 간단하게 이야기했는데, 지금 생각해보면 그 대답이 정답일지도 모르겠다.

Being concerned about other people first rather than myself.

CEO 안철수, 영혼이 있는 승부

CEO 안철수 영혼이 있는 승부
안철수 지음/김영사

이 책을 사서 읽은 건은 아주 오래전 일이다. 그 당시에 나는 별다른 생각이 없었고 이 책을 읽으면서 강렬한 그 어떤 느낌을 가질 수가 없었는데, 얼마전에 읽었던 “3인행”이라는 책에서 소개되었던 안철수의 인생관에 대한 짧막한 글을 읽으면서 나는 커다란 충격을 받았다. 그리하여 집에 있던 이 책을 연구실로 가지고와 다시 읽게 되었다.

나는 우주에 절대적인 존재가 있든 없든, 사람으로서 당연히 지켜나가야 할 중요한 가치가 있다면 아무런 보상이 없더라도 그것을 따라야 한다고 생각한다. 내세에 대한 믿음만으로 현실과 치열하게 만나지 않은 것은 나에게 맞지 않는다. 또 영원이 없다는 이유만으로 살아 있는 동안에 쾌락에 탐닉하는 것도 너무도 허무한 노릇이다. 다만 언젠가는 같이 없어질 동시대 사람들과 좀더 의미있고 건강한 가치를 지켜가면서 살아가다가 ‘별 너머의 먼지’로 돌아가는 것이 인간의 삶이라 생각한다.

중요한 것은 “건강한 가치관을 가지는 것과 자기 기준에 부끄럽지 않도록 실천하는 것“이라는 어떻게 보면 너무나 당연하고 단순한 이야기가 나에게는 왜 그리 크게 다가와서 뇌리를 떠나지 못하는지 모르겠다. 그동안 책을 통해 사람을 통해 나름 바람직한 삶의 가치관을 세우려고 노력하였으나 정작 스스로 그 것을 얼마나 지키고 살아왔는가에 생각이 미치면 부끄러울 따름이다. 끊임없이 갈구하다보면 언젠가 그러한 가치관이 내재화 되어 스스로의 엄정한 기준에 따라 살아가게 되리라는 기대를 하곤 하지만, 실은 아직 한참 부족하기 때문이리라.

정직과 성실 그리고 끊임없이 공부하는 자세를 견지하는 그가 꿈꾸는 것은 영혼이 있는 기업을 만드는 것이였다. 작년에 “기업가 정신”이라는 수업을 들을 때 공부했던 비전기업들이 가지는 핵심가치에 대한 소개가 나와 있어 반가웠다. “Built to Last”라는 책에 따르면 100년 이상 장수하고 있고 사회적으로 존경받고 있는 기업들은 그들의 존재가치를 이야기 할 수 있는  핵심가치를 가지고 있다. 안철수 연구소의 핵심가치는 다음과 같다.

우리 모두는 자신의 발전을 위하여 끊임없이 노력한다. 우리는 존중과 신뢰로 서로와 회사의 발전을 위하여 노력한다. 우리는 고객의 소리에 귀를 기울이고 고객과의 약속은 반드시 지킨다. 우리의 존재 의미는 다음과 같다. 우리는 끊임없는 연구, 개발을 통하여 함께 살아가는 사회에 기여한다. …

양적인 성공보다 질적인 성공을 그리고 조화로운 삶의 가치를 배워나가는 요즘이다.

RocKlassic Einstein’s Violin


Rock과 Classic음악의 조화를 뜻하는 이름의 RocKlassic 공연이 어제 밤에 KAIST 노천극장에서 열렸다. 내가 좋아하는 함신익 지휘자가 대전시향을 떠난 이후로 한동안 문화생활을 하지 않다가 오랜만에 학교에서 하는 좋은 공연이 있어 참가하게 되었다.

노천극장이 가득찰 정도의 많은 사람들이 모였다. 공연은 모두 KAIST 학생들에 의해서 이루어졌는데, 특히 반도네온(bandoneon) 이라는 악기의 음색이 상당히 매력적이였다. 독일 종교음악을 위해 만들어진 악기가 아르헨티나로 넘어가면서 이상 야릇한(?) 느낌을 주는 악기로 활용되었다고 하는데, 특히 이 악기로 연주한 왕의남자 OST는 감동적이였다. 개인적으론 “냉정과 열정사이 OST”의 피아노곡 연주가 가장 좋았고 유진박의 “드라마틱 펑크” 연주도 좋았는데 …

“드라마틱 펑크”의 연주는 매우 멋졌으나 연주자의 옷차림이 다소 올드하였기에 그 나이가 의심되어 유인물을 살펴보니 학부 4학년이였다. 옆에 있는 묘령의(?) 아가씨와 그 이야기를 하는데 옆에 있는 꼬마 아가씨가 엄마랑 대화하는게 들렸다.

“엄마! 난 아저씨인 줄 알았어. 뚱뚱하잖아”
“조용히 해라. 저 오빠가 들으면 섭섭하겠어.”

연주잘해봐야 다 소용없을지도 … 일단 멋지고 봐야 하는 세상아닌가 …