골때리는 자바스크립트 외전 2탄 – 지연된 객체(Deferred Object)

오랜만에 골때리게 한번 팁을 날려보겠습니다.

jQuery 1.5 에서 획기적이지만 잘 안쓰는 게 있죠.

바로 지연된 객체(Deferred Object) 입니다.

이 객체의 위력을 정말 느껴본사람 빼고는 잘 안쓰죠.

이놈의 패턴이 어떻냐..

$.get(‘/serv/get.php’,null,function(){

     alert(‘뭘 받아온듯.’);

});

이 기존 패턴과

$.get(‘/serv/get.php’)

    .success(function(){

         alert(‘뭘 받아온듯.’);

    });

이 제이쿼리에서 제안한 패턴과 똑같은 효과를 줍니다.

뭐.. 느낌상 패턴은 당연히 틀리죠.

분명 Ajax는 비동기 스크립트입니다. 하지만 동기한 것 처럼 뭔가 착각을 불러일으키기도 하고.

바로 비동기 스크립트를 이렇게 눈에 보기 좋게 꾸며 놓는다는 장점이 있습니다.

node.js 개발하다보면 이벤트 중점적이다 보니 종종 비동기 쓸때 이런 패턴이 발생합니다.

var mongodb = require(‘mongodb’),

Db = mongodb.Db;

var db = new Db(‘test_db’, new Server(process.env[“MONGODB_HOST”], process.env[“MONGODB_PORT”], {}));

db.open(function(err, db) {

db.collection(“test_collection”, function(err, collection) {

collection.find({“cmd”:cmd}, {“sort”:”order”}, function(err, cursor) {

cursor.each(function(err, item) {

if (item != null) {

// Do something

}

if (item != null) {} // 반복문 끝

});

db.close();

});

});

});

오우 쉣. 함수안에 함수안에.. 너무 지저분합니다.

하지만 제이쿼리가 제안한 지연된 객체 패턴으로 간다면 저걸?

db.open()

.collection(‘test_collection’)

.find({“cmd”:cmd}, {“sort”:”order”})

.fetch(function(err,cursor){

cursor.each(function(err, item) {

if (item != null) {

// Do something

}

if (item != null) {} // 반복문 끝

});

})

.close();

이런 식으로 비동기 스크립팅에 제이쿼리의 최강무기 메서드 체이닝을 구사할 수 있다는 겁니다.

물론 저런 패턴 제공하는 놈은 아직까지 없으니 그대로 따라하지 마시길. 그냥 예를 든거니까요.

그럼 어떤 원리로 하는건지 오늘 골때리게 설명해 드리도록 하겠습니다.

일단 먼저, 동적 클래스의 개념과 클로저 개념을 이해하고 있어야 합니다.

저는 그 이해를 하고 있는 분으로 간주하고 팁을 씁니다. 모르면 문학이님이 떡하니 강좌 올려놨으니 보시길.

..라고 무섭게 얘기했는데. 어렵지 않습니다. 먼저 동적 클래스를 만들 함수를 하나 짜주세요.

fuynction MyDefferd(){

this.fn={};

//초기화 할거 있음 하덩가.

}

그리고 지연된 객체에서 체이닝에 사용할 프로토타입 함수 하나 만들겠습니다.

MyDefferd.prototype.done=function(func){

this.fn.done=func;

};

뭐.. 준비 끝입니다.

그리고 이제 지연된 객체를 리턴할 함수를 하나 만들겠습니다.

그리고 이 함수는 비동기 작업을 할 겁니다. 간단하게 setTimeout 을 쓰겠습니다.

function Deffer(delay){

var deff=new MyDefferd();//아까 만든 지연객체를 동적으로 하나 불러와 주시고.

alert(‘작업 시작!’);

setTimeout(function(){

if(typeof(deff.fn.done)==’function’)

deff.fn.done();//done 함수를 끌어다 씁니다.

},delay*1000);//몇초 후에? 님이 쓴 초 후에.

return deff;//반드시 동적 지연 객체를 반환해줘야 합니다!

}

이것으로 지연객체 패턴을 사용할 수 있는 함수를 쓸 준비가 끝났습니다. 참 쉽죠?

어떻게 쓰냐? 간단합니다. 예를 들어 3초 후에 작업 끝 메시지가 나오도록 꾸며보겠습니다.

Deffer(3).done(function(){

alert(‘작업 끝!’);

});

그럼 처음에 작업 시작이란 경고창이 뜬 다음, 3초 후에 작업 끝이란 경고창이 뜰겁니다.

그렇게 나오면 성공!

어때요. 참 쉽죠?

동적 클래스는 함수 종료 후 클로저 때문에 메모리 다시 반납해 하는걸 개나 줘버라는는 성질 덕분에 deff 함수에서 언제든지 저렇게 동적 클래스 안에 있는 데이터를 잃지 않고 갖다 쓸 수 있습니다.

이걸 이용해서 지연된 객체를 통해 비동기 스크립트 패턴을 동기 스크립트 패턴같이 꾸밀 수가 있는 것이죠.

이런 지연 객체를 응용해서 Ajax는 물론, node.js 에서 할 수 있는 대부분의 비동기 작업에서 여러분의 눈을 정화시키는 패턴을 만들 수 있을 것입니다.

그리고 쿨하게 오늘의 골때리는 팁을 마치겠습니다.

링크 #1은 지연된 객체 패턴을 이용한 동적 스크립트 불러오는 함수입니다.

링크 #2는 이 강좌 예제입니다. 바로 실행되고 또 하고싶음 run 버튼 누르셈.

라이센스 : 해당 강좌에 사용한 기술은 죽써도 밥써도 상관없는 Public Domain. 강좌 자체는 크리에이티브 커먼즈 라이선스

composite / 2012년 9월 10일 / 미분류 / 0 Comments

jQuery MsgBox 0.2.6 Beta

아직 베타.

https://github.com/composite/jQuery.MsgBox

http://jsfiddle.net/preFy/

리뷰 곧 작성 예정

composite / 2012년 9월 10일 / 미분류 / 0 Comments

프로시져나 뷰, 펑션등을 수정할때마다 쏘스를 저장하는 방법

http://www.sqler.com/491522

툴은 아니고 프로시져나 뷰, 펑션등을 수정할때마다 쏘스를 저장하는 방법이 있습니다.

DDL 트리거를 이용합니다.

CREATE TABLE dbo.SPLOG(

일련번호 int IDENTITY(1,1) NOT NULL,

오브젝트명 varchar(100) NULL,

구분 varchar(20) NULL,

SQLCMD varchar(max) NULL,

수정자 varchar(20) NULL,

수정일 datetime NULL,

 CONSTRAINT XPKSPLOG PRIMARY KEY NONCLUSTERED 

(

일련번호 ASC

))

GO

CREATE TRIGGER TRG_SPLOG ON DATABASE

FOR

CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE,

CREATE_VIEW, ALTER_VIEW, DROP_VIEW,

CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION,

CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER

AS

DECLARE @DATA XML

SET @DATA = EVENTDATA()

INSERT INTO DBO.SPLOG (오브젝트명, 구분, SQLCMD, 수정자, 수정일)

VALUES

(@DATA.value(‘(/EVENT_INSTANCE/ObjectName)[1]’, ‘VARCHAR(100)’),

 @DATA.value(‘(/EVENT_INSTANCE/EventType)[1]’, ‘VARCHAR(100)’),

 @DATA.value(‘(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]’, ‘VARCHAR(MAX)’),

 HOST_NAME(),

 GETDATE())

composite / 2012년 4월 27일 / 미분류 / 1 Comment

크로스 브라우저 blink

(function(){
    var a=document,b=’v’==’\v’,c=b?’attachEvent’:’addEventListener’;
    if(‘v’==’\v’){a.createElement(‘blink’);}
    window[c]((b?’on’:”)+’load’,function(){
        var d=a.getElementsByTagName(‘blink’);
            setInterval(function(){
                for(var i=0;i<d.length;i++){
                    var e=’visibility’,f=’hidden’,g=d[i].style,h=g[f];
                    g[f]=h==f?”:f;
                }
            },400);
    },!1);
})();

composite / 2011년 12월 19일 / 미분류 / 0 Comments

jQuery MsgBox 0.2.5 Alpha

세상에서 가장 가벼운 알림창. MsgBox. 라이브 예제

주의 : 표준 window.alert, window.confirm, window.prompt 함수를 대체할 수 있으나 사용자 입력 대기 하지 않음. 이벤트 기반.

cfile5.uf.184DEE3B4F41E5250B3C1B.html

cfile7.uf.153AD03B4F41E5252C3744.js

cfile30.uf.1853213B4F41E525036773.js

크리에이티브 커먼즈 라이선스
컴포지트에 의해 창작된 jQuery.msgbox 은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 3.0 Unported 라이선스에 따라 이용할 수 있습니다.
blog.hazard.kr의 저작물에 기초
이 라이선스의 범위를 넘는 이용허락은 http://blog.hazard.kr에서 받을 수 있습니다.

Creative Commons License
jQuery.msgbox by Composite ([email protected]) is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
Based on a work at blog.hazard.kr.
Permissions beyond the scope of this license may be available at http://blog.hazard.kr.

composite / 2011년 12월 7일 / 미분류 / 0 Comments

composite / 2011년 11월 11일 / 미분류 / 2 Comments

윈도우 비스타/2008 에서 절전 모드를 명령어로 처리

일단 cmd 키고

Rundll32.exe Powrprof.dll,SetSuspendState Sleep

이 명령어 실행하면 바로 절전 모드로 들어간다. 대기 시간 따위는 없다.
물론 깨려면 마우스 까딱하던가 파워버튼 누르던가 등등..

shutdown 명령어로는 종료,재시작,최대 절전까지는 가능하지만
절전 명령어는 shutdown 에서 관리를 안한다. 윈도우 8이면 모를까.

어쨌든, 이 명령어를 바로가기 시켜서 넣으면 아이콘 클릭으로 간편하게 절전 모드를 할 수 있다.
윈도우 7에서 절전 모드가 좋은 점은, 일단 컴퓨터는 꺼지며, 전기를 최대한 아끼지만 전력은 유지해야 한다.
하지만 다행이도 전기 나가던가 해서 전력이 손실되도 최대 절전 모드처럼 상태를 유지하며 윈도우를 재시작할 수 있다.
XP 까지는 절전 모드 상태에서 전원이 나가면 오류 메시지 표기하면서 2번 재시작하는 상황이 발생했다.

SSD한테는 최대 절전 모드가 유리하지만, HDD 쓰는 사람에게는 절전 모드는 정말 빠르게 부팅할 수 있는 좋은 기능이다.

composite / 2011년 9월 23일 / 미분류 / 0 Comments

윈도우 XP 에 네트워크 수준 인증을 활성화하여 원격 데스크탑 접속

이 기능은 윈도우 XP 이여야 하며 서비스 팩이 3으로 되어 있어야 한다.
또한 원격 데스크탑 버전이 6.0 이상이어야 하며 만약 비스타(2008) 이상의 컴퓨터에 접속할 일이 없으면 이 기능은 필요없다.
그리고 윈도우 7(2008 R2) 서비스팩 1인 경우 원격 데스크탑 서버가 7.x 로 올라가기 때문에 XP에서도 7.x 대로 맞춰주면 에어로 활성화 및 RemoteApp 등의 기능이 재대로 동작된다.

여태까지 레지스트리 편집기로 고생해서 활성화했는가?
이제 그만하고 이 파일만 실행하면 고민 끝난다.

cfile22.uf.1402913D4E65CFF81F2174.7z
압축 풀면 vbs 파일이 하나 나오는데, 한번 실행 한번 해주면 네트워크 수준 인증이 끝난다.
단, 재시작을 해야 적용된다는건 당연한 상식.

스크립트 출처는 http://pcloadletter.co.uk/2010/09/07/enabling-nla-on-xp/ 이므로 라이센스는 해당 저작권자에게 있다.
한글화는 내가 했다. 불펌하지마라. 티난다.

composite / 2011년 9월 6일 / 미분류 / 0 Comments

윈도우 7 절전모드가 자꾸 깨어날때 대처법

윈도우7를 사용하면서 절전모드(S3) 혹은 최대절전모드(S4) 상태로 전원관리를 하면서 전원을 끌 경우 아무 이유없이 컴퓨터가 자동으로 켜지는 경우가 나타날수 있습니다
 

이것은 윈도우7에 존재하는 시간제한 이벤트로 인해 발생하는 문제입니다.

시간제한이벤트가 발생하면 절전모드에서 자동으로 컴퓨터가 깨어난다는 말입니다.

 

따라서 절전모드나 최대절전모드로 들어간 컴퓨터를 사용자가 수동으로만 전원을 켜기를 원할 경우(즉 사용자가 직접 전원버튼을 눌려 켜기를 원할 경우)에는 아래와 같이 해야 합니다.

 

제어판-전원옵션을 클릭하고 활성화된 전원구성으로 들어가서

아래와 같이 절전 모드 해제 타이머 허용사용안함 으로 바꾸어야 합니다.

 


 * 이 설정대로 해도 WOL기능은 정상 작동합니다.  

윈도우7이 설치된 컴퓨터에서 절전모드로 들어간 컴퓨터가 아무 이유없이 불특정하게 컴퓨터가 켜지는 이유는 이것 때문입니다.

composite / 2011년 9월 3일 / 미분류 / 0 Comments

윈도우 7 작업표시줄 허무팁

라이센스 : 불펌 절대 불허용. 펌하고 싶으면 댓글에 사이트 대도록. 불펌하다 걸리면 강냉이 털린데이.
­</span><br />
<div style="text-align: left;">
일단 윈도우 7에서 작업 표시줄에서, 대부분의 프로그램에서 오른쪽 마우스를 클릭하면 이런 메뉴가 나온다.<span style="color: rgb(86, 86, 86);">

­

­`

진짜 별거 없다. 작업 표시줄에 고정 외에는. 이전 크기라던가, 최대화나 최소화 등의 예전 기능에 익숙하고, 이런 기능을 원하는 사람들이 있을 것이다.`

이럴땐 간단하다. 오른쪽 마우스 클릭 전에 shift 키를 누르고 있는 다음에 오른쪽 마우스 클릭하면`

­`

­`

이렇게 옛날식 오른쪽 마우스 메뉴가 나타날 것이다.`

그렇다면, 여러 창으로 띄운 프로그램에 shift+오른쪽 마우스를 실행하면 어떻게 되냐면,`

­`

`
이렇게 나온다. 잘 알아두시라.`
근데 듀얼 모니터 쓰는 사람 중에 Ultramon 쓰는 사람들은 세컨 모니터의 작업 표시줄에서 옛날식 오른쪽 마우스 메뉴가 나와서 조금 불편하다고 느끼는 분들 많을 것이다. 근데 그건 그 프로그램의 한계다. 한계인지 윈도우에서 막았는지는 모르겠지만.`
`

composite / 2011년 8월 18일 / 미분류 / 0 Comments