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

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 31
2007. 5. 29. 23:21 Programing/HTML/JavaScript/CSS
가계부를 업데이트 하면서 적용해봤는데 나름 만족할만한 정도다.

[Flash] http://asrada2001.mireene.com/asrada/test/수정이가능한텍스트예제.swf



테이블 셀 작업 샘플보기

[editableText.js]
/*
작성자: 물결(asrada2001.mireene.com)
작성일: 2007-05-29
*/

function createEditor(callback){
   var editor = new Editor();
   editor.callback = callback;

   try{
       document.addEventListener('click',clickEventHandler,false);
   }catch(e){
       document.attachEvent('onclick',clickEventHandler);
   }

   return editor;
}
function clickEventHandler(e){
   var evt = e || window.event;
   var target;

   if(evt.target){
       target = evt.target;
   }else{
       target = evt.srcElement;
   }

   if(target.className.search('editable') > -1){
       editor.editing(target);
   }
}

function Editor(){
   this.autosave = false;
   this.source = null;
   this.callback = null;
   this.container = null;
   this.frm = document.createElement('INPUT');
   this.frm.className = 'editor';
   this.frm.model = this;

   this.frm.onkeydown = function(e){
       var evt = e || window.event;

       if(evt.keyCode == 13){
           try{
               evt.preventDefault();
           }catch(ex){
               evt.returnValue = false;
           }

           this.model.complete();
       }
   }

   this.frm.onblur = function(e){
       if(this.model.autosave == true){
            this.model.complete();
        }else{
            this.model.cancel();
        }
   }
}

Editor.prototype.editing = function(obj){
   try{
       this.container = obj;

       if(obj.hasChildNodes() == false){
           obj.appendChild(document.createTextNode(''));
       }

       this.source = obj.firstChild;
       this.frm.value = this.source.nodeValue;
       this.frm.style.width = '100%';

       if(this.container.style.textAlign != undefined && this.container.style.textAlign != ''){
            this.frm.style.textAlign = this.container.style.textAlign;
        }else if(this.container.align != undefined && this.container.align != ''){
            this.frm.style.textAlign = this.container.align;
        }else{
            this.frm.style.textAlign = 'left';
       }

       this.container.replaceChild(this.frm,this.source);
       this.frm.focus();
       this.frm.value += '';
   }catch(e){
   }
}

Editor.prototype.cancel = function(){
   this.finish();
}

Editor.prototype.complete = function(){
   this.save();
   this.finish();

   if(this.callback instanceof Function){
       this.callback(this.container);
   }else{
   }
}

Editor.prototype.finish = function(){
   this.container.replaceChild(this.source,this.frm);
}

Editor.prototype.save = function(){
   this.source = document.createTextNode(this.frm.value);
}


모듈을 페이지에 로드시키고 에디터 객체를 생성하면 준비는 끝.
<script type="text/javascript" src="editableText.js"></script>
<script type="text/javascript">
var editor = createEditor(callback);

function callback(obj){
}
</script>


사용자가 문서의 텍스트 부분을 클릭하면 텍스트 노드를 담고있는 container 객체의 className 속성에 'editable' 가 있는지 확인한 후 에디터 객체(INPUT)에 텍스트를 전달하고 텍스트노드와 에디터를 바꿔치기한다.

에디터는 싱글턴(singleton)으로 하나의 에디터가 문서 전역에서 동작한다.

autosave 속성이 true로 설정되면 에디터에서 수정후 포커스가 다른 곳으로 이동하면 자동으로 수정한 내용이 원본 텍스트 노드에 그대로 적용이 되고 반대로 false면 원 상태로 되돌린다.
autosave를 적용하지 않으면 사용자는 데이터 수정 후 엔터키를 눌러야 수정한 내용이 반영된다.

callback 함수를 지정하면 save() 메서드를 실행 후 callback 함수를 호출한다.
xmlHttpRequest 객체를 사용할 경우 동적으로 DB의 내용을 수정 할 수 있다.

원래는 source를 <span>태그에만 할당 하려했으나 셀작업에 쓰는게 더 좋을 것 같아서 'edtiable'을 className으로 갖는 모든 객체로 수정하였다.
하지만 변경 후 맘에 안드는 것이, 원글 너비(offsetWidth)의 반영이다.
<span>,<div>등 block 객체에 edtiable 을 적용하면 원글의 사이즈에 맞게 에디터의 사이즈를 조절할 수 있는 반면 테이블의 셀(TD)에 적용 할 경우 테이블 셀 크기에 맞춰버리니 맞춤 사이즈는 포기할 수 밖에 없다....
방법을 아시는 분은 코멘트를 부탁...^^;


*주의*
Editor는 멀티라인 편집을 지원하지 않는다.
<span>,<td>,<div>,<p> 의 엘리먼트에서 오직 가장 처음에 위치한 텍스트 노드를 편집 할 수 있다.
멀티라인 편집을 위해 Editor 객체에 에디터를 input과 textarea 두개로 구분하여 childNodes.lenth로 멀티라인
여부를 판별한 후 해당 엘리먼트에 맞는 에디터를 쓰게끔 리펙토링을 시도하였으나,
editing() 메서드와 finish() 메서드에서 replaceChild를 쓸 수 없고,
텍스트 노드 사이의 태그를 검출해야 하며, 멀티라인의 경우 줄바꿈 처리를 하는 등 코드가 복잡해지는 관계로 단문 인라인 엘리먼트에 이 스크립트를 사용할 것을 당부하는 것으로 대신한다.

'Programing > HTML/JavaScript/CSS' 카테고리의 다른 글

cloneNode 의 활용  (0) 2007.06.14
수정이 가능한 텍스트2 - 인라인셀렉트박스??  (0) 2007.05.31
Javascript 객체 들여다보기  (0) 2007.05.22
What is the Flapjax.  (0) 2007.04.19
Switching Tab  (1) 2007.04.18
posted by 초딩입맛제주아재
2007. 5. 23. 18:00 Programing/JSP/ASP
□ 인쇄 설정


◆ Windows 2000 인쇄 용어


▶ 인쇄 장치 : 인쇄된 문서를 만들어 내는 하드웨어 장치

˚ 로컬 인쇄 장치 : 인쇄 서버의 물리적 포트에 연결된 인쇄 장치.

˚ 네트워크 인터페이스 인쇄 장치

- 물리적 포트가 아닌 네트워크를 통해 인쇄 서버에 연결된 인쇄 장치

▶ 프린터 : 운영 체제와 인쇄 장치 간의 소프트웨어 인터페이스, 프린터에는 문서가 인쇄장치로 도달하는 시기와 위치가 정의된다.

▶ 인쇄 서버 : 프린터와 클라이언트 드라이버가 위치한 컴퓨터.

▶ 프린터 드라이버

- Windows 2000에서 인쇄 명령을 특정 프린터 언어로 변환하려면 필요한 저오가 들어 있는 하나 이상의 파일이 필요하다.

printer - 인쇄 할수 있게 지원하는 소프트웨어

Print Device - 인쇄 장비



▶ 네트워크 프린터 구성에 필요한 요건

1. 적어도 컴퓨터 한 대가 인쇄 서버로서 작동해야 한다.

2. 문서를 처리하기에 충분한 RAM 이 있어야 한다.

3. 인쇄 서버에 문서를 저장할 수 있는 충분한 디스크 공간이 필요하다.


▶ 네트워크 프린터 설치 지침

1. 조직에서 필요로 하는 인쇄 요구 사항을 파악한다.

2. 부서별 인쇄 요구 사항을 파악한다.

3. 네트워크의 프린터 수와 종류를 관리하기 위해 네트워크에서 필요로 하는 인쇄 서버체크

4. 프린터 장치의 위치를 결정한다.

5. 어떤 인쇄 작업이 높은 우선 순위를 필요로 하는지 판단한다.


◆ 프린터 추가


▶ 로컬 인쇄 장치에 대해 프린터 추가 및 공유

- 공유 프린터를 추가할 때는 Administrator 로서 인쇄 서버에 로그인

- Printers 시스템 폴더의 프린터 추가 마법사를 이용하여 프린터 추가

참고: 네트워크 프린터를 추가하고 공유할 때 Windows 2000에서 자동으로 Active Directory 에 프린터를 게시한다. 그러면 사용자는 Active Directory에서 프린터를 검색할수 있다. Windows 2000네트워크가 없거나 Active Directory 가 미설치시 공유 프린터를 네트워크를 통해 검색가능하다.



◆ 네트워크 프린터 구성


▶ 프린터 Pooling 이란?

- 인쇄작업을 여러 프린트 장치에 분산 시키므로써 인쇄 작업의 효율성을

   높이는 기능(인쇄 로드 균형)

▶ 참고 사항

- 한대의 프린터에 여러 인쇄 장치에 연결 할 수 있다.(프린터 풀링)

- 여러대의 프린터에 한대의 인쇄 장치를 연결 할 수 있다.

   (인쇄의 우선순위 설정시 사용한다.)

▶ 프린터 풀 설정

- 인쇄 서버의 여러 포트를 통해 여러 인쇄 장치에 연결된 한 대의 Printer로 이루어져있다.

▫ 장점

- 인쇄량이 많은 네트워크의 경우 인쇄 서버에서 문서가 대기하는 시간이 줄어든다.

- 한 대의 프린터에서 여러 인쇄 장치를 관리할 수 있기 때문에 관리가 쉽다.

팁 프린터 풀에 대해 인쇄 장치를 설정할 때 사용자들이 쉽게

문서를 찾을수 있도록 인쇄 장치를 동일한 물리적 영역에 배치한다.



˚ 프린터 풀링을 구성하는 방법

1. 프린터 서버에 인쇄 장치를 연결한 후 프린터를 설치 한다.

2. 각 프린터에 프린터 풀링을 사용하도록 설정한다.

▫ 순서 (자세히)

1. 프린터 등록정보 클릭

2.포트 탭에서 프린터 풀링 확인란을 선택

3. 인쇄장치를 연결할 각 포트에 대한 확인란을 선택한 후 확인을 클릭

▶ 프린터 우선 순위 설정

- 프린터 간에 우선 순위를 설정하여 동일한 인쇄 장치로 인쇄되는 문서의 우선 순위 설정.

˚ 기본 작업

- 둘 이상의 프린터에서 동일한 인쇄 장치 (동일한 포트)를 가리키도록 한다.

- 인쇄 장치에 연결된 각 프린터마다 다른 우선 순위를 설정한 다음 서로 다른 그룹의 사용자들이 서로 다른 프린터로 인쇄하도록 한다.

- 우선 순위가 높은 문서는 우선 순위가 더 높은 프린터로 보내고,우선 순위가 낮은 문서는 우선 순위가 더 낮은 프린터로 보내도록 한다.

˚ 순서

- 프린터에 등록정보 연다.

- 고급탭에서 우선순위를 변경해준다

- 높은값일수록 우선 인쇄된다.


▶ 스풀 폴더 구성

- 인쇄전 파일 이미지를 저장하는곳

- 서버에 프린터를 사용하는 사람이 많을수록 spool folder 용량을 크게 할 필요있음

˚ 저장 위치 (인쇄작업) : c:\winnt\system32\spool\printers

˚ 파일 - 서버 등록 정보 -고급- 스풀 폴더 설정

☞ spool Folder 를 C: 와 다른 하드( 파티션)에 저장하는게 좋음



▶ 인쇄 작업이 전달 되는 순서

- 인쇄 관련 프로그램(워드, 기타 응용프로그램)=>프린터 서버=>Spool 폴더

  =>인쇄 장치


◆ 인터넷 인쇄 구성

- 웹 브라우저를 사용하여 인터넷 또는 인트라넷에 있는 프린터로 인쇄하는 기능이다.

프린터의 URL 을 알고 해당 사용 권한만 있으면 인쇄 작업을 인터넷에 있는 모든 컴퓨터로 보낼수 있다.

ex) 사용자는 문서를 보내어 회사 사무실에 있는 인쇄 장치에서 다른 상태로 인쇄되도록 할수 있다. 인터넷 팩스 서비스와 같은 응용 프로그램에서 활용될 수 있다.

▶ 필요 조건

- 프린터를 공유해야 한다.

- 인쇄 서버는 다음중 하나여야 한다.

˚ win 2000server 또는 Microsoft Internet Information Services (IIS) 를 실행하는 컴퓨터

( 프로그램 추가/제거에서 구성파일 추가가능)

˚ win 2000 또는 Microsoft Peer Web Services (PWS)를 실행하는 컴퓨터


▶ 인터넷 인쇄 서비스를 구성하는 방법

1. 인터넷 정보 서비스(WWW 서비스) 설치

  윈도우 구성 요소 추가/제거=>인터넷 정보 서비스=>WWW 서비스를 추가

  인터넷 인쇄 서비스에 필요한 파일 위치 확인 : C:\WINNT\Web\printers


2. C:\WINNT\Web\printers 폴더를 가상 디렉토리로 구성

   가상 디렉토리 이름은 Printers로 구성

  가상 디렉토리 란? 인터넷에 로컬 디스크 드라이브에 저장된 데이터(폴더)를

                    게시하기 위한 서비스

3. http://localhost/printers 로 접속


▶ 순서 (자세히)

1. 프로그램 추가/제거( appwiz.cpl )

2. Windows 구성요소 추가/제거 - 인터넷 정보 서비스 선택 - 자세히

3. World Wide Web 선택 - 확인 ( 원본 CD 필요)

˚ 단축키 : inetmgr (인터넷 정보 서비스)

˚ 인터넷 정보 서비스 관리도구 : inetmgr

시작=>프로그램=>관리도구=>인터넷 서비스 관리자

  - 기본 웹사이트의 위치 : C:\Inetpub\wwwroot

˚ 순서 : 가상 디렉토리 - inetngr - 기본웹 - 새로만들기 - 가상디렉토리

        - 가상 추가 - 정보 - 등록정보(문서)에서 ipp_0001.asp 추가.

(가상 디렉토리에 대한 기본 페이지를 ipp_0001.asp 로 변경 한다.)


˚ 주소에서 http://server_name /printers 에 접속하여 인쇄 가능


Question


1. Windows 2000 인쇄에 있어서 인쇄 장치와 프린터의 차이는 무엇인가?

☞ Print Device : 물리적인 프린터

  Printer :Software Interface

2. 회사의 인쇄 서버를 만들도록 요청을 받았다. 인쇄 서버를 windows 2000 Advanced Server 에 상주시키고자 한다. 인쇄 서버를 작성할 때 고려해야 하는 점은?

☞ 1.프린터 서버의 RAM 과 Hard Disk 의 충분한 공간 필요

  2. 요구사항 분석, 장치 위치, Server, Printer Device 체크 등..

3. TCP/IP 네트워크에 네트워크 인터페이스 프린터를 설치할 때 어떤 포트를 사용하는가? 이포트에 어떤 정보를 제공해야 하는가?

☞ Standard TCP/IP 포트 사용 하고네트워크 인터페이스 또는 DNS 이름의 IP Address 을 제공 해아 한다.

(출처: naver 지식In)


이번에 거래처에 웹프린터 셋팅을 해줄 일이 생겼는데 멋모르고 덤볐다가 무쟈게 고생했다...
위에서 하란대로 다 했는데도 안되고 몇일을 삽질 끝에 해결했다...

범인은 방화벽....
방화벽의 예외에 80포트르 추가하니 원격지의 프린터로 접속이 된다.

다 해결된듯 했으나 또 하나의 문제가 덜컥....
프린터로 접속은 되는데 인쇄가 안되는 것이었다. 로컬 인쇄도 안되고...
프린터는 Standard Tcp/Ip 포트로 등록을 해두었었는데 그냥 로컬 USB포트로 등록을 하니 잘 된다~


'Programing > JSP/ASP' 카테고리의 다른 글

ASP: 동적 include  (1) 2007.05.22
ASP의 가변변수  (1) 2007.04.19
[펌]톰캣과 아파치,IIS연동에 관하여  (0) 2007.01.12
[ASP]php의 exit와 같은 기능을 하는 Response.end  (0) 2007.01.03
posted by 초딩입맛제주아재
2007. 5. 22. 16:31 Programing/JSP/ASP
ASP에서는 동적 include가 불가능하다..
불가능하다고 말한 이유는 PHP처럼 include $url; 구문이 안먹히기 때문이다.
이미 페이지가 로딩이 될때 include 할 파일을 모두 처리하기때문에 뒤늦게 include를 요청하면 묵살해버리는 것이다.
때문에 조건에 의해 include파일을 바꿔주어야 하는 경우 Server.execute(url) 처럼 해주어야 한다.
하지만 이 방법에도 문제는 있다.
include 된 문서는 본문에 흡수되어 변수의 공유가 가능하지만 Server.execute() 로 불러들인 문서는
본문과 별개로 변수 공유가 안된다.

PHP의 간결하고도 유연함을 왜 ASP에서는 구현을 못한것일까...

'Programing > JSP/ASP' 카테고리의 다른 글

웹 프린터  (0) 2007.05.23
ASP의 가변변수  (1) 2007.04.19
[펌]톰캣과 아파치,IIS연동에 관하여  (0) 2007.01.12
[ASP]php의 exit와 같은 기능을 하는 Response.end  (0) 2007.01.03
posted by 초딩입맛제주아재
2007. 5. 22. 15:38 Programing/Smalltalk

tempStr := 'e:\ccc\ddd\Adobe_Acrobat7_Pro_KOR_SN.txt'. "파일명 추출"
tempStr rightString: (tempStr reverse findString: '\') - 1. "디렉토리명 추출"
tempStr leftString: (tempStr size - (tempStr reverse findString: '\')).

tempStr leftString: 4.   "왼쪽에서 4글자"
tempStr reverse. "뒤집기"
tempStr rightString: 6. "오른쪽에서 6글자"
tempStr isLiteral. "리터럴인가?"
tempStr isString."문자열인가?"
tempStr subStrings: '\'. "문자열 나누기(배열) = explode"
tempStr midString: 3 from: 2.  "문자열 추출 = substr"
tempStr findString: '\'. "문자열 위치 찾기 = strpos"
tempStr findString: 'l' startingAt: 5. "문자열 위치 찾기 + 시작위치 설정"
tempStr first: 5. "처음부터 inteager 만큼 추출"
tempStr hash.
tempStr includes: $\.
tempStr indexOfAnyOf: 'smallt' startingAt: 1.
tempStr subStrings.
tempStr replaceFrom: 2 to: 3 with: 'bc' startingAt: 1.

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

Smalltalk의 TDD  (0) 2006.12.28
Smalltalk의 편리함과 백업의 중요성  (1) 2006.12.28
가계부 만들기 - 짧은숙제  (0) 2006.11.16
가계부 만들기 - 08  (0) 2006.11.16
가계부 만들기 - 07  (0) 2006.11.16
posted by 초딩입맛제주아재
2007. 5. 22. 14:49 Programing/HTML/JavaScript/CSS
javascript의 객체의 속성은 객체.속성이름 으로  접근이 가능하다.
그리고 또 하나 다른 표현이 있는데 바로 객체['속성이름'] 이 그것이다.

var obj = new Object();
obj.id = 'first';
obj.name = 'wave';
obj.age = '20';
obj.sex = 'male';

alert(obj.id);
alert(obj['id']);

이제 객체 안을 통째로 들여다 보는 방법을 알아보자
위에서 언급한 객체['속성이름']의 표현식을 이용하면 된다.

var msg = '';

for(var temp in obj){
  msg += temp + ' = ' + obj[temp] + '\n';
}

alert(msg);

for(A in B)는 B의 속성을 하나하나 꺼내서 A에 담는다.

어찌 보면 객체 == 배열 의 형태로 보이기도 하는데, phpschool 에 이와 관련한 재밌는 토론이 있었으니 참고하길 바란다...토론보기

posted by 초딩입맛제주아재
2007. 5. 15. 13:49 음악



Olivia Newton-John  「 Blue Eyes Crying in the Rain」


In the twilight glow I see you
저녁놀 속에서 난 그대 모습을 봐요

Blue eyes crying in the rain
빗속에서 눈물 흘리던 푸른 눈동자를

When we kissed goodbye and parted
작별 키스를 하고 헤어지면서

I knew we'd never meet again
난 우리가 다신 만나지 못하리란 걸 알았어요

Love is like a dying ember
사랑은 꺼져가는 모닥불

Only memories remain
추억만 남아 있어요

Through the ages I'll remember
세월이 흘러도 난 기억할 거예요

Blue eyes crying in the rain
빗속에서 눈물 흘리던 푸른 눈동자를

Now my hair has turned to silver
내 머리 이제 백발이 되었어요

All my life I've loved in vain
그간 사랑해왔던 내 모든 삶이 허망해요

I can see your star in heaven
하늘을 보면 당신 별이 보여요

Blue eyes crying in the rain
빗속에서 눈물 흘리던 푸른 눈동자가

Someday when we meet up yonder
언젠가 우리 저 하늘 위서 다시 만나면

We'll stroll hand in hand again
우리 다시 손에 손 잡고 거닐 거예요

In a land that knows no parting
이별을 모르는 땅에서

Blue eyes crying in the rain
빗속에서 눈물 흘리던 푸른 눈동자여


1975년 발매된 윌리 넬슨의 원곡을
올리비아 뉴튼 존이 이듬해인 1976년 앨범 'Come On Over'에서 리메이크를 해 큰 인기를 끓었던 곡이다.

얼마전 외근을 가면서 라디오에서 흘러 나온 이 노래를 듣는 순간 지나간 옛 추억들이 아스라히 내 머릿속을 맴돌았다.
유년시절의 친구들, 학교생활,보고싶은 사람들...
모두가 그립기만 하다.
그리고 생각해본다.
과연 그 때 그 시절 내가 꿈꾸었던 미래의 나는 어떤 모습이었는지....

posted by 초딩입맛제주아재
2007. 5. 14. 09:36 LINUX
# cat < /dev/null > filename

풀이를 해보면

< 는 표준입력이고 >는 표준 출력이므로 /dev/null 장치에서 입력을 받아 filename으로 출력을 한다는 뜻이다.
/dev/null 은 이름 그대로 null, 즉 아무것고 없는 장치이니 filename은 아무 내용이 없는 빈 파일로 만들어진다.

이와 더불어 '>>' 는 추가입력 파이프로

# cat < /dev/null >> log_filename

위와 같이 실행했다면 filename 의 기존 내용은 변하지 않는다.

하지만 다음과 같이 실행한다면 sample.txt 의 내용이 filename 에 덧붙여진다.
# cat < sample.txt >> filename

'LINUX' 카테고리의 다른 글

윈도우에서 리눅스 파일시스템 마운트하기  (1) 2007.06.27
VI 한글  (0) 2007.06.25
wc  (0) 2007.02.06
FIND  (0) 2007.02.05
crontab  (0) 2007.01.26
posted by 초딩입맛제주아재
2007. 5. 3. 13:41 날개를달자
어영부영하다가 결국 완성을 못해서 참여하지 못했던 매쉬업 경진대회...

까맣게 잊고 있다가 문득 생각이 나서 블로그를 가보니 벌써 오래전에 대회 시상이 끝나있었다.
참가작들을 하나하나 살펴보면서 탄성이 절로 나왔다.
역시 세상은 넓구나..
나는 정말 아무것도 아니었구나...
우물안 개구리였던 나를 다시 한번 돌아보게 해주었다.

가다가 중지하면 아니감만 못하다....

벌려 놓은 일들을 얼른 수습해야할텐데...

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

역시 Apple  (0) 2007.09.04
[펌]인스턴트 커피에 담긴 철학  (0) 2007.07.05
매쉬업 캠프 2007  (2) 2007.02.25
프로그래머를 위한 잠언(aphorism)  (0) 2007.02.13
EBS 지식채널 - 이소룡이 이소룡에게 2부  (0) 2007.02.02
posted by 초딩입맛제주아재
2007. 4. 19. 17:33 Programing/JSP/ASP
기본적으로 ASP는 가변변수를 지원하지 않는다.
하지만 Execute() 를 통해서 가변변수를 구현 할 수 있다.

a = "abc"
Execute(a & "= 1")
Response.write(abc)


실행하면 1이 출력된다.

가변변수에 문자열 값을 넣을때는 이스케이프 문자 "\"를 쓴다.


Execute(a & "=" & chr(34) & "bbb" & chr(34))


불편하지만 필요하다면 쓸 수 밖에....
php는 참 편한데 :)

'Programing > JSP/ASP' 카테고리의 다른 글

웹 프린터  (0) 2007.05.23
ASP: 동적 include  (1) 2007.05.22
[펌]톰캣과 아파치,IIS연동에 관하여  (0) 2007.01.12
[ASP]php의 exit와 같은 기능을 하는 Response.end  (0) 2007.01.03
posted by 초딩입맛제주아재
2007. 4. 19. 11:43 Programing/HTML/JavaScript/CSS

아프리카 초원의 날씨만큼이나 변덕스러운 웹 세상에 또 하나의 주목할 만한 언어가 등장했다.
이름하여 Flapjax.
웬지 이름에서 AJAX의 냄세가 느껴지지 않는가?

Flapjax 홈페이지에서는 Flapjax를 다음과 같이 소개하고 있다.

Flapjax is a new programming language designed around the demands of modern, client-based Web applications. Its principal features include:

  1. Event-driven, reactive evaluation
    print time of last click of btn1 or btn2 time: {! merge($EVENT('btn1', 'click'), $EVENT('btn2', 'click')).
    snapshot((new Date()).getTime()) !}
  2. Persistent data saved on a data store we provide
    keep a copy on the server of 'age' as it changes writePersistentObject($E('age'), {path: ['savedAge']});
  3. Convenient data sharing
    create a link to share the current user's tasklist getSharingConsoleLink('receivepage.html?user=' + uidB, ['tasklist']);
  4. Access-control for shared data
    display whether the user can write to an object {! readPermissionsB({path:['tasklist']}).has('WRITE')?'yes':'no'!}
  5. Interfaces to external Web services
    show the first link of a user's delicious bookmarks <input type=text id=u value='enter name'/>:
    {! getWebServiceObject_e({url: 'del.icio.us/feeds/json/'
    + $B('u'), serviceType: 'jsonLiteral'}).posts[0].d !}
  6. Optional templating syntax
    provide a live preview of a form value <input type=text id=age/>
    preview: {! 'age:' + $B('age') !}

홈페이지에서는 Flapjax 를 새로운 언어로 규정하고 있는데 실제로 Flapjax 코드를 보면 전혀 낯설지가 않다.
그 이뉴는 Flapjax가 Javascript를 확장한 것이기 때문인데 다음 예제를 보면 무슨말인지 이해가 갈 것이다.

<html>
  <head>
  <script lang="text/javascript" src="/demos/flapjax.js">
  </script>
  <script lang="text/javascript">
     var loader = [];
     var flapjax = flapjaxInit(false, false);
  </script>
  <title>
     Flapjax Demo: Where's the Mouse?: Flapjax Scripting
  </title>
 
  <script lang="text/javascript" type="">
     function loader0()
     {flapjax.insertDomB(flapjax.mouseTop_b(document), "Mtop");
      flapjax.insertDomB(flapjax.mouseLeft_b(document), "Mleft");}
     loader.push(loader0);
  </script>
 
  </head>
 
  <body onload="flapjax.forEach(function(l){ l(); }, loader)">
  <p>
     The mouse's coordinates are
&lt;
     <span id="Mleft">
       _
     </span>
     ,
 
     <span id="Mtop">
       _
     </span>
     &gt;.

  </p>
 
  </body>
 
</html>

위 예제는 마우스 포인터의 위치를 화면에 표시해주는 코드이다.
기존의 Javascript 코드와 전혀 다를바가 없다.

하지만, 사실 이 코드는 컴파일된 코드이다.
갑자기 무슨 컴파일이 나오는지 당황하겠지만 Flapjax는 Flapjax API를 이용해 코드를 작성하고  컴파일러를 통해서 아웃풋을 만들어야 브라우져에서 인식할 수 있다.
위 코드의 실제 Flapjax 코드는 아래와 같다.

<html>
<head>
<title>Flapjax Demo: Where's the Mouse?: Flapjax Scripting</title>

<script lang="flapjax">
insertDomB(mouseTop_b(document), 'Mtop');
insertDomB(mouseLeft_b(document), 'Mleft');
</script>

</head>

<body>
<p>
The mouse's coordinates are
&lt;<span id="Mleft">_</span>,
  <span id="Mtop">_</span>&gt;.
</p>
</body>

</html>


이처럼 Flapjax를 이용하면 개발자가 작성할 코드가 줄어들게 되는데 Flapjax측은 그 양을 아웃풋의 두배정도까지 줄일 수 있다고 한다.

단순히 코드의 양을 줄이는것이 Flapjax의 전부라면 Flapjax에 의미를 둘 수는 없다.
Cameron Laird은 IBM 개발자 네트워크에 포스팅한 Flapjax 튜토리얼에서 Flapjax를 특징을 아래와 같이 설명하고 있다.

Flapjax를 배워야 하는 이유

Flapjax는 Ajax를 손쉽게 코딩할 수 있는 방법을 제공하지만 Ajax를 편리하게 쓸 수 있는 래퍼 그 이상이다. 다음 섹션에서는 Flapjax에 대해 좀더 자세히 다루고자 한다. Flapjax에 대한 전체 내용을 다루기에는 본 튜토리얼의 목적에 벗어나는 감이 있어 일부만 소개한다. 본 기술문서에서는 다음 내용을 비롯하여 Ajax 프로그래밍 기술을 단순화하는 데 Flapjax가 어떤 역할을 담당하는지 보여준다.

  • 브라우저의 "새로 고침" 업데이트 관리
  • 사용자의 포인트 앤 클릭에 대한 응답
  • 복잡한 웹 애플리케이션을 위한 네트워크 로드 최적화
  • "외부" 서버 정보 검색

Flapjax는 입력(예: 최종 사용자의 동작과 선택)과 출력(예: 브라우저 창에서 보기) 간의 원활한 정보 교환, 즉 "반응"을 정의하고 표현하는 데 사용된다. 동시에 Flapjax는 기존 자바스크립트 작업과 호환 가능하다. Flapjax에는 자바스크립트에서 이미 쓰이고 있는 DHTML(Dynamic HTML)과 CSS(Cascading Style Sheets)가 사용되며, 현재 어떠한 새로운 시각적 요소도 추가되지 않았다. 이러한 관점에서 Flapjax는 순수하게 알고리즘 방식을 사용하고 "시각적"인 어떠한 것도 제공하지 않으며 이미 알고 있는 위젯을 더 쉽게 프로그래밍할 수 있도록 도와준다.


갈수록 AJAX 애플리케이션의 개발이 활발하게 이루어지고 있다.
더이상 AJAX는 고급 기술자들만의 전유물이 아니다.
다양한 프레임워크와 손쉽게 원하는 아웃풋을 만들어주는 언어와 툴들이 하루가 멀다하고 발표되고 있다.
Flapjax도 그 중 하나로, 앞으로 얼마만큼 개발자들의 호응을 얻으며 발전해 나갈지는 미지수다.
하지만 분명한것은 Flapjax는 배우기 어려운 언어도 아니며 사용하기 까다로운 언어도 아니라는 것이다.
그리고 그점은 분명 메리트로서 작용할 것이다.


posted by 초딩입맛제주아재