블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
2007. 11. 16. 14:50 Programing/XUL

XUL((XML User-interface Language)



<xul로 만드는 Firefox extention>

작성자: 유시형   
작성일: 2007.11.12


I. XUL이란?

XUL Mozilla browser를 쉽고 빠르게 만들기 위한 목적으로 만들어진 XML기반의 마크업 언어로서 실제로 Firefox Thunderbird UI를 만드는데 사용되었습니다. 통상 zool()이라고 발음하며 XUL이라는 이름에서 알 수 있 듯 XML로 할 수 있는 모든 것을 제공하고 인터넷과 연결되거나 또는 연결되지 않은 채로 동작하는 풍부한 기능을 제공하는 크로스 플랫폼 응용프로그램을 만들 수 있게 해줍니다.

XUL로 만들 수 있는 어플리케이션의 유형을 몇가지 살펴보면 다음과 같습니다.

  • Firefox extention
  • Standalone XULRunner application
  • XUL package
  • Remote XUL application


XUL
XML의 문법을 그대로 사용하고 있기 때문에 DHTML에 친숙한 웹 개발자들은 XUL을 금방 배워서 바로 응용프로그램을 만들어 볼 수 있습니다. namespace 를 사용하여 HTML엘리먼트를 XUL문서에 삽입 할 수도 있습니다.(, <html:textarea value="hello"></html:textarea>)

 

II. Firefox extention 만들기

Firefox extention은 두 개 이상의 각각 독립적인 XUL어플리케이션을 묶어 하나의 어플리케이션처럼 사용 할 수 있게 해주는 XUL <overlay>엘리먼트를 사용하여 만들 수 있습니다.

예 제의 extention Firefox의 메뉴바에 "다음" 이라는 메뉴항목을 추가 하고 해당 메뉴에 Firefox의 새 탭 혹은 현재 탭에서 다음 서비스 페이지로 이동시키는 몇 개의 메뉴아이템을 추가하는 기능을 같습니다. extention 개발에 필요한 도구는 단지 간단한 텍스트 에디터와 Firefox뿐입니다.

개발순서는 다음과 같습니다.

1.      디렉토리 생성 및 설정파일 작성

2.      extention  개발 정보를 담고 있는 about.xul 파일 작성

3.      firefox의 메뉴바에 추가할 메뉴와 항목들에 대한 내용을 담고 있는 xul 파일 작성

4.      사용자 행동을 처리할 함수를 갖고 있는 javascript 파일 작성

5.      chrome 시스템에 extention 등록

 

1.개발환경 구성하기

* 한글 표현을 위해서는 소스 파일을 UTF-8로 인코딩 해야 합니다.

l        디렉토리 구조

daummenu(*)/
  + chrome/
     + content
         + main.xul(*)
        + script.js(*)
     + locale/
     + skin/
  + defaults/
     + preferences
        + prefs.js
  +components/
  + install.rdf
   + chrome.manifest

l        install.rdf
XUL
어플리케이션의 기본 정보를 설정하는 파일입니다. 제작자 정보, 프로그램 버전, 실행가능한 어플리케이션의 범위등을 설정 할 수 있으며, 특히 <em:id>엘리먼트의 값은 어플리케이션의 고유 번호와 같은 역할을 하며 어플리케이션을 chrome시스템에 등록 할 때 등록 파일의 이름으로 사용되어집니다.

<?xml version="1.0" encoding="utf-8"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <Description about="urn:mozilla:install-manifest">
<em:aboutURL>chrome://daummenu/content/about.xul</em:aboutURL>
   <em:id>daummenu@asrada.net</em:id>
   <em:version>1.0</em:version>
   <em:type>2</em:type>

   <!-- Target Application this extension can install into, with minimum and maximum supported versions. -->
   <em:targetApplication>
     <Description>
      <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
      <em:minVersion>1.5+</em:minVersion>
      <em:maxVersion>2.0.0.*</em:maxVersion>
     </Description>
   </em:targetApplication>

   <!-- Front End MetaData -->
   <em:name>Daum Menu</em:name>
   <em:description>extention example</em:description>
   <em:creator>Asrada</em:creator>
   <em:homepageURL>http://asrada2001.tistory.com/</em:homepageURL>
  </Description>
</RDF>

l        chrome.manifest
어플리케이션의 환경 설정 역할을 담당하는 파일입니다. 다른 어플리케이션과의 overlay 를 설정하거나 skin,locale 파일들의 위치 정보를 설정 할 수 있습니다.

content daumment chrome/content/
overlay chrome://browser/content/browser.xul chrome://daummenu/content/main.xul

공백으로 구분 되는 각 컬럼의 의미는 아래와 같습니다.
1.chrome
패키지 안에 material
2.chrome
패키지 이름(overlay의 경우 overlay될 어플리케이션의 경로)
3.chrome
패키지 파일의 위치(overlay의 경우 overlay할 어플리케이션의 경로)

(
복잡한 chrome.manifest 파일의 예)

content       necko                   jar:comm.jar!/content/necko/ xpcnativewrappers=yes
locale               necko       en-US       jar:en-US.jar!/locale/en-US/necko/
content       xbl-marquee             jar:comm.jar!/content/xbl-marquee/

content       pipnss                  jar:pipnss.jar!/content/pipnss/

locale        pipnss      en-US       jar:en-US.jar!/locale/en-US/pipnss/

# Firefox-only
overlay chrome://browser/content/pageInfo.xul          chrome://pippki/content/PageInfoOverlay.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}

overlay chrome://communicator/content/pref/preftree.xul chrome://pippki/content/PrefOverlay.xul

overlay chrome://navigator/content/pageInfo.xul        chrome://pippki/content/PageInfoOverlay.xul application=seamonkey@applications.mozilla.org

content       pippki                  jar:pippki.jar!/content/pippki/ xpcnativewrappers=yes
locale        pippki      en-US       jar:en-US.jar!/locale/en-US/pippki/

content       global-platform        jar:toolkit.jar!/content/global-platform/ platform

skin          global      classic/1.0 jar:classic.jar!/skin/classic/global/

override chrome://global/content/netError.xhtml jar:embedder.jar!/global/content/netError.
토싀

content       inspector              jar:inspector.jar!/content/inspector/ xpcnativewrappers=no

* What is Chrome?
Chrome is the user interface parts of the application window that are outside of a window's content area.
Toolbars, menu bars, progress bars, and window title bars are all examples of elements that are typically part of the chrome.

·        chrome - the browser UI around the web page

·        chrome URLs - the chrome protocol which is the only way to get privileges(ex.chrome://browser/content/browser.xul)

·        chrome directory - the directory where the apps put their UI files

·        chrome command line argument - start and open a file in a top level window

·        chrome argument to window.open - opens a new window top level

·        chrome.rdf - the chrome registry, in install directory and in profile

2.about.xul

<?xml version="1.0" encoding="utf-8"?>

<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"title="About favdaum" orient="vertical" buttons="accept" width="320" height="240">

<groupbox align="center" flex="1">

<vbox align="center">

<description id="title" value="Daum Menu" />

<description id="version" value="version: 0.1.0" />

<description id="created" value="created by" />

<description id="author" value="Asrada" />

</vbox>

</groupbox>

<description id="made" value="Made with EditPlus" />

</dialog>

3.main.xul

<?xml version="1.0" encoding="utf-8"?>

<overlay id="daummenu" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script src="script.js" />

<menubar id="main-menubar">

<menu id="daumMenu" label="다음" insertbefore="helpMenu" accesskey="D">

<menupopup id="daumMenuPop">

<menu id="entertainment" label="엔터테인먼트" accesskey="E">

<menupopup id="ent_pop">

<menuitem id="cartoon" label="만화·소설" oncommand="openURL('http://comic.daum.net/?nil_profile=g&amp;nil_site=comic',event)" />

<menuitem id="music" label="뮤직" oncommand="openURL('http://52street.daum.net/?nil_profile=g&amp;nil_site=music',event)" />

<menuitem id="movie" label="영화" oncommand="openURL('http://movie.daum.net/?nil_profile=g&amp;nil_site=movie',event)" />

</menupopup>

</menu>

<menuseparator/>

<menuitem id="daumHome" label="Home" oncommand="gBrowser.addTab('http://www.daum.net')" />

<menuitem id="daumYV" label="YouthVoice" oncommand="gBrowser.addTab('http://youthvoice.daum.net')" />

<menuitem id="daumMS" label="MediaSchool" oncommand="gBrowser.addTab('http://mediaschool.daum.net')" />

</menupopup>

</menu>

</menubar>

</overlay>

4.script.js

function openOnCurrentTab(url){

gBrowser.selectedBrowser.setAttribute("src",url);

}

function openURL(url){

if(arguments.length == 2 && arguments[1] instanceof Event && arguments[1].shiftKey == true){

var newTab = gBrowser.addTab(url);

gBrowser.selectedTab = newTab;

}else{

openOnCurrentTab(url);
}

}

5.Chrome 시스템에 등록

만들어진 extention chrome 시스템에 등록을 해야 사용이 가능합니다. firefox의 경우 profile 디렉토리에 등록 파일을 만드는 것으로 간단히 extention을 추가 할 수 있습니다.

* 윈도우 사용자의 경우 실행(윈도우키 + R)메뉴에서 %APPDATA% 를 입력하면 사용자 어플리케이션 데이터 폴더가 열립니다.그 안에서 Mozilla>Firefox>Profiles>bz94kxr2.default(사용자마다 다름)>extensions 폴더가 Firefox chrome시스템 디렉토리입니다

등록 파일의 이름은 install.rdf 파일에서 만든 extention ID와 동일하게 설정하고 내용은 extention의 루트 디렉토리 - 엄밀히 말하면 chrome 디렉토리의 부모 디렉토리 - 입니다.

) 등록파일: daummenu@asrada.net

내 용: E:\workspace\xul\daumment

등 록 과정을 마친 후 Firefox를 실행시켜보면 메뉴바의 help 메뉴 왼쪽에 "다음" 이라는 메뉴가 추가되었음을 확인할 수 있습니다. 그리고 Firefox의 도구 > 부가기능을 보면 우리가 만든 daummenu 라는 확장기능이 표시가 되고 daummenu에서 오른쪽 버튼을 눌러 "daummenu 정보"를 클릭하면 about.xul의 내용이 다이얼로그로 나타납니다.

III.with XPCOM

XPCOM Microsoft COM과 비슷한 Cross Platform Component Object Model로서 Java,Javascript,Python,perl,Ruby 등 다양한 언어로 컴포넌트를 사용하거나 인터페이스를 구현 할 수 있으며 파일과 메모리 관리,쓰레드 제어 등 XUL Javascript로는 불가능한 부분을 구현 할 수 있도록 해줍니다. XPCOM 컴포넌트는 C++ 뿐만 아니라 Javascript로도 구현 할 수 있기 때문에 C++을 다룰줄 몰라도 원하는 컴포넌트를 손 쉽게 만들어 사용할 수 있습니다.

* 작업표시줄 위로 메세지 다이얼로그를 보여주는 예제

var alertsService = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);
alertsService.showAlertNotification("chrome://mozapps/skin/downloads/downloadIcon.png", "
업데이트가 있습니다", "확인", false, "", null);

 

* 파일 복사를 구현한 예제

function copyFile(sourcefile,destdir)

{

// get a component for the file to copy

var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);

if (!aFile) return false;

// get a component for the directory to copy to

var aDir = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);

if (!aDir) return false;

// next, assign URLs to the file components

aFile.initWithPath(sourcefile);

aDir.initWithPath(destdir);

// finally, copy the file, without renaming it

aFile.copyTo(aDir,null);

}

copyFile("/mozilla/testfile.txt","/etc");

 

참고문헌

 

'Programing > XUL' 카테고리의 다른 글

Firefox Extension 배포하기  (0) 2008.09.05
웹페이지를 데스크탑 어플리케이션으로...  (0) 2007.12.02
posted by 초딩입맛제주아재
2007. 10. 28. 21:14 Programing/기타

이클립스에서 swing 예제를 만들다가 시스템이 느려지는 듯 하여 윈도우의 작업관리자를 띄워보니 javaw.exe 프로세스가 무려 100개가 넘게 떠있었다..-_-;
작업관리자에서 일일이 하나하나 프로세스를 클릭하여 죽여나가다 보니 슬슬 짜증이 밀려왔다.
100개가 넘는 프로세스를 언제 다 죽이남...리눅스처럼 한방에 죽이는 명령어 없나...
한참 고민하다가 웬지 kill 과 같은 명령어가 있을것 같아서 무작정 CMD를 열었다.

C:\Users\Administrator>kill
'kill'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.


역시 안되는구나 -_-;;
근데 분명 다른 이름으로 존재하리란 믿음이 무럭무럭 솟아났다.
그러다 작업관리자의 프로세스 목록을 유심히 살펴보는데 작업관리자의 프로세스 이름이 taskmgr.exe 였다.
작업관리자가 taskmgr이라면 작업은 task라는 말이된다.
그렇다면 tasklist 라는 명령어가 있지는 않을까?

C:\Users\Administrator>tasklist/?

TASKLIST [/S 시스템 [/U 사용자 이름 [/P [암호]]]]
         [/M [모듈] | /SVC | /V] [/FI 필터] [/FO 형식] [/NH]

설명:
    이 도구는 로컬 또는 원격 시스템에서 현재
    실행되고 있는 프로세스 목록을 표시합니다.

크~ 있다있어~
tasklist 가 있으니 taskkill 도 있겠지~

C:\Users\Administrator>taskkill/?

TASKKILL [/S 시스템 [/U 사용자 이름 [/P [암호]]]]
         { [/FI 필터] [/PID 프로세스 id | /IM 이미지 이름] } [/T] [/F]

설명:
    이 도구는 프로세스 ID(PID) 또는 이미지 이름으로 작업을 종료하는 데
    사용합니다.

드디어 원하는걸 찾았다!
프로세스이름이 javaw.exe 인 모든 프로세스[/IM javaw.exe]를 강제종료[/F] 시켰다~

C:\Users\Administrator>taskkill /IM javaw.exe /F
성공: 프로세스 "javaw.exe"(PID 6788)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 6916)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 7076)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 6908)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 7208)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 7952)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 8140)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 8084)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 8356)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 8892)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 8540)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 9184)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 10976)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 10772)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 11316)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 11456)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 12072)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 12272)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 11416)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 11732)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 11940)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 11872)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 12720)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 12372)이(가) 종료되었습니다.
성공: 프로세스 "javaw.exe"(PID 12656)이(가) 종료되었습니다.
.
.
(이하 생략 ㅡ.ㅜ)

역시 윈도우도 제대로 쓰려면 공부를 해야 하나보다.
우리가 리눅스 공부를 밤을 세워 하는 것처럼...



 

posted by 초딩입맛제주아재
2007. 10. 27. 02:11 카테고리 없음


출처: http://tvpot.daum.net/clip/ClipView.do?clipid=4044745


원문을 제대로 보지는 않고 자막에 의존하긴 했지만 정말 대단한 발상이라고 생각한다.
대체 저런 기발한 아이디어는 어디에서 뚝 떨어지는걸까....-_-;;
posted by 초딩입맛제주아재
2007. 10. 21. 21:13 Programing/기타
개발환경: Eclipse WTP 2.0.1 all-in-one

개발환경 셋팅
1.Eclipse WTP 설치
http://www.eclipse.org/downloads/download.php?file=/webtools/downloads/drops/R2.0/R-2.0.1-20070926042742/wtp-all-in-one-sdk-R-2.0.1-20070926042742-win32.zip

2.XULBooster 설치
http://cms.xulbooster.org/index.php?option=com_frontpage&Itemid=1
설치방법: 위 주소에서 xulbooster를 다운로드 한 후 이클립스에서 help > software updates > find and install > search for new features to install > New Archived site... > 다운로드한 파일을 선택하여 Next~!

3.XULRunner 설치
http://releases.mozilla.org/pub/mozilla.org/xulrunner/releases/1.8.1.3/contrib/
OS에 맞는 버전을 다운로드 한 후 원하는 곳에 압축을 푼다.
콘솔로 해당 디렉토리에 가서 다음 명령을 실행한다.
xulrunner --register-global


XUL 기본 프레임워크

posted by 초딩입맛제주아재
2007. 10. 17. 01:11 날개를달자
일시: 2007년 10월 16일(화) 오후 5시 – 9시 45분
장소: 서울 강남 메리어트 호텔 (강남고속터미널에 위치)

- Google Gadgets API / 소피아 브뤽크너(Sophia Brueckner)
- Future of the Internet / 빈트 서프 (Vinton G. Cerf) 구글 부사장 및 수석 인터넷 전도사
- Google Maps API / 크리스 아테나시오 (Chris Atenasio)
- Web 2.0 / 자헤다 보랏 (Zaheda Bhorat)

팀원들(종혁님,순님,형석님)과 함께 G.D.N(내맘대로 축약함)에 다녀왔다.
이번 행사를 위해 저 멀리 미쿡에서 오는 유명인사들을 직접 보고 그들을 세계 최고의 기업이라고 불리는 구글에 있게 한 남달리 뛰어난 무언가를 몸으로 느껴보고자 향방훈련을 무단 불참하는 위험(?)을 감수하고 부푼가슴을 안고 찾아갔다.

1층 로비에서 엘리베이터를 타고 5층에 내려서니 정면에 Google 로고와 등록을 하는 곳이 눈에 들어왔다.
5시를 살짝 넘긴 시간 - 택시를 타고 오는 중 도로에 사고 차량이 두 개 차선을 막고 있어서 시간이 약간 오버됐다 - 임에도 아직은 한산한 다소 의외의 풍경이었다.

행사장은 의자가 빼곡히 들어서있었고 연단에는 커다란 대형 스크린 두개가 좌우로 자리잡고 있었다.
(구글 코리아 대표의 말에 따르면 당초 계획에는 300명 정도로 예상을 하고 테이블을 준비했었지만 예상외로 참가 희망 인원이 많아서 테이블을 빼고 의자를 추가 해야 했다고 한다. 이것이 뒤에 이어질 저녁식사의 문제까지 이어진것은 아닐까하는 생각이...)

구글코리아 대표의 기조 연설이 끝나고 구글 가젯 API에 대한 강연이 있었고 뒤 이어 저녁식사가 제공되었는데 여기에 대해 불만의 목소리가 많았다.
많은 이들이 구글 하면 떠올리는 것. 바로 뷔페식 식당이 아닐까? 게다가 오늘 행사가 열리는 곳이 호텔이 아닌가!!
우리도 과연 어떠한 만찬이 우리를 기다리고 있을까 입맛 다시는 상상을 하면서 기다렸는데 오늘 제공된 식사는 샌드위치세트(?)였다. 사실 제공될 식사에 대해서는 가젯 강연이 시작 되기 전에 사회자가 말해주어 알고 있었다.
하지만 역시 호텔 샌드위치라 다르긴 했다. 샌드위치라는 말만 듣고 식빵 두조각에 햄이나 치즈를 넣어 만든 편의점에서 파는 것을 생각했지만 호텔에서 판매하는 것 답게 격조가 있었다. 연어가 들어간 샌드위치, 햄이 들어간 샌드위치, 바나나 한개,음료수,생수,수박과 파인애플 조각들이 담긴 작은 플라스틱 용기, 마카로니 비슷한(이름이 생각이 안난다...ㅡㅡ;)것... 꽤 푸짐해서 나는 다 먹질 못했다.
뭐 강연 내용이 중요하지 밥이 중요한건 아니고 제공된것도 기대와 다를 뿐이지 나쁘지는 않았다.

식사가 끝나고 기대하던 인터넷의 미래에 대한 강연이 이어졌다.
강연자는 인터넷의 아버지라 불리우는 빈트 서프 박사.
유명인사라서 그런지 어마어마한 포스가 느껴졌고 얼굴의 반을 덮어버린 흰수염도 인상적이었다.
인터넷의 할아버지라고 부르는게 더 어울릴듯....
강연 내용은 기대했던 이상으로 유익했다.
특히 과거에 작성된 잘 보존되어있는 BIT정보들이 미래에는 그 BIT를 해석할 수 있는 소프트웨어가 없어서 무용지물이 된다는 BIT ROT에 대한 내용은 오늘 강연중 베스트라고 생각한다.
지금 당장 더 좋은 소프트웨어, 더 뛰어난 기술도 중요하지만 우리의 후손들이 우리가 만든 데이터를 해석하지 못한다면 무슨 소용이 있겠는가. 마치 21세기의 우리들이 수천년전 우리의 선조들이 남긴 메세지를 해석하지 못하는 것처럼...

이후 구글 맵 API와 웹 2.0에 대한 강연이 있었고 10시를 조금 남겨둔 시간에 행사는 종료 되었다.

오늘 행사를 참여하고 느끼는 바이지만 확실히 외국 개발자들의 실력이 뛰어나다는 것이다.
기술의 격차는 둘째 치더라도 우리의 그것을 훨씬 뛰어넘는 그들의 상상력은 하루 아침에 따라 잡을 수 있는 것이 아닌것 같다.
교육 환경의 개선이 필연적으로 이루어져야하고 사회적인 분위기나 인식도 많이 달라져야 할 것 같다.
아직은 멀고 먼 이야기겠지만...

대체적으로 오늘 행사는 만족스러웠다.
내 입맛에는 샌드위치도 맛있었고... :)

'날개를달자' 카테고리의 다른 글

한국 양궁이 성공 할 수 밖에 없는 이유  (1) 2008.08.12
역시 Apple  (0) 2007.09.04
[펌]인스턴트 커피에 담긴 철학  (0) 2007.07.05
매쉬업 경진대회 결과  (0) 2007.05.03
매쉬업 캠프 2007  (2) 2007.02.25
posted by 초딩입맛제주아재
2007. 10. 13. 20:36 Programing
스터디까지 연기하고 아침부터 피곤한 몸을 이끌고 컨퍼런스에 참가했다.
뜻하지 않게 회사 분들을 만나서 심심하지도 않고 -안그랬으면 점심을 혼자 먹을 뻔했다 - 각 세션 종료후 서로 의견을 물어볼 수 도 있었다.

이번 컨퍼런스에서는 얻은게 많았다.
Mylyn,Trac,Maven과 같은 개발자를 위한 도구들.
Flex와 Apolo,AIR에 대한 정보(사실 관심은 있었지만 정보습득에는 노력을 쏟지 않았었다).
Javascript TDD.
그간 저런 것들을 접할 기회가 없었다는 것이 너무 안타깝고 내 스스로 정보 습득에 게을렀던것 같아 순간 짜증이 확~ ㅡㅡ;
세상은 너무나 빠른 속도로 변해가고 있는데 나의 정보 습득 영역은 늘 한정 되어 있었던것 같다.

그나저나 저 많은 것들....다 해보고 싶은 욕망은 굴뚝 같은데 어디 과외 받을 곳이라도 있으면 좋으련만....
posted by 초딩입맛제주아재
2007. 10. 9. 22:06 삶은달걀

사용자 삽입 이미지

아침에 Daum 에 접속해봤더니 영문으로 된 'Daum' 이라는 로고가 있어야 할 곳에 한글로 '다음' 이라고 만들어진 로고가 보여서 깜짝 놀랐다.
그런데 바로 오늘이 한글날이었다.
이런걸 준비했다니...
12시가 넘은 지금 다시 접속해보니 원래대로 바뀌어져있다.
사용자 삽입 이미지

두 로고를 나란히 놓고 보니 한글로고도 나쁘진 않은것 같다.
한글날 벌어진 이 해프닝에 대해 네티즌들의 의견은 대체로 "좋다" 였다.
타 포털사이트 어느 한 곳 이런 이벤트를 보인 곳이 없으니 Daum의 센스가 가히 빛을 바란 것이라 볼 수 있겠다. 기획하신분께 포상이 있기를....

세종대왕께서 백성을 어엿비 여겨 만드신 스물 여덟글자...
비록 국경일에서 제외되어 잊고 지나치기 쉬운 평범한 일상이 되버렸지만 그 의미 만큼은 잊여지지 않았으면 좋겠다...

'삶은달걀' 카테고리의 다른 글

과거와 미래가 궁금하다면...  (0) 2008.12.30
부모가 된다는 것  (0) 2008.01.04
예비군 훈련  (2) 2007.09.21
새로 산 내 휴대폰이 중고??  (0) 2007.09.10
Smalltalk 객체마을 오프라인 모임  (0) 2007.08.31
posted by 초딩입맛제주아재
2007. 9. 21. 13:56 Programing/HTML/JavaScript/CSS
클로저(closure)는 자유로운(구속되지 않은) 변수들을 포함하고 있는 코드 블록이다. 이러한 변수들은 코드 블록이나 글로벌 콘텍스트에서 정의되지 않고, 코드 블록이 정의된 환경에서 정의된다. "클로저"라는 명칭은 실행할 코드 블록(자유 변수의 관점에서, 변수 레퍼런스와 관련하여 폐쇄적이지 않은)과 자유 변수들에 대한 바인딩을 제공하는 평가 환경(범위)의 결합에서 탄생한 것이다. 클로저 지원의 다양함은 Scheme, Common Lisp, Smalltalk, Groovy, JavaScript, Ruby, Python에서 찾아볼 수 있다.

클로저의 가치는 함수 객체(function objects) 또는 익명 함수(anonymous functions)로서 작용하고, 유형 시스템(type system)이 데이터뿐만 아니라 코드도 나타낼 수 있어야 한다는 점에서 유형 시스템에 대한 결과도 갖고 있다. 클로저가 있는 대부분의 언어들은 함수들을 퍼스트-클래스 객체들로서 지원하는데, 함수들은 변수에 저장될 수 있고, 매개변수로서 다른 함수들에 저장되며, 동적으로 생성되고, 함수들에서 리턴된다.

- IBM developer works 인용 -


클로저란 생성시 환경의 레퍼런스를 그대로 가지고 있는 것이다.

다음 javascript 코드를 보며 설명하겠다.

<script type="text/javascript">
var example = function(){
    var i = 1;
    return function(){
        alert(i++);
    };
}();
</script>

<input type="button" onclick="example()" value="click" />

'click' 버튼을 클릭하면 계속 숫자가 증가하게 된다.
분명 i 라는 변수는 함수에서 선언된 지역 변수이다.
this.i 라고 객체 변수로 선언 했다면 쉽게 이해가 되겠지만 분명 지역변수로 선언되었다.
때문에 버튼을 클릭할때마다 i의 값은 매번 1이 되어야 한다.
하지만 계속 i는 증가한다.

그 이유가 바로 클로저에있다.

javascript 는 클로저를 지원하는 언어이기 때문에 return function(){} 이 선언되는 시점의 환경, 즉 지역변수 i의 레퍼런스를 가지고 있기 때문에 계속해서 i를 증가 시킬 수 있다.

어떻게 보면 상당히 난해한 개념이기도 하다.
하지만 간단한 원리-생성시의 환경 정보를 그대로 가지고 있다-만 파악한다면 쉽게 클로저를 사용 할 수 있을 것이다.


참고자료



posted by 초딩입맛제주아재
2007. 9. 21. 11:15 삶은달걀
올해로 4년차 예비군 훈련...
아내의 출산때문에 5월에 시행했어야 할 동원 훈련을 연기해서 이번 주에 동미참훈련으로 대신했다.
행운인지 불행인지 훈련 이틀째 부터 비가 와서 마지막 날까지 실내에서 시청각 자료로 훈련을 대신했다.

지금까지 4번의 예비군 훈련을 치루면서 아쉽게 느껴졌던건 예비군들의 자세다.
조교에게 막말은 기본이고 교관,간부들에게도 함부로 대한다.
통제에 잘 따르지도 않고 오히려 통제에 항의하며 반항한다.
쉬는 시간 흡연장소는 난장판이 되고 이번 처럼 실내교육을 하는 날이면 강의장에 음식물 쓰레기가 여기저기 굴러다닌다.
예비군 각 개인은 개인의 편의를 위해 아무 생각 없이 저지르는 행동이지만 수 백명의 예비군들이 남긴 흔적을 몇 명의 조교들이 감당하기에는 벅찰 수 밖에 없다.
하루 종일 예비군들 뒤치닥 거리 하며 피곤한 조교와 간부들이 예비군들이 떠난 후에도 곳곳에 버려진 예비군들의 흔적을 하나하나 지워야 한다.
물론 모든 예비군들이 저런 행동을 보이는건 아니다.
어느 조직에서나 그렇듯 일부에 의해 저런 분위기가 확산되는 것이 문제인 것이다.

예비군들은 위험한 착각을 하고 있다.
일단 동원령을 받고 부대에 입소하게 되면 그 시점부터 민간인에서 군인으로 신분이 바뀌게 되어 민간 형법이 아닌 군법에 의해 통제를 받게 된다.
때문에 상관의 명령에 불복종하는 행위는 하극상으로 엄중한 처벌을 받아도 할 말이 없는 것이다.
하지만 예비군 훈련장의 교관 및 간부들은 군법을 적용하는 일이 벌어지지 않도록 예비군들의 편의를 봐주고있는데 예비군들은 그것을 악용하고 있다.

비단 이러한 문제는 예비군 훈련장에서만 볼 수 있는 문제는 아닐것이다.
사회 곳곳에 만연되어있는 후진국적인 시민의식...
나 하나쯤은... 나도 고생했으니 너도?
대체 언제까지 이런 사고방식을 갖고 살아갈텐가...
공공과 상생을 도모하지 못하는 시민의식이 못내 아쉽다.

'삶은달걀' 카테고리의 다른 글

부모가 된다는 것  (0) 2008.01.04
한글날 Daum 이 보여준 센스  (0) 2007.10.09
새로 산 내 휴대폰이 중고??  (0) 2007.09.10
Smalltalk 객체마을 오프라인 모임  (0) 2007.08.31
자바스터디  (0) 2007.08.25
posted by 초딩입맛제주아재
2007. 9. 10. 14:54 삶은달걀
중고를 새것으로 속여서 파는 일이 비일비재하다.
우리가 쓰는 휴대폰도 그 중에 하나 이니 다음 이미지를 보고 피해받는 일이 없도록 하자.

사용자 삽입 이미지

개통일자는 한번 입력이 되면 수정이 안된다고 하는데 이것도 100% 믿긴 힘들지만 확인해서 나쁠건 없겠다.
다행히도 내 폰은 내가 첫번째 주인이다~ 만세~!!

'삶은달걀' 카테고리의 다른 글

한글날 Daum 이 보여준 센스  (0) 2007.10.09
예비군 훈련  (2) 2007.09.21
Smalltalk 객체마을 오프라인 모임  (0) 2007.08.31
자바스터디  (0) 2007.08.25
[발췌] 밀린임금 제대로 보호받자  (0) 2007.08.21
posted by 초딩입맛제주아재
prev 1 2 3 4 5 6 7 8 ··· 25 next