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을 제한할 수 있다.


여기를 방문하면 현재 자신의 컴퓨팅환경에서 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 안철수 영혼이 있는 승부
안철수 지음/김영사

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

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

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

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

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

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

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

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

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

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

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

동측기숙사 위로 가을하늘


일주일의 방학(?)이 끝나고 이번주 부터 다시 SDA 어학원을 나가고 있다. 매일 6시에 일어나는 생활이 주초에는 너무 힘들었는데 이제 좀 적응이 된 모양인지 컨디션이 나쁘지 않았다. 주변이 모두 평지라서 그런지 가을하늘은 너무나 광활한 느낌을 준다.

6시에 일어나서 6시 30분에 동측쪽문 버스 정류장에서 185번을 타고 학원으로 간다. 교실에 도착하면 6시 50분쯤! 약간은 이제 지루하기도 한 수업을 마치면 학교로 돌아와야 하는데 이때 항상 고민하게 된다. 버스를 타자니 타이밍이 안맞아 10~15분을 기다려야 한다. 그래서 어제 오늘은 날씨도 선선해서 걸어서 학교로 돌아왔다.

갑천 징검다리


시내를 가로질러 갑천 징검다리를 건너면 8시 30분이 되기 전에 학교 정문에 도달할 수 있다. 중간에 세븐일레븐에 들려 천원짜리 한줄김밥이나 삼각김밥을 사가지고 갑천을 지날 때 먹으면 아침식사까지 해결하는데 걸리는 시간은 버스를 타고 와서 학교식당에서 식사를 해결할때 보다 적게 소모된다.

"냉정과 열정사이 OST"를 들으며...
갑천 강바람을 맞으며...
삼각김밥을 뜯고 있자니...
신선놀음이 따로 없다...

그런데! 외롭다 ...

Preference는 IDE에서 흔히 볼 수 있는 환경설정을 의미한다. 우리가 어떤 특정 플러그인을 개발할 때, 그 플러그인에 특화된 환경설정이 필요한 경우가 있다. 예를 들어 설명하자면, 이전에 소개한 바 있지만 Esterel 언어는 소프트웨어 언어인 C로도 컴파일이 되고 하드웨어 언어인 Verilog로도 컴파일이 가능하다.

Preferences in Eclipse


Esterel 언어를 위한 개발환경에서 위와 같은 환경설정이 존재한다면 각 항목의 체크유무에 따라 소스코드의 컴파일시에 생성되는 아웃풋 파일의 종류를 결정할 수 있다. 이와 같은 작업을 위해서 알아야 할 확장점(Extension Point)에는 두가지가 있으며 이를 포함한 plugin.xml의 일부분의 내용은 다음과 같다.         

  <!-- vicode preference page -->
  <extension
        point="org.eclipse.ui.preferencePages">
     <page
           class="kr.ac.kaist.vicode.preference.VicodePreferencePage"
           id="kr.ac.kaist.vicode.preferencepage"
           name="VICODE"/>
  </extension>
  <!-- vicode preference initial data -->
  <extension
        point="org.eclipse.core.runtime.preferences">
     <initializer class="kr.ac.kaist.vicode.preference.Defaults"/>
  </extension>

첫번째 확장점인 org.eclipse.ui.preferencePages을 이용해 Preference page에 기여할 수 있으며, 두번째 확장점인 org.eclipse.core.runtime.preferences에서는 환경설정의 기본값을 지정할 수 있다.

우선 첫번째 확장점을 위한 클래스인 VicodePreferencePage를 살펴보자. 이 클래스는 PreferencePage를 상속하며 UI를 만드는 createContents() 메서드, Restore Defaults 버튼을 눌렀을 때 호출되는 performDefaults(), OK 버튼을 눌렀을 때 호출되는 performOk() 메서드등으로 구성되어 있다. 메서드 이름만으로 각 메서드의 역할을 알 수 있을 것이다.

다음 생성자(Constructor)와 performOk() 메서드를 통해서 환경설정을 어떻게 이용하는지 알아보자.

public VicodePreferencePage() {
super();
setPreferenceStore(Activator.getDefault().getPreferenceStore());
setDescription("Development environment settings for VICODE");
fCheckBoxes = new ArrayList<Button>();
}

public boolean performOk() {
IPreferenceStore store = getPreferenceStore();
for (int i = 0; i < fCheckBoxes.size(); i++) {
  Button button = (Button) fCheckBoxes.get(i);
  String key = (String) button.getData();
  store.setValue(key, button.getSelection());
}
return super.performOk();
}

생성자에서는 setPreferenceStore() 메서드를 호출하여 preference page에서 사용할 preference 저장소를 지정한다. performOk() 메서드에서는 preference 저장소를 얻어와 여기에 setValue() 메서드를 이용해 <key, value>의쌍으로 환경설정을 저장한다. 저장할 수 있는 값들은 boolean, double, float, int, String, long 등의 simple data type중에 하나이어야 한다. 위의 예제는 플러그인이 UI에 기여하는 경우(Activator 클래스가 AbstractUIPlugin를 상속하는 경우)에 해당하며 그렇지 않은 경우(Plugin 클래스를 상속하는 경우)에는 getPluginPreferences 메서드를 사용해야 한다.

정리하면 생성자에서 preference 저장소를 지정한 후, createContents() 메서드에서 preference page에 들어가는 UI를 작성한다. 그리고 각 버튼에 해당하는 코드를 작성한다. 이는 UI에 입력된 정보를 환경설정에 저장하거나 그 반대의 일이 될 것이다.

지금부터는 환경설정의 기본값(Default)를 지정하기 위한 클래스인 Defaults를 살펴보자. 여기서는 간단히 initializeDefaultPreferences() 메서드에서 setDefault() 메서드를 호출해서 각 key에 해당하는 기본값을 지정하기만 하면 된다.

public void initializeDefaultPreferences() {
// TODO Auto-generated method stub
// get preference store
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
store.setDefault("CDE_ESTEREL_C", true);
store.setDefault("CDE_ESTEREL_VERILOG", true);
store.setDefault("CDE_ESTEREL_BLIF", false);
}

지금까지 Eclipse plug-in 개발시에 preference를 활용하는 방법을 살펴보았다. 아래 첨부한 소스코드를 읽어보면 쉽게 이해할 수 있을 것이다. 예제코드에서 UI 부분은 JDT의 JavaBasePreferencePage 클래스의 것을 응용하였다.

Visitor 패턴은 AST(Abstract Syntax Tree)와 같은 자료구조를 순회하면서 필요한 작업을 정의하기에 용이하다. 이를 처음으로 접하게 된 것은 CEC(Comlumbia Esterel Compiler)의 소스코드를 분석할때였다. CEC는 Esterel 소스코드를 파싱하여 이를 XML 형태의 IR(Intermediate Representation)로 저장한다. CEC는 C++ 언어로 프로그램되어 있는데 XML 형태의 IR은 C++의 클래스 구조로 구성된 AST에 대응된다.

Esterel Source Code (Text) - AST (C++ Classes) - IR (XML)

배경은 이쯤에서 정리하고 본론으로 들어가보자. Esterel 언어는 하드웨어 언어인 Verilog로 컴파일되기도 하고 소프트웨어 언어인 C로 컴파일 되기도 하는 신기한(?)언어인데, Esterel 소스코드로 부터 C언어 코드가 나오기까지 IR을 XML 포맷으로 유지하며 여러단계의 독립적인 프로그램을 거치게 된다. 이때마다 XML 파일을 읽어 AST를 구축한 후 Visitor 패턴을 이용해 AST를 순회하며 필요한 작업을 수행한다. 물론 그러한 작업에 의해 AST가 수정되면 수정된 상태의 AST가 다시 XML형태로 저장된다.

Esterel Source Code - Parser - Expander - Dismantler - GRC synthesizer - C generator - C Source code

필자가 하고 있는 일은 동시설계 개발환경에서 Esterel 언어를 기반으로 임베디드 시스템을 정의하는 방법론을 제시하고 그 것으로 부터 임베디드 시스템 구현에 필요한 여러가지 인터페이스를 자동으로 생성하는 것이다. 임베디드 시스템을 XML 형태의 언어로 정의하도록 하고 이를 파싱하여 저장하는 나름의(?) AST를 자바 클래스로 구축하였다. 인터페이스 생성등 다양한 작업이 AST를 기반으로 이루어질 것 이며, 여기서는 AST에 저장되어 있는 정보를 다시 XML로 출력하는 프로그램을 예로 들어 Visitor 패턴을 설명하려고 한다.  

모든 AST의 클래스들은 다음과 같은 AbstractSpec 추상클래스를 상속한다. 여기에는 Visitor 패턴을 위한 메서드인 welcome 추상 메서드가 정의되어 있다.

package kr.ac.kaist.vicode.spec;
public abstract class AbstractSpec {
  public abstract void welcome(Visitor v);
}

그리고 당연히 모든 AST 노드에 해당하는 클래스들은 welcome 메서드를 정의해야 하는데 그 내용은 모두 다음과 같이 동일하다. 굳이 설명하자면 파라메터로 넘어온 visitor를 이용해서 자기 자신에 해당하는 visit 메서드를 호출하게 하는 것 이다.

public void welcome(Visitor v)
{
    v.visit(this);
}

다음으로 해야할 일은 Visitor 클래스를 생성하는 것이다. Visitor 패턴을 이용하는 클래스는 이 클래스를 상속받아서 visit 메서드를 구현하기만 하면 된다. 즉 파라메터로 입력받은 AST 노드에 해당하는 작업을 visit 메서드에 정의하면 된다.

package kr.ac.kaist.vicode.spec;

public abstract class Visitor {
  public abstract void visit(Spec n);
  public abstract void visit(Communication n);
  public abstract void visit(Api n);
  public abstract void visit(Rule n);
  public abstract void visit(DataFunc n);
  public abstract void visit(SignalFunc n);
  public abstract void visit(SignalDecl n);
  public abstract void visit(State n);
  public abstract void visit(Transition n);
  public abstract void visit(Set n);
}

Visitor 패턴을 사용하기 위한 준비작업은 모두 끝이 났다. 지금부터는 AST에 저장되어 있는 정보를 Visitor 패턴을 이용하여 AST를 순회하면서 XML형태로 출력하는 예제를 살펴본다. Spec2Xml 클래스는 Vistor 클래스를 상속하여 Visitor 패턴을 구현하고 있다. 각 visit 매서드에서 하는 일은 크게 두가지다. 하나는 해당 노드에 해당하는 작업을 수행하는 것이고, 나머지 하나는 자식 노드를 방문하게 하는 일인데 이과정을 위해서 단순히 각 AST 노드의 welcome 메서드를 호출하는 print 메서드를 정의하였다.

package kr.ac.kaist.vicode.spec.util;

import java.util.*;
import kr.ac.kaist.vicode.spec.*;

public class Spec2Xml extends Visitor {
  public void print(AbstractSpec n) {
       n.welcome(this);
  }

  public void visit(Spec n) {
       output("<spec>");
       print(n.getCommunication());
       print(n.getApi());
       print(n.getRule());
       output("</spec>");
  }

...

Vistor 패턴의 시작은 간단하다. AST의 최상위 노드에 대해서 print 메서드를 호출하면 자신의 자식노드에 대해서 visit 메서드를 호출하게 되고 이러한 일련의 과정을 통해 경우에 따라서 모든 노드를 방문하며 특정 작업을 수행할 수 있다. 위의 예제에서 Spec은 AST의 최상위 노드에 해당하며 이는 3가지 자식노드 (communication, api, rule)을 가지고 있으며 각각에 대해서 visit 메서드가 호출되도록 한다.  

지금까지 살펴본 것 처럼 Visitor 패턴은 AST와 유사한 자료구조를 빠짐없이 탐색하며 특정작업을 수행하기에 적합한 방법론을 제공한다. 특히 컴파일러나 인터프리터와 같이 AST를 사용하는 프로그램에서 잘 활용하면 유지보수가 용이하고 코드가 깔끔한 코드를 작성하는데 큰 도움이 될 것 같다.
시골의사의 아름다운 동행 2
박경철 지음/리더스북

이번 주말 서울에 다녀오면서 읽었던 책. 토요일 외출에서 돌아오는 길 지하철에서, 대전행 새마을 열차에서 대부분을 읽고 학교로 돌아오는 버스에서 비로소 책의 마지막 장을 넘길 수 있었다. 시골의사의 아름다운 동행 : 첫번째 이야기는 주로 저자가 운영하는 병원에서 겪었던 이야기를 바탕으로 하고 있는 반면에 두번째 이야기는 이야기를 나열했다기 보다는 어떤 경험으로부터 얻을 수 있는 삶의 교훈을 초점으로 책이 엮어졌다는 생각이 들었다.

의술을 펼치면서 삶과 죽음의 경계에서 저자가 느꼈던 혼란을 털어놓기도 하고, 나병환자를 대하는 자신의 솔직한 느낌과 부끄러웠던 기억을 있는 그대로 책에 옮겨놓았다. 책의 표지에 써있는 "죽도록 사람답게 살아가는 법을 알아가며" 라는 말이 정말로 어울리는 삶의 이야기와 그의 생각이 담겨있다. 특히 나는 평생에 걸쳐 모진 시련을 겪고도 남을 돕는 일에서 삶의 행복을 느끼는 한 할머니의 이야기가 가장 감동적이였다.  

정작 행복하면서도 행복을 느끼지 못하는 우리가 상상조차 할 수 없는 아픔과 시련을 겪는 많은 사람들의 이야기를 접하며 그러한 일들이 반드시 남의 이야기가 아니라는 생각을 하게 되었다. 내가 사랑하는 사람이 혹은 나 자신이 언젠가 사고를 당하거나 큰병에 걸려 병상에 눕게 될지 모르는 일이기 때문이다. 요근래 읽는 책들에서 주는 교훈은 한결같다. 바로 여기 지금에 살아라!

이번 이야기들은 '자신'의 입장에서 쓴 기록이 많다.
그래서 때로는 이야기들이 느슨하거나 다소 감정적으로 흐를 때가 있다.
하지만 나는 정말 내 삶의 일부인 그들의 이야기가 하고 싶었다.
무미건조한 늘 반복되는 대학원생활을 영위하다보면 문득 외롭다는 생각이 들때가 많다. 한마디로 사람이 그리워질때가 많다. 그럴때면 나를 찾는 누군가의 흔적을 확인하고 싶어서, 습관적으로 이메일이나 미니홈피의 방명록을 뒤져보거나 혹은 쪽지가 왔는지 확인하게 되는데 ...

얼마전부터 촌스러운 이름을 가진 그녀들의 쪽지가 종종 도착하곤 한다.

하이염~
이렇게 쪽지 날리기 까지 망설이다가 쪽지날리는건데염...
님 느낌이 너무 좋은데 저랑 채팅으로 애기좀 할래염?^^
혹시 애인이 있으시거나 관심이 없으시더라도
저는 님이랑 친구라도 되구 싶은데 어떠세염?^^
제가 원래 싸이를 하는데 2년 만남 사람과 헤어지구
이제 안할려구 하거든요...그래서 제가 가는 싸이트가 있는데..
http://www.nadocam.co.kr <--여기로오셔서...가입하시고..
로그인아래 화상채팅누르시고..
메신저 다운받으셔서 메신저 로그인 하시고 들어오시면 되욤.~!
닉네임은 깜찍한여우예여...^^;;
프로필에사진두있으니깐 보시구 쪽지주세여..
장난아니거든염... 장난 사절이에염^^

그녀들의 이름은 묘하게도 항상 촌스럽다.
김두옥, 권영자, 황효순, ...
나는 재미로 다음과 같은 답을 하곤 하는데 읽힌적은 없다.

이름이 촌스러워서 싫어요.

SDA 어학원을 2개월 다닌 후 처음으로 맞이하는 실전 경험! 선문대학교에 교환학생으로 와있는 중국학생 두명이 주기적으로 우리 연구실에 방문하고 있다. 전자과 학생인 이들에게 우리 연구실 프로젝트에 관련된 미션을 주어 소프트웨어를 공부하게함이 목적이다. 원래는 정한형이 이들을 맡았었는데 4주훈련을 가신관계로 내가 이들을 영접하게 되었다.

지난 번 미팅때 정한형 옆에 앉아서 이야기를 듣고 생각해보았는데 도무지 하고 싶은 말이 만들어지지 않아서 오늘의 미팅이 적잖이 걱정되었다. 중국학생들의 발음도 알아듣기 힘들었다. 예정시간 보다 늦게 그들이 도착했다! 생각외로 하고 싶은 말들의 조합이 잘 이루어졌다. 나름 SDA에서 배운대로 단/복수와 동사의 시제를 맞춰서 이야기 하려고 노력해보았다. 한가지 아쉬운건 th 발음에서 혀를 내밀지 못했다는 것!

어줍잖았지만 그래도 이야기를 할 수 있었다는데에서 자신감을 얻었다. 외국 사람을 만나도 그 들이 나를 배려해준다면 어느정도 의사소통은 가능할 것 같다. 영어회화는 실력 그 자체의 문제보다 우선은 자신감과 경험의 문제인 것 같다. 남은 석사기간동안 SDA 어학원 3단계까지 마치고 내년에 미국에 가거나 혹은 학회에서 영어발표를 하면 더 잘할 수 있겠지?


석우형이 21.3인치 모니터 두대를 받으시면서 한대를 나에게 주셨다. 얼떨결에 1600x1200 해상도의 모니터를 사용하게 되었는데, Eclipse에서 코딩을 많이 하는 나로서는 엄청 편리하다! 하지만 무엇보다 굉장한건 영화볼때!!! 이제는 주말을 연구실에서 보내도 나쁘지 않겠다.

지난 월요일 집을 출발하여 2박 3일의 짧은 여행을 시작하였다. 최초의 목적지는 초등학교 5학년부터 고등학교 1학년까지 나의 청소년기를 보낸 경상남도 창원! 서울역에서 동대구역을 향하는 KTX행 열차에 몸을 실었다. 기분좋게 앉아서 음악을 들으며 기차여행의 운치를 즐기고 있었는데, 광명역에서 부터 알수없는 냄세가 느껴지기 시작했다. 옆좌석을 보니 이슬람교도의 복장을 한 이국인 두명이 앉아 있었는데, 땀냄세인지 인종특유의 냄세인지 알 수 없었지만 다행히 30분 정도 지나니 코가 마비되어 괴로움(?)이 덜하였다.

동대구역


난생 처음 기차 환승이라는 것을 해보았다. 동대구역에서 다음 무궁화 열차를 기다리며 초코바를 먹고 있는데, 얼마전 사진으로 본 초등학교 동창인 동희가 사진의 바로 그 옷을 입고 내 눈앞에 나타났다! 서로 알아보고 깜짝 놀랐는데 알고보니 서울에서 부터 같은 열차를 타고온 것이였다. 창원역 내려 다시 만나기로 하고 헤어졌다.

역시 초등학교 동창인 원준이가 마중나와서 함께 아버지가 계시는 동서식품 창원공장으로 갔다. 회사 내부로 들어가 휴게실에서 아버지의 일이 끝나기를 기다리다가, 공장장님께 인사드렸더니 여행에 충분한 용돈을 주셨다. 회사에서 나와서 예전에는 5일장이 열렸지만 지금은 엄청난 유흥가가 되어버린 상남동에서 등갈비를 먹으며 지역 소주인 화이트를 한잔 걸쳤다.

반주를 곁들인 저녁식사가 끝나고 아버지는 사원아파트로 돌아가시고 원준이와 나는 잠깐 산책하면서 빨개진 내 얼굴을 식혔다. 그리고 난 후 몇년만에 원준이 집을 방문하게 되었는데, 변함 없이 그대로이신 원준이 부모님께서 반겨주셨다. 나중에는 동희까지 놀러와서 원준이 어머니와 함께 와인을 마시면서 즐거운 대화를 나누었다. 난 중간에 학원 수강신청한다고 영 정신이 없었지만 ^^;

동희를 집에 보내고 12시 30분이 되어서야 잠에 들었고, 5시 30분에 일어나서 창원을 출발했다. 지리산에 도착한 시간은 8시!  우리가 선택한 코스는 중산리~천왕봉~장터목~중산리 코스로 홈페이지 안내상으로는 총 8시간 30분으로 천왕봉을 정복(?) 할 수 있는 것이였다.

아직 한 참 멀었구나 ;;


5.4km를 오르며 들었던 생각은, 내가 왜 사서 고생을 하고 있을까? 역시 앉아서 공부하는게 제일 편해. 살면서 힘든 일이 얼마나 많을텐데 이정도는 아무것도 아니야. 등등. 오를때는 꽤나 힘들었다고 생각했는데 지나고 나면 다 잊어버리는 것 같다. 그리고 사실 내려오는 것이 더 힘들다. 오를 때는 잠시후에 느끼게 될 성취감을 생각하며 기대를 갖게 되는데 내려오는 것은 그렇지가 않다. 지루함과 피곤함을 견뎌내야 한다.

천왕봉 임박! 마지막 고비!


차에서 출발한 시간이 8시, 등산을 마치고 차로 돌아온 시간은 5시! 산행이 끝나고 나서 한발짝 물러나서 생각해보면 설악산보다 못하다는 생각을 떨칠 수가 없었다. 함께 한 원준군도 같은 생각. 정상에서 보여준 멋진 풍경이나 내려오면서 보았던 계곡의 비경이나 설악산이 더 아름다웠다. 게다가 결정적으로 지리산은 바위가 크고 많아서 내려오기가 수월치 않았다.

그렇게 힘들었던 산행을 마무리 하고 남해로 향했다. 가까이 보이는 모텔에 짐을 풀고 맥주와 안주를 사와서 먹고는 9시에 골아 떨어졌고 10시에 일어났다. 무릎 주변과 허벅지의 근육들은 너무나 알차게 뭉쳐있었다. 바다가 보이는 창밖을 보니 비가 억수로(?) 내리고 있었다. 약간의 드라이브를 즐기고 바다를 보며 잠깐 상념에 잠겼다가 창원으로 일찍 돌아왔다. 그리고 점심식사를 한 후 시외버스를 타고 대전으로 돌아옴으로써 짧은 휴가를 하루 더 일찍 마무리 했다.

비오는 남해 바다


지리산이 약간 실망을 안겨주기도했지만, 산의 정기를 받아서인지 기분전환이 제대로 된 것인지 정신적으로 충만해진 것 같다. 이제 다시 일상으로 돌아온 오늘을 열심히 살아가야겠지. 차분히 연구실에 앉아 있는 것도 나쁘진 않은 것 같다.

전부터 너무나 보고 싶었던 영화다. 그다지 흥행했던 영화는 아니라서 잘 모르고 있다가 주변사람들의 좋은 평가를 듣고 보려고 했으나 이미 영화는 상영이 종료되었었다. 클래식이나 연주곡들은 단지 따분하고 졸음이 쏟아진다고만 생각했던 내가 그 것을 즐기기 시작한 것은 바로 올해! "아마데우스"처럼 음악에 대한 영화에 자연스럽게 관심이 가는 것 같다.

영화 내내 흘러나오는 감미로운 연주곡이 너무나 아름다웠던 영화. 피아노 선생님인 엄정화의 연기는 매우 훌륭했고 최근에 본 영화중에 가장 감동적이였다. 특히 마지막 장면은! 한동안 잊고 지냈던 클래식을 다시 접하고 싶은 생각이 든다.

어렸을 때 피아노를 배운적이 있는데 체르니 30번에 들어서서 그만두었다. 그 때 벽에 부딛혔고 학원가도 잘 못쳐서 혼나기만 해서 너무 하기가 싫었다. 그때 아버지께서 지금 그만두면 나중에 후회할꺼라고 하셨는데, 지금 어린이 바이엘도 못치는 나는 조금은 후회가 된다. 다시 배우기엔 너무 늦어버렸겠지?

집에 도착한 금요일 이 후 삼일 째 방콕하며 휴가를 즐기고 있다. 심신이 지쳐 마냥 쉬고 싶었던 건지 아직도 집에 있는게 그다지 지루하지 않다. 어제의 "이터널 선샤인"에 이어 오늘은  "국경의 남쪽"과 "호로비츠를 위하여"를 연달아보았는데 ...

분명 진부한 스토리임에는 분명하지만. 서로 사랑하면서 함께할 수 없는 것이 가장 슬픈일이라고 생각하는 나로서는 영화보는 내내 안타까워 해야했다. 이미 상당히 현실적이 되어버린 나이지만 적어도 사랑 없는 결혼은 절대 하지 않아야겠다는 생각을 하게 되었다. 사랑과 결혼은 이해와 책임이 아닐까? 내 마음을 상대방에게 이야기 하는 그 순간만큼은 적어도 영원을 생각할만큼 내 마음에 확신이 있어야겠다는 생각을 다시 해본다.

이야기의 후반부에 해당하는 내용이 영화의 처음에 나오고 마지막에 다시 반복되면서 나를 너무나 혼란스럽게 했던 영화. "사람을 오래 사귀게 되면 남는건 남남이 되는 것" 이라는 짐캐리의 말처럼 많은 사랑은 아픔으로 끝나기 마련이고 때론 그런 기억들을 지우고 싶어질때가 있다. 영화에서 여자주인공이 먼저 그에 대한 기억을 지우고, 그 사실을 알게된 남자주인공도 기억을 지우려고 한다. 기억을 지우며 꿈을 꾸게 되는 남자주인공은 그녀와의 기억이 소중하다는 것을 깨닫게 되는데 ...

아무리 아픈 기억이라도 나는 그 것을 잊고 싶다고 생각해본 적은 없다. 단지 그 기억으로 인한 아픔이 시간의 도움으로 무뎌지기를 바랄뿐. 누군가를 만나서 겪어야할 행복과 아픔이 있다면 나는 그 행복의 크기가 크다고 믿는다. 적어도 아직까지는. 시간이 흘러서 추억으로 바라볼 수 있을 때가 되면 문뜩 생각나는 것은 좋았던 기억들인 경우가 많다. 쉽게 아픔이 지워지지 않을만큼 구구절절한 사랑을 해보지 않아서일지도 모르겠으나 ...
시골의사의 아름다운 동행
박경철 지음/리더스북

시골의사의 부자경제학 이후 두번째 접하게 되는 시골의사의 책. 이미 세번째 접할 예정인 "시골의사의 아름다운 동행 : 두번째 이야기" 역시 이미 이 책에 놓여있다.

경북안동에서 개인병원을 하면서 일어난 여러 애피소드들로 부터 '이웃'과 '나눔'에 대해서 생각해보게 한다. 반복되는 일상에서 접하기 어려운 어쩔때는 다소 끔찍하고 처참한 이야기들이 소개되고 있기도 하지만, 저자가 이 책을 통해 바라는 것은 많은 사람들이 세상을 좀 더 넓게 바라보게 되는 것이라고 한다.  

때로는 흐믓하여 웃게 만들고, 때로는 너무 마음이 아파 혹은 감동적이여서 울게 만드는 35편의 이야기를 담고 있다. 특히 "그녀의 미니스커트" 이야기는 정말 많은 생각을 낳게 했다.

의사는 자신이 가진 능력으로 다른 사람을 위해서 일 할 수 있다는 측면에서 보람을 찾을 수 있는 직업이라는 생각이 든다. 다른 사람의 생명을 살리기 위해서 하루하루 힘들게 자신의 소명을 다하고 있는 많은 의사분들에게 응원을 보낸다.

그제야 진우 씨는 문둥이의 아들이라는, 아내는 문둥이의 며느리라는, 아이들은 문둥이의 손자라는 굴레에서 해방되었다. 나는 진우 씨를 보면서 인생을 배웠다. 그는 자기에게 주어진 삶에 당당하게 맞선 용기 있는 사람이다. 그리고 인륜이 무너진 시대에 정말 사람답게 살고자 노력한 사람이다. "인간은 무엇으로 사는가?"라는 물음에 당당하게 "사람답게 사는 것"이라고 말할 자격이 있는 사람이다. 그는 자신의 삶을 통해 세상을 향해 이렇게 소리친 것이다. "그래, 나는 문둥이 아들이다! 이 진짜 문둥이들아!"

UML Diagram using Draw2D


Draw2D는 GEF에 내장되어 있기도 하지만 standalone으로 사용될 수 있는 그래픽 라이브러리다. GEF에서 그림을 그릴 때 내부적으로 이 라이브러리를 사용한다. Display a UML Diagram using Draw2D 문서를 읽고 금방 그 사용법을 익힐 수 있을 정도로 잘 구성되어 있다. 여러 Figure를 조합해서 하나의 component를 구성하고 그 component 사이에 connection을 정의할 수 있도록 되어있다. 물론 그림 처럼 connection에 해당하는 외관을 변경한다던지 레이블을 추가하는 등의 작업이 가능하다. Eclipse 혹은 SWT 기반의 어플리케이션에서 유용하게 사용할 수 있을 것 같다.  

내 영혼이 따뜻했던 날들
포리스트 카터 지음, 조경숙 옮김/아름드리미디어

책을 읽다보면 어떤 책은 너무나 느낌이 좋아서 좋은 사람들에게 권하고 싶을 때가 있다. 이 책은 그 중에서도 가장 먼저 추천해주고 싶은 책이 될 것 같다. 은정이가 선물해준 이 책은 오래전부터 알고 있었고 실제로 읽으려는 시도도 해보았으나, 책 읽는데 관심이 없었던 이전에는 몇 장 읽다가 그냥 흔한 꾸며낸 이야기라는 생각에 흥미를 못느꼈었는데, 이 책을 다시 접했을 때는 이 책이 저자의 어린시절의 추억을 그려놓은 자전적 성장소설이라는 것을 알게 되었다.

책의 표지에 보면 삶의 철학을 바꿔주는 작은 고전이라고 적혀있다. 책을 끝까지 읽고 나서 정말 그 말에 공감하게 되었다. 꼬마 인디언 "작은 나무"가 할아버지, 할머니와 함께 생활하며 생각하고 느끼고 배웠던 것들이 책에 고스란히 남아있다. 다른 사람을 배려하는 따뜻한 마음, 자연과 동물과의 아름다운 교감등 배울 것들이 너무나 많이 담겨있는 책이다.

건조하고 급박하게 돌아가는 물질문명 사회에 살고 있는 나를 포함한 우리들에게 정말 제목대로 영혼이 따뜻해지는 느낌을 선사할 수 있는 책이라고 생각한다. 삶을 어떻게 바라보고 어떻게 조화롭게 살아가야 하는지 생각하는 기회를 주었다.

어제는 랩세미나 발표후 몸이 안좋아서 일찍 기숙사에 들어가서 이 책을 끝까지 읽었는데, 연구실에서 이 책을 읽었더라면 큰일날 뻔 했다! 아직은 순수한(?) 감성이 내게 남아 있음을 확인할 수 있었다. 은정이가 나에게 추천해준 것 처럼 누구에게든 읽어보라고 권하고 싶은 책이다.

할머니는 어디서나 쉽게 죽은 사람들을 찾아낼 수 있다고 하셨다. 여자를 봐도 더러운 것만 찾아내는 사람, 다른 사람들에게서 나쁜 것만 찾아내는 사람, 나무를 봐도 아름답다고 여기지 않고 목재와 돈덩어리로만 보는 사람, 이런 사람들이 죽은 사람들이었다. 영혼의 마음은 근육과 비슷해서 쓰면 쓸수록 더 커지고 강해진다. 마음을 더 크고 튼튼하게 가꿀 수 있는 비결은 오직 한 가지, 상대를 이해하는 데 마음을 쓰는 것 뿐이다. 게다가 몸을 꾸려가는 마음이 욕심 부리는 걸 그만두지 않으면 영혼의 마음으로 가는 문은 절대 열리지 않는다. 욕심을 부리지 않아야 비로소 이해라는 것을 할 수 있기 때문이다. 반대로 더 많이 이해하려고 노력하면 영혼의 마음도 더 커진다.

겉표지가 너무 매력적인 음반. 사실 나는 랩을 그다지 좋아하지 않는데 싸이의 음악은 참 마음에 든다. 그걸 처음 느끼게 해주었던 것은 "Remake & Mix 18번" 음반이였다. 직설적인 가사에 거침없고 거짓없는 목소리. 아직 잘하는 노래라고 보기는 어렵지만 열심히 노력하는 모습이 노래에 담겨져있는 듯한 느낌을 준다.

싸집은 별로라는 사람들이 있어서, 처음으로 싸이의 음반을 사볼까 고민을 하다가 진성이가 빌려줘서 몇 일 들어보고 Yes24 포인트로 구매했다. 공부하다 기분이 쳐질 때 들어주면 기분이 좋아지기도 하고, 뭔가 말하고자 하는 가사는 새겨듣게 된다.

맘에 드는 곡은 어른, 아름다운 이별2, we are the one, 노크, 비오니까 정도. we are the one은 피파온라인에서 배경음악으로 자주 들어온 곡이라서 워낙 익숙하고, 노크는 아이비와 같이 부른 곡인데 뇌새적인 음색과 므흣간 가사가 일품이다. 아름다운 이별2와 비오니까는 슬픈 가사와 선율이 마음에 들고.

싸이를 보면 결코(?) 멋진 외모를 가진 것은 아니지만 멋이 난다고 해야할까. 당당함, 자신감, 열심히 하는 모습이 너무 좋아 보이는 가수다.  다음 음반이 나와도 구매하게 될 것 같다.

조립전

조립후


책상 위에 널브러져 있는 CD들을 차곡차곡 정리하기 위해 매우 저렴한 (6000원대) CD수납장을 구매했다. 저렴한 만큼 직접 나사를 조여가며 조립해야 했고, 사진에서 볼 수 있듯 페인트 칠이 엉성한 부분이 군대군대 있다. 워낙 저렴해서 큰 불만은 없었고, 오히려 오랜만에 뭔가를 뚝딱뚝딱 만드는 재미를 맛보게 해주었다.

조립후 CD를 넣고 정리를 하니 한결 보기가 좋다. 집에 옛날 CD들이 많긴 하지만 연구실에 와서 구입하거나 또는 선물받아서 가지고 있는 시디는 몇 장 안된다. 그중에서 이루마의 피아노 연주곡 CD가 4장이다.

CDP는 올초에 구입했고 헤드폰은 한달전쯤 구입했던 것 같다. MP3플레이어를 사용할 때는 늘 듣던 노래만 계속 듣게 되고 타이틀 곡만 골라 듣다 보니 음악듣는 즐거움이 예전만 못하였다. 요즘에는 웹서핑을 전폐하고 CDP+헤드폰 조합으로 흘러나오는 풍부한 음량의 음악으로만 스트레스를 다스리고 있는데, 집중력이 흐트러지지 않고 차분함을 유지할 수 있어서 좋다. 적어도 꼬리에 꼬리를 무는 무뇌상태의 웹서핑 끝에 남는 허무감보다는 훨씬 바람직하다.

플라시보 효과 일지는 모르겠지만, CDP와 헤드폰으로 음악을 들을 때의 살아 있는 느낌이 좋다. 정품 CD를 구매하는 자부심(?) 같은 것도 무시 못할테고 CD를 갈아끼는게 불편한 관계로 하나의 음반에 담겨 있는 모든 곡들을 온전히 감상하게 되는 장점이 있다. 실제로 좋은 곡들은 타이틀이 아닐 경우가 많다.

MP3플레이어 보다는 CDP가 좋고, TV보다는 책이 좋고, 컴퓨터로 글을 쓰는 것 보다 손으로 쓰는 것이 좋다. 나는 시대를 역행하는 걸까?   
The Graphical Editing Framework (GEF) allows developers to create a rich graphical editor from an existing application model. GEF consists of 2 plug-ins. The org.eclipse.draw2d plug-in provides a layout and rendering toolkit for displaying graphics. The developer can then take advantage of the many common operations provided in GEF and/or extend them for the specific domain. GEF employs an MVC (model-view-controller) architecture which enables simple changes to be applied to the model from the view.

GEF는 이름 그대로, Graphical Editor의 구현을 도와주는 프레임워크라고 할 수 있다. 무에서 Graphical Editor를 구현한다고 상상해본다면 어떨까? 유사한 경험을 가지고 있지 않다면 대체 어디서 어떻게 시작해야할지 도무지 감을 잡을 수 없을 것이다.

항상 어떤 프레임워크나 플랫폼을 활용할 때는 딜레마를 느끼게 된다. 잘 짜여진 프레임워크를 활용하면 내가 한 일에 비해서 보기좋은(?) 아웃풋을 얻을 수 있다는 장점이 있는 반면에 얼마나 자유도를 가지고 시스템을 개발할 수 있는지에 대해서 의구심을 떨쳐버릴 수가 없고 충분히 활용하기까지 공부를 많이 해야한다는 단점이 있다.

분명한건 이런 프레임워크나 플랫폼은 나보다 똑똑한 여러명이 심사숙고해서 만들어 놓은 뼈대이며, 자유도를 고려한 디자인을 가지고 있다보니 본의 아니게(?) 복잡해질 수 밖에 없다. 따라서 이를 활용하기 위해서 적잖이 공부해야한다.

연구실에서 개발하는 Verification Integrated CODesign Environemnt (VICODE)에서 임베디드 시스템을 설계 할때 전체 시스템의 논리적인 디자인을 다이어그램 에디터에서 이루어지게 하려고 한다. 분명 xml 코드를 직접 쓰는 것보다는 훨씬 낫겠다는 기대와 함께 ...

구현을 돕기 위해 공부해야할 것에는 다음과 같은 것 들이 있다.

EMF (Eclipse Modeling Framework)
GEF (Graphical Editing Framework)
GMF (Graphical Modeling Framework)


이들은 모두 MVC (Model-View-Controller) Architecture를 기반으로 한다. EMF는 Eclipse에서 사용할 Model의 클래스 구조를 자동생성해주는 녀석 쯤으로 보이고 GEF는 특정 Model을 편집할 수 있는 그래픽 편집기를 생성하는 프레임워크라고 볼 수 있다. 여기서 EMF로 생성된 Model이 GEF의 Model의 조건을 만족하기 때문에 EMF+GEF 조합의 솔루션이 소개되었다. 그리고 이를 돕기 위해 GMF 프로젝트가 전개되고 있다.

나는 GEF만을 사용하여 다이어그램 에디터를 구현하고자 한다. 여전히 복잡하고 어려워보이지만 "복잡한 문제는 단순한 문제의 합" 이라고 믿고 그냥 가보는거다! GEF를 공부하고 그 틀대로 구현을 하게 되면 아래와 같이 보기 좋은 그래픽 에디터가 생성된다.

방문수가 꽤 많은 블로그를 방문해보면 상당수가 구글 광고를 담고 있다. 광고를 보면 뭔가 블로그의 순수함(?)을 헤치는 느낌을 가지게 되어서, 내가 가진 의문은 "과연 블로그에 삽입한 광고를 통해 얼마나 이익을 얻을 수 있을까?" 였다. 호기심반 기대반으로 계정을 신청했고 하루만에 승인이 나서 이 블로그에 적용해보았다.

오늘 아침 연구실에 나와 대략 12시간 사이의 수익을 살펴보니 USD 0.70 이였다. 생각보다 많은(?) 금액이였다. 잘만 활용한다면 하루에 1$ 정도의 수익을 올릴테고 100$가 되어야 수익금액을 지불받을 수 있으므로 100일정도면 10만원을 번다고 할 수 있다! 그러나 알아본바로는 쉽지 않은듯 ...

CMA로 한푼이라도 더 모으려고 노력하는 중에 하루에 1$가 어디인가!!! 블로그의 방문수도 올릴 겸, 그 동안 공부한 것을 정리할 겸, 이클립스 플러그인 개발 강좌를 써볼까 하는 생각을 하고 있다.

혹시나 자신의 블로그에도 Goolge Adsense를 통해 수익을 창출하고자 하시는 분은 한번 도전해보시길!

p.s
부정 클릭 유도성 구문 모두 삭제 ... T.T
은정이가 제안한 책 서로 선물해주기 운동(?)의 첫번째로 채택된 작품. 은정이꺼 사면서 좋은 책인것 같아서 한권 더 구입해서 읽게 되었다.

금방 읽을 수 있는 이 책은 초지일관 현재의 중요성에 대해서 강조하고 있다. 마음을 비워 걷기를 소개하며 바로 지금 이순간을 살아내는 지혜를 이야기한다.

마음을 비워 걷기는 별다른 것이 아니다. 한발짝 나아가며 들어오고 나가는 나의 숨소리와 발바닥에 느껴지는 땅의 감촉만을 온전히 생각하는 것이다. 이와 같은 수행은 우리를 미래와 과거의 노예가 되지 않고 현재에 머물 수 있도록 도와준다.

나 역시 미래의 노예가 되어 살고 있지 않나 생각이 든다. 심지어 일어나지 않을 일까지 걱정하며 에너지를 낭비하는 경우가 많다. 박찬호가 투구할 때 현재의 공 하나하나에 집중하듯이, 현재 나의 일에 집중하며 순간순간의 삶에서 의미를 발견하고 행복을 느낄 수 있도록 노력해야한다. 하지만 언제나 이상은 쉽다.

내 블로그의 방문수를 보면 어쩔 때는 600, 700에 육박하는데, 블로그 관리자 페이지의 리퍼러 로그를 보면 순수 방문객 보다는 검색로봇이 방문하는 것이 상당수였다. 이 블로그를 방문하는 사람들은 어디에 있으며, 몇 페이지를 읽다가 접속을 종료하는 것인지, 어떤 사이트에서 찾아오게 된 것인지 등이 항상 궁금했다.

블로깅을 하다보니 몇몇 분들이 Google Analytics를 이용하여 블로그의 방문패턴을 분석해놓은 글을 접할 수 있었다. 호기심이 발동하여 account를 요청하여 약간의 코드를 스킨에 삽입하는 정도로 세팅을 완료하고 데이터가 통계스러워 질때까지 기다렸다.


그 결과 해외에서 이 블로그를 접속하는 것은 극소수에 달했고, 국내에서는 서울과 대전이 단연 압권이였다. 생각외로 학교 사람들의 비중이 상당하다. 이는 네트워크 위치 분석결과를 살펴보아도 KAIST의 네트워크에서 접속한 비중이 28.16%에 달하는 것으로 재확인할 수 있었다.

신규방문자와 재방문자의 비율은 비슷하였는데, 이는 나의 지인들의 지속적인 방문에 힘입은 것으로 생각된다. 소스별 방문수를 보면 병운형 홈페이지(http://obeng.oz.or.kr)가 오즈사람들의 포털사이트 역할을 하는 관계로 15.29%를 차지했다.

정리하자면 이 블로그는 주인장의 지인들과 검색엔진에서 검색되는 독후감을 읽기 위한 익명의 사람들에게 방문되어지고 있다고 할 수 있겠다. 내가 읽고 기록한 책의 제목을 검색엔진에 입력하면 상위에 랭크되어 있는 것을 볼 수 있다.

자신의 홈페이지나 블로그에 찾아오는 방문객들의 성향이 어떤지 궁금하신 분은 한번 도전해보시길!

이루마가 들려주는 시(詩) 같은 음악, 음악 같은 시(詩)

POEMUSIC 이라는 음반의 제목이 너무 잘 어울리는 음악시들이 수록되어 있는 이루마의 네 번째 정규 앨범.

지금까지 구입했던 4개의 이루마 앨범중에서는 개인적으로 이 앨범이 가장 마음에 든다. 초창기 이루마의 앨범은 순수 피아노 연주곡의 순수한 느낌이 좋고, 이 앨범은 다양한 악기들의 협주를 통해 풍부한 감성을 전달하기에 감동이 크다.

특히! 이루마의 군입대 직전 콘서트에서 어여뿐(?) 첼리스트와 함께 연주했던, 이번 앨범의 9번째 트랙에 실려있는  Fotografia (Photograph) 희망이란 아이 라는 곡이 가장 마음에 든다.

콘서트에서 이 앨범 수록곡들을 많이 연주했었는데, 이 앨범을 미리 들어보고 갔으면 좋았을껄 하는 아쉬움이 진하게 남는다.
프로로 산다는 것
김영익 지음/스마트비즈니스

어떻게 발견해서 읽게 되었는지 기억은 안나지만, 이 책을 선택하면서 내심 바랬던 것은 두 가지였다. 중,고등학교 검정고시에 지방대 출신이였던 주인공이 노력만으로 자신의 분야에서 최고가 되는 내가 가장 좋아하는 스토리를 읽는 것과 동시에 주인공이 증권가 최고의 애널리스트이므로 덤으로 경제적인 지식을 얻고 싶었다.

성공에 있어서 노력이 가장 중요하다는 것은 나도 잘 알고 있고 그렇게 믿고 싶다. 내가 항상 찾아 헤매는 것은 그 노력을 불러일으키는 열정이라는 녀석이였다. 책의 주인공은 좀 더 큰 사람이 되고자 하는 마음이 어렸을 때 부터 자랐다고 한다. 현재의 나는 어떻게 열정을 찾아야 할까? 여전히 나에게는 어려운 질문이다.

매일 모든 면에서 나아지려는 노력
새벽 4시에 일어나는 아침형(농부형)인간
끊임 없는 공부 또 공부

나 역시 치열한 애널리스트와 다르지 않게, 끊임없이 터져나오는 신기술을 공부해야하는 개발자가 되려고 한다. 부디 열정을 가지고 나의 분야의 최고가 될 수 있기를 ...

하드웨어/소프트웨어 동시설계에서 이 둘 사이의 인터페이스(디바이스 드라이버, and so on)를 자동으로 생성해주는 것은 상당히 중요하다. 특히 우리 연구실에서 채택한 Heterogeneous Modeling 방법에서 이는 필수요소라고 할 수 있다.

졸업하신 춘호형이 개발한 Hinge를 현재 우리의 개발환경에 맞게 수정하는 것이 내가 할 일 중에 하나였고, 그에 앞서 꼭 기존의 Hinge가 만들어낸 인터페이스가 동작해야만 했다. 졸업을 해야하니까! 문제는 쉽게 동작하는 모습을 볼 수 없었고, 하드웨어를 포함한 실험이라 무엇이 문제인지 좀처럼 찾아낼 수 가 없다는 것.

매일 이 것에 매달린 것은 아니지만 2,3주 동안 여러가지 가설을 세워가며 문제가 될만한 곳을 찾아보았다. 생전 나와 관련이 없어보였던 Verilog HDL도 공부했다. 결국 문제는 그동안 문제가 없을 것이라며 블랙박스로 여겼던 디바이스 드라이버에 있었다!

버그는 단지 little-endian 으로 인한 것이였다. 16비트 1을 쓰게 되면 이 때 1이 위치한 비트가 내가 생각한 위치와 달랐던 것이 문제였다! 덕분에 하드웨어와 소프트웨어를 걸쳐서 각종 다양한 지식을 섬렵할 수 있었으나 지나간 세월은 ...

자랑스럽게 빛나는 LED


소프트웨어에서 하드웨어로 가는 신호가 인가되었을 때, LED를 켜지게 만들었는데 너무나 당당하게 불을 내뿜는 것이 아닌가! 우리가 고안한 프로그램이나 시스템이 원하는 바 그대로 동작되었을 때 느끼는 쾌감! 개발자들은 이 맛에 힘든 개발자의 길을 묵묵히 걸어가고 있는 것이 아닐까?


고등학교 시절이였던 것 같다. 학급문고에서 우연히 이 책을 집어 들었고 너무나 감명 깊게 읽었다. 그 때의 기억이 떠올랐기도 했거니와 꼭 소장하고 싶은 책이여서 다시 읽을 요량으로 아니 두고 두고 읽을 요량으로 구입해서 읽게 되었다.

인간적인 대우를 받지 못하며 일하는 불쌍한 여공들과 평화시장의 노동자들을 위해 자신의 몸을 불태웠던 전태일 열사의 삶과 사상을 인권변호사인 조영래씨가 옥중에 혼신의 힘을 다하여 집필한 책이다. 그가 스스로의 몸을 산화하여 뜻을 이루고자 한 이유는 가히 성인이라 불리울 수 있을 정도로 사람에 대한 큰 사랑을 품고 있었기 때문일 것이다.

죽음을 결심한 후 그의 일기를 보면 사람에 대한 그의 사랑이 얼마나 크나큰 지 느껴볼 수 있다 ...

이 결단을 두고 얼마나 오랜 시간을 망설이고 괴로워했던가?
지금 이 시각 완전에 가까운 결단을 내렸다.
나는 돌아가야 한다.
꼭 돌아가야 한다.
불쌍한 내 형제의 곁으로, 내 마음의 고향으로,
내 이상의 전부인 평화시장의 어린 동심 곁으로.
나를 버리고, 나를 죽이고 가마.
조금만 참고 견디어라.
너희들의 곁을 떠나지 않기 위하여 나약한 나를 다 바치마.
너희들은 내 마음의 고향이로다.

- 전태일의 일기 중에서
시골의사의 부자경제학
박경철 지음/리더스북

월급쟁이 생활을 앞두고 어떻게 하면 돈을 효과적으로 잘 모을 수 있을까에 대해서 고민하게 되는 요즘이다. 따라서 경제관련 서적을 빼놓지 않고 간간히 읽게 되는데 ...

이 책은 서문에서 저자가 밝혔듯 결코 쉽게 쓰여진 책이 아니다. "시골의사의" 라는 제목의 시작이 어울리지 않을 정도로 경제에 대한 해박한 지식과 현상의 본질을 꽤뚫고 있는 날카로운 통찰력을 보여준다.

덕분에 책을 읽는 내내 모르는 개념이 많아 스스로의 무지몽매함에 여러번 좌절해야했다. 허나 조금이라도 이해가 닿았던 부분에서 내가 얻은 지식과 지혜는 상당했다.

책의 결론만 말하자면 이자율에 투자하는 것이 가장 현명하며 무엇보다도 더 중요한 건 자신의 분야에서 일류가 되어 스스로의 몸값을 늘리는 것이 최고의 재테크다!

주식이나 부동산으로 일확천금을 위해 얄팍한 공부를 하는 것 보다는 하고 있는 일에서 경쟁력을 갖춰 자신의 가치를 향상시키는 것이 훨씬 현명하지 않을까? 

+ Recent posts