넌 네가 누구인지 아니? 넌 하나의 경이야. 넌 독특한 아이야. 이 세상 어디에도 너와 똑같이 생긴 아이는 없어. 네 몸을 한번 살펴봐. 너의 다리와 팔, 귀여운 손가락들이 움직이는 모양은 모두 하나의 경이야. 넌 미켈란젤로, 셰익스피어, 베토벤 같은 사람이 될 수 있어. 넌 그 어떤 것도 해낼 수 있는 능력이 있어. 넌 정말로 하나의 경이야. (Do you know what you are? You are a marvel. You are unique. In all the years that have passed, there has never been another child like you. Your legs, your arms, your clever fingers, the way you move. You may become a Shakespeare, a Michelangelo, a Beethoven. You have the capacity for anything. Yes, you are a marvel.) -파블로 피카소(Pablo Picasso)
인류 역사상 가장 창조성이 뛰어난 예술가로 인정받는 피카소의 독창성(originality)은 남과 다른 자신만의 진정한 가치를 인식하는 데서 비롯되었습니다. 다른 사람들과 비교하지 말고 자신만의 존귀한 가치를 찾아보세요. 명품은 비교할 수 없기 때문에 명품이라 불립니다.
Picasso- one of the greatest, most original and renowned artists in human history -displayed his true worth by setting himself apart from other artists. Instead of comparing yourself to others, try to find your own unique qualities. Masterpieces are called as such because they are beyond comparison.
대개의
경우
불확실성은 재앙보다 더 나쁘다.
재앙은 자주 오지 않지만, 걱정은 늘 곁에 머물며
우리의 진을 빼기 때문이다. 돌이 날아올지
꽃다발이 날아올지 우리는 알 수 없다.
돌이 날아오리라는 것을 확실히 안다면
걱정도 없다. "던져라, 그걸로 그만이지 뭐."
이런 단호함과 신념이 있으면
긴장, 동요, 공포, 좌절에서
벗어날 수 있다.
- 에크낫 이스워런의《인생이 내게 말을 걸어왔다》중에서 -
* 내일 일은 아무도 모릅니다.
모르지만, 좋은 일이 있을 것이라는 믿음과 희망을
품고 가는 사람과, 걱정과 불안감과 공포심을 품고
가는 사람의 항로는 하늘과 땅 만큼 다릅니다.
"무엇이든 던질 테면 던져봐라"
두려워말고 노를 저으세요.
행복하게! 웃으면서!
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' });
//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 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); } ); }
2500년 전 춘추전국시대에 섭공이라는 초나라 제후가 있었다. 백성이 날마다 국경을 넘어 다른 나라로 떠나니 인구가 줄어들고, 세수가 줄어들어 큰 걱정이 아닐 수 없었다. 초조해진 섭공이 공자에게 물었다. ‘선생님, 날마다 백성이 도망가니 천리장성을 쌓아서 막을까요?’ 잠시 생각하던 공자는 ‘근자열 원자래(近者悅 遠者來)’ 여섯 글자를 남기고 떠났다. -서울대 오종남 교수
사람을 소중하게 대하라 하면 흔히들 가까운 사람은 제쳐두고 남에게 잘하라는 의미로 받아들입니다. 그러나 부모, 배우자, 자녀, 상사, 동료, 부하직원, 친구 등 허물없는 이들에게 먼저 잘하는 것이 우선순위입니다.
‘가까이 있는 사람을 기쁘게 해줘야 멀리 있는 사람이 찾아온다’는 ‘근자열 원자래(近者悅 遠者來)’는 정치, 기업경영, 가정사, 친구관계를 망라한 모든 분야에 적용되는 원칙이라 할 수 있습니다.
봄은
생명이 발화하는 시기다.
꽃이 아름다운 것은 말할 것도 없이
그 꽃이 제 목숨을 바쳐 그것을 피워냈기 때문이다.
미물도 마찬가지고 새들도 마찬가지고 짐승들도
마찬가지다. 우리가 소중하게 여겨야 할 것들은
꽃을 피우기 위해 최선을 다하는 과정이지
꽃이라는 결과물이 아니다. 그게
사람이라면 더 말해
무엇하랴.
- 박범신의《산다는 것은》중에서 -
* 봄은 겨울의 끝자락에 옵니다.
꽃샘추위의 개울도 건너야 합니다.
얼어붙은 땅, 벌거벗은 나무, 황량한 숲에
언제 다시 꽃이 필까 싶어도 때가 되면 봄은 오고
봄이 오면 어김없이 꽃이 피어납니다.
지금은 비록 춥고 외롭고 아파도
당신의 봄도 반드시 오고
곧 꽃도 핍니다.
The HTML5 Web Sockets specification defines an API
that enables web pages to use the Web Sockets protocol for two-way
communication with a remote host. It introduces the WebSocket
interface and defines a full-duplex communication channel that operates
through a single socket over the Web. HTML5 Web Sockets provide an
enormous reduction in unnecessary network traffic and latency compared
to the unscalable polling and long-polling solutions that were used to
simulate a full-duplex connection by maintaining two connections.
HTML5 Web Sockets account for network
hazards such as proxies and firewalls, making streaming possible over
any connection, and with the ability to support upstream and downstream
communications over a single connection, HTML5 Web Sockets-based
applications place less burden on servers, allowing existing machines
to support more concurrent connections. The following figure shows a
basic WebSocket-based architecture in which browsers use a WebSocket
connection for full-duplex, direct communication with remote hosts.
The idea for the site came about following an HTML5 meetup after 2009′s Future of Web Design
conference in London. We realized there wasn’t a resource for people
who wanted to learn more about the hows and whys of implementing HTML5, so we decided to build one!
Originally, there were five of us (Rich, Bruce, Jack, Mike, and Tom).
Shortly before launch, Remy came on board too. Then in early 2010, Oli
made us an offer we couldn’t refuse, and we became seven.
We’d also like to offer a massive thank you to Brandan Lennox,
who has been copy editing our posts for some time now. Brandan does a
superb job of editing our articles and making them easy to read.
Our Aims
We will publish articles relating to HTML5, its semantics, and how to use it right now. We also invite questions via Ask the Doctor. We’ll post answers in future articles so that everyone can benefit.
We acknowledge that we may sometimes get things wrong and that people may disagree with our interpretation of the HTML5 specification.
But that’s another of the reasons that this site exists: the spec has
yet to be formalised, and we can all do our bit to make it what we want.
A “specification for the people” if you will.
Get involved
We invite you to freely comment, question, congratulate, argue, and
suggest in the articles’ comments sections, and we’ll do our best to
answer in a considered and reasoned manner. As we said above, the HTML5 specification has yet to be finalised, so we can all have a say, and we invite you to do so here on our site.
We hope you find HTML5 Doctor a useful resource. If you have any questions relating to HTML5 and how to implement it, just ask the doctor!
첫 전시회를 여는 화가들은 성공적으로 데뷔하기를 바라지만, 너무 많이 팔리는 일은 경계해야 한다. 갑작스러운 성공은 예술적 능력에 조금도 도움이 되지 않기 때문이다. 너무 일찍, 너무 쉽게 인정을 받다보면 그들의 예술이 힘들어 질 것이라는 사실을 나는 경험으로 알고 있다. -엘링 카게, ‘생각만큼 어렵지 않다’에서
모든 일이 순조로울 때는 ‘내가 최고’라는 의식에 안주하게 되어 그저 기존의 규칙과 질서, 습관을 계속해서 따르게 됩니다. 실패는 우리의 사고방식과 대처방안을 달라지게 만듭니다. 꽉 찬 인생을 살려면 변화를 가져오는 실패가 가끔, 아니 절대적으로 필요합니다. 실패가 부족해서 더 큰 열매를 맺지 못하고 꽃망울 상태에서 져버리는 경우가 많기 때문입니다.