[javascript] Node.js 활용


NodeJS : https://github.com/joyent/node

Learning Server-Side JavaScript with Node.js: http://net.tutsplus.com/tutorials/java ··· de-js%2F



widget-samples / draw

* https://github.com/widget-samples/draw

node.js 로 만드는 10 줄 HTTP server

: http://ajaxian.kr/2010/02/11/http-server-written-only-10-lines/


$
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2011/04/07 13:44 2011/04/07 13:44
, ,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/6063

HTML5 : Client-Side Storage

http://www.html5rocks.com/tutorials/offline/storage/

HTML5 offers two new objects for storing data on the client:
     * localStorage - stores data with no time limit
     * sessionStorage - stores data for one session

Client-Side 데이터 기억장치
: 초기에 웹 애플리켕이션에서는 데이터저장을 서버측 데이터베이스나 브라우저 쿠키가
  담당했지만, HTML5의 등장으로 웹 개발자들은 더 많은 선택의 여지가 생겼는데 그것은
   localStorage, sessionStorage, client-side databases.

localstorage와 sessionStorage는 다수의 페이지들을 검색할 때 name/value 쌍을 설정하기
위해 javascript를 사용한다는 점에서 쿠키와 매우 유사하다. 하지만, 쿠키와 달리 부라우저이 요청이 있을 때 데이터를 와이어를 통해 전송하지 않는데, 데이터는 오직 클라이언트에만 존재한다. 그러므로 쿠키보다 더 많은 데이터를 저장하는 것이 가능하다.

이 둘은 기능적으로는 같지만, 지속성과 범위 측면에서만 다르다.

localStorage
- 윈도우가 닫힌 후에도 데이터가 저장된다. 데이터는 같은 소스(도메인네임,프로토콜,
   포트가 같아야 한다.)로부터 로드된 모든 윈도우에서 사용 가능하다.
   이는 애플리케이션 환경설정 같은 것에 유용하다.
sessionStorage
- 데이터는 윈도우객체와 함께 저장된다. 다른 윈도우(or Tab)들은 데이터 값을 알지
   못하고 윈도우가 닫힐때 사라진다. 활성화된 탭을 강조하는 것과 같은 윈도우의 특정
    상태만을 저장할 때나 테이블 정렬 순서를 저장할 때 유용하다.

value 설정 : localStorage.setItem('age', 35);
저장된 value 호출 : var age = localStorage.getItem('age');
특정한 key/value 삭제하기 : localStorage.removeItem(age);
모든    key/value 삭제하기 : localStorage.clear();

ex) kilo.js
var db;
var jQT = $.jQTouch({
    icon: 'kilo.png',
    statusBar: 'black'
});

$(document).ready(function() {
    $('#createEntry form').submit(createEntry);
    $('#settings form').submit(saveSettings);
   
    // jQTouch 덕분에 pageAnimationStart 이벤트에 loadSetting()함수를 바인딩하는것은 간단하다.
    $('#settings').bind('pageAnimationStart', loadSettings);
   
    $('#dates li a').click(function(){
       
        // 클릭된 객체의 id를 가로채서 dayoffset 변수에 저장.
        var dayOffset = this.id;
       
        var date = new Date();
        date.setDate(date.getDate() - dayOffset);
       
        // sessionStorage 에 currentDate로 저장한다.
        sessionStorage.currentDate = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear();
        refreshEntries();
    });
   
    //shortName : 디스크에 있는 database를 호출하기 위해 몇 개의 var을 정의하고 있다.
    var shortName = 'Kilo';
    // version : Database 스키마를 바꿀 필요가 있을 경우,
    // 업그레이드와 이전 버전과의 호환을 처리하기 위해 사용한다.
    var version = '1.0';
    // displayName : 사용자 인터페이스에 보이는 문자열
    // 예를 들어 아이폰에 있는 Setting 애플레케이션에서
    //   Setting > Safari > Database panel 에 displayName이 보인다.
    var displayName = 'Kilo';
    //Database 가 가지는 최대 크기를 킬로바이트 단위로 지정한다.
    var maxSize = 65536;
    //위 설정된 파라미터를 가지고 openDatabase 함수를 호출하고 연결을 db변수에 저장한다.
    //  만약 Open 하고자 하는 database가 존재하지 않으면 새로 생성한다.
    db = openDatabase(shortName, version, displayName, maxSize);
    // transaction 메서드를 호출.
    db.transaction(
        //익명 함수를 사용하여 파라미터로 트랜잭션을 전달한다.
        function(transaction) {
            // 함수 내부에서 표준 CREATE TABLE 쿼리를 실행하기 위해
            //   트랜잭션 객체의 excuteSql메서드를 호출한다.
            transaction.executeSql(
                'CREATE TABLE IF NOT EXISTS entries ' +
                ' (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ' +
                ' date DATE NOT NULL, food TEXT NOT NULL, ' +
                ' calories INTEGER NOT NULL );'
            );
        }
    );
});

function saveSettings() {
    localStorage.age = $('#age').val();
    localStorage.budget = $('#budget').val();
    localStorage.weight = $('#weight').val();
    jQT.goBack();
    return false;
}

function loadSettings() {
    $('#age').val(localStorage.age);
    $('#budget').val(localStorage.budget);
    $('#weight').val(localStorage.weight);
}

function refreshEntries() {
    var currentDate = sessionStorage.currentDate;
    $('#date h1').text(currentDate);
    $('#date ul li:gt(0)').remove();
    db.transaction(
        function(transaction) {
            transaction.executeSql(
                'SELECT * FROM entries WHERE date = ? ORDER BY food;',
                [currentDate],
                function (transaction, result) {
                    for (var i=0; i < result.rows.length; i++) {
                        var row = result.rows.item(i);
                        var newEntryRow = $('#entryTemplate').clone();
                        newEntryRow.removeAttr('id');
                        newEntryRow.removeAttr('style');
                        newEntryRow.data('entryId', row.id);
                        newEntryRow.appendTo('#date ul');
                        newEntryRow.find('.label').text(row.food);
                        newEntryRow.find('.calories').text(row.calories);
                        newEntryRow.find('.delete').click(function(){
                            var clickedEntry = $(this).parent();
                            var clickedEntryId = clickedEntry.data('entryId');
                            deleteEntryById(clickedEntryId);
                            clickedEntry.slideUp();
                        });
                    }
                },
                errorHandler
            );
        }
    );
}
function createEntry() {
    // SQL에 사용할 변수를 설정한다.
    var date = sessionStorage.currentDate;
    var calories = $('#calories').val();
    var food = $('#food').val();
    db.transaction(
        function(transaction) {
            transaction.executeSql(
                // ?는 플래이스 홀더(자리표시)이다.
                'INSERT INTO entries (date, calories, food) VALUES (?, ?, ?);',
                // Database에 전송될 값들의 배열.
                // place holder에 대응되는 값이다.
                [date, calories, food],
                // 이 익명함수는 SQL쿼리가 성공하면 실행된다.
                function(){
                    refreshEntries();
                    jQT.goBack();
                },
                // SQL 쿼리가 실패하면 실행될 함수 이름이다.
                errorHandler
            );
        }
    );
    return false;
}

// Entry 삽입이 실패하면 실행.
// 에러 핸들러는 두개의 파라미터가 전송된다. 트랜잭션 객체와 에러 객체이다.
// error 핸들러는 true 나 false 를 반환한다.
// 에러핸들러가 true를 반환할 때는 실행이 멈추고 전체 트랜잭션이 RollBack 한다.
//     "     false를 반환할 때는 계속 실행.
// ERROR Code
// Constant       Code Situation
// UNKNOWN_ERR    0    트랜잭션실패.Database자체와는 무관하고, 다른 오류코드에 포함되지 않는다. 
// DATABASE_ERR   1    Statement 실패
// VERSION_ERR    2    Operation 실패. 버전이 다르다.
// TOO_LARGE_ERR  3    Statement 실패. DB에서 리턴된 데이터가 너무 크다.SQL LIMIT modifier권유
// QUOTA_ERR      4    Statement 실패. 남아있는 공간이 충분하지 않거나 저장공간 할당량 초과.
// SYNTAX_ERR     5    Statement 실패. Syntax 에러,파라미터의 수가 맞지 않거나, 허용되지 않는 문자열 시도
// CONSTRAINT_ERR 6    Constraint 실패로 인해 insert, update, replace statement 실패
// TIMEOUT_ERR    7    Transaction을 위한 lock이 주어진 시간을 초과하였다.
function errorHandler(transaction, error) {
    alert('Oops. Error was '+error.message+' (Code '+error.code+')');
    return true;
}

function deleteEntryById(id) {
    db.transaction(
        function (transaction) {
            transaction.executeSql('DELETE FROM entries WHERE id=?;', [id], null, errorHandler);
        }
    );
}


크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/04/07 10:42 2011/04/07 10:42
,
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/6062

2500년 전 춘추전국시대에 섭공이라는 초나라 제후가 있었다.
백성이 날마다 국경을 넘어 다른 나라로 떠나니 인구가 줄어들고,
세수가 줄어들어 큰 걱정이 아닐 수 없었다.
초조해진 섭공이 공자에게 물었다.
‘선생님, 날마다 백성이 도망가니 천리장성을 쌓아서 막을까요?’
잠시 생각하던 공자는
‘근자열 원자래(近者悅 遠者來)’ 여섯 글자를 남기고 떠났다.
-서울대 오종남 교수

사람을 소중하게 대하라 하면 흔히들
가까운 사람은 제쳐두고 남에게 잘하라는 의미로 받아들입니다.
그러나 부모, 배우자, 자녀, 상사, 동료, 부하직원, 친구 등
허물없는 이들에게 먼저 잘하는 것이 우선순위입니다.

‘가까이 있는 사람을 기쁘게 해줘야 멀리 있는 사람이 찾아온다’는
‘근자열 원자래(近者悅 遠者來)’는 정치, 기업경영, 가정사, 친구관계를 망라한
모든 분야에 적용되는 원칙이라 할 수 있습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/04/07 09:07 2011/04/07 09:07
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/6061

꽃이 핀다

봄은 생명이 발화하는 시기다.
꽃이 아름다운 것은 말할 것도 없이
그 꽃이 제 목숨을 바쳐 그것을 피워냈기 때문이다.
미물도 마찬가지고 새들도 마찬가지고 짐승들도
마찬가지다. 우리가 소중하게 여겨야 할 것들은
꽃을 피우기 위해 최선을 다하는 과정이지
꽃이라는 결과물이 아니다. 그게
사람이라면 더 말해
무엇하랴.


- 박범신의《산다는 것은》중에서 -


* 봄은 겨울의 끝자락에 옵니다.
꽃샘추위의 개울도 건너야 합니다.
얼어붙은 땅, 벌거벗은 나무, 황량한 숲에
언제 다시 꽃이 필까 싶어도 때가 되면 봄은 오고
봄이 오면 어김없이 꽃이 피어납니다.
지금은 비록 춥고 외롭고 아파도
당신의 봄도 반드시 오고
곧 꽃도 핍니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/04/07 09:06 2011/04/07 09:06
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/6060

2011.04.06 수영강습(자유수영)

강사쌤이 예비군훈련중이라 오늘도 자유수영.
오리발 하는 날이라서 마레스 아반띠 엑셀을 챙겨서 출발.
역시 울 상급반 행님들 보통이 아니시네.
자유수영인데, 시작하자마자 자유형 2바퀴 돌고.
IM 200m 10회를 하자능~~~
일단 붙었지.

아~ 6바퀴째 가니까 오리발의 압박이. 발이 넘 아프다.
8회에서 난 마무리.
발이 아파서 더이상은 무리무리.
10회를 다 마치고 화이팅 함 하고.

다른 사람들 수영안할때 무호흡 접영 50m 한번 하고 샤워하러~
오리발 벗고나니, 세상에 발등이랑 발뒷꿈치가 시뻘건 것이... 다들 내 발만 처다보시는구만. 사진을 찍어둘걸.
아반띠 엑셀은 역시 직진용이야. 수영장 강습에선 쉽지 않네.

그래도, 간만에 오리발 시간이라 원없이 달려보았구만 ㅋㅋ
정신놓은 자유형도 해가며~

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 홍반장

2011/04/07 09:06 2011/04/07 09:06
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/6059


블로그 이미지

- 홍반장

Archives

Recent Trackbacks

Calendar

«   2011/04   »
          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
Statistics Graph

Site Stats

Total hits:
240440
Today:
236
Yesterday:
856