'hacking/web'에 해당되는 글 85건

  1. 2011/06/30 단일 페이지 인터페이스 웹/앱 개발 (1)
  2. 2011/04/08 xui.js - 모바일 html5 웹앱을 위한 초경량 자바스크립트 라이브러리
  3. 2011/03/29 CORS(Cross-Origin Resource Sharing)을 활용한 크로스도메인 Ajax (4)
  4. 2011/03/24 앱스프레소 확장 API를 사용한 AJAX (6)
  5. 2011/03/14 웹킷 CSS 애니메이션으로 스타워즈 오프닝 크롤 구현하기
  6. 2011/03/13 웹에서 아이폰스러운 Carousel 구현하기
  7. 2011/03/13 터치기반 모바일 웹킷에서 버튼 반응 속도 개선하기
  8. 2010/11/18 HTML5/CSS3/JavaScript로 아이폰 앱 만들기 - XCode 프로젝트 템플릿 (1)
  9. 2010/11/16 HTML5/CSS/JavaScript로 안드로이드 "앱" 만들기
  10. 2010/11/14 HTML5/CSS/JavaScript로 아이폰 "앱" 만들기 (6)
  11. 2010/10/08 Jo HTML5 Mobile Application Framework 초간단 리뷰
  12. 2009/12/10 JavaScript Common Mistakes(3) - 다른 언어에 익숙한 개발자들이 하기 쉬운 실수
  13. 2009/12/09 JavaScript Common Mistakes(2) - This "this" is not the "this" (2)
  14. 2009/12/08 JavaScript Common Mistakes (1) - Async! Async! Async! (10)
  15. 2009/12/05 dwLive! 웹개발 다반사 - 발표 자료(JavaScript Common Mistakes) + 후기 (4)
  16. 2009/12/03 dW Live! 세미나 ‘웹 개발 다반사’ (2)
  17. 2009/11/19 웹 기반 스펠 체커 API + 다음 오픈 에디터 플러그인 (4)
  18. 2009/09/23 Google Chrome Frame! - 구린 IE를 피해가는 구글의 구린 꼼수
  19. 2009/09/15 Delightbox - dojo 기반의 Lightbox
  20. 2009/08/24 심심풀이 코딩 - 자바스크립트로 만든 벽돌깨기~ (7)
  21. 2009/06/08 Road to Web3.0 (2)
  22. 2009/04/24 웹개발자(또는 디자이너)를 위한 퀵레퍼런스카드 (3)
  23. 2009/01/07 Dojo Objective Harness를 이용한 웹 2.0 애플리케이션 단위 테스트
  24. 2008/11/16 아파치 더비를 이용한 오프라인 Ajax (2)
  25. 2008/10/24 전문가다운 Ajax 애플리케이션 개발, Part 3: DWR, 자바, Dojo 툴킷을 사용하여 자바와 자바스크립트 통합하기
  26. 2008/10/08 Dojo Toolkit 1.2 버전 릴리즈 (1)
  27. 2008/10/05 Ajax로 사이트 전면 개편, Part 4: 기존 사이트를 jQuery와 Ajax forms를 사용하여 개선하기
  28. 2008/09/23 Ajax로 사이트 전면 개편, Part 3: jQuery, Ajax 탭, 회전식 슬라이드쇼로 기존 사이트 개선하기 (2)
  29. 2008/08/20 dojo by example(7) - object system
  30. 2008/08/13 씽크프리 노트를 원격 블로깅 도구로 활용하기 (2)
hacking/web2011/06/30 18:52
크리에이티브 커먼즈 라이선스
Creative Commons License
지난 두 달 동안 k-mobile을 통해서 "모바일웹 & HTML5 하이드브리드 앱 개발"이라는 주제로
3일에 걸쳐 매일 3시간씩 총 9시간 강의가 있었는데,
여기서 소개하는 자료는 그 중에서 첫날 3시간 동안 발표한 내용이다.

강의 자료를 대충 살펴보면 알겠지만,
뜬구름 같은 트렌드 혹은 패러다임을 "얘기"하고 있어서,
구체적인 기술이 중요한 3일짜리 속성 과정에 적합하지 않은 것 같아 자진 사퇴(?)하고, 발표자료를 공개(?)한다.
내가 발표했던 첫날 3시간은 @ibare님이 좀 더 실무적이고 유익한 내용으로 강의하실 듯~ ^^
may the keynote be with you...
저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2011/04/08 13:20
크리에이티브 커먼즈 라이선스
Creative Commons License

xui.js 초간단 리뷰


요약

xui.js는 모바일 html5 웹앱에 특화된 초경량 자바스크립트 라이브러리

특징

  • 초경량(9.4k) - jquery 최소 29k, dojo 최소 31k, jQueryMobile 최소 135k, Sencha Touch 최소 524k, …
  • 단순 명쾌하고 익숙한(jQuery 스타일의 메소드 체이닝) 문법
  • 모바일에 최적화(webkit, ie mobile, blackberry)
  • 제약없는 오픈소스 라이센스(MIT; Sencha의 듀얼 라이센스 대비 장점)

개발 배경

NitobiPhoneGap 용으로 개발한 자바스크립트 라이브러리.

기능 요약

아래에, xui.js가 제공하는 모든(!) 함수를 간략하게 설명합니다. 개발자 분들의 이해를 돕기 위해 대응하는 jquerydojo의 함수도 같이 소개 했습니다.

기본 함수

  • extend(object)
    • 프로토타입 상속
    • [ jquery.extend(), dojo.extend() ]
  • find(selector, context)
    • css 셀렉터에 부합하는 노드 선택.
    • [ jquery.find(), dojo.query() ]
  • set(array)
    • 명시적으로 노트 선택.
  • reduce(elements, index)
    • 중복 제거
    • [ jquery.unique() ]
  • has(selector)
    • css 셀렉터에 부합 여부 확인
    • [ jquery.has(), dojo.query() ]
  • filter(fn)
    • 노드 필터링(제외).
    • [ jquery.filter(), dojo.filter() ]
  • not(selector)
    • css 셀렉터에 부합하지 않는지 확인.
    • [ jquery와 dojo의 not() css selector ]
  • each(fn)
    • 노드 순회
    • [ jquery.each(), dojo.forEach() ]

DOM 조작 함수

  • html(location, html)
    • HTML 컨텐츠 조작.
    • location: inner,outer,top,bottom,remove,before,after 중의 하나(생략가능; 생략하면 inner). 동일한 이름을 가진 단축함수(inner(html) 등) 사용 가능.
    • [ jquery.html(), dojo.place() ]
  • attr(attribute, value):
    • HTML 속성 조작.
    • value를 생략하면 get.
    • [ jquery.attr(), dojo.attr() ]

이벤트 함수

  • on(type, fn)
    • 이벤트 핸들러 등록.
    • type: click, load, touchstart, touchmove, touchend, touchcancel, gesturestart, gesturechange, gestureend, orientationchange 등. 동일한 이름을 가진 단축함수(예: click() 등) 사용 가능.
    • [ jquery.bind(), dojo.connect() ]
  • un(type, fn)
    • 이벤트 핸들러 등록 해제.
    • fn을 생략하면 해당 이벤트에 등록된 모든 이벤트 핸들러 등록 해제.
    • [ jquery.unbind(), dojo.disconnect() ]
  • fire(type, data)
    • 가상의 이벤트 발생.
    • data: 이벤트 핸들러로 전달되는 event 객체의 data 속성으로 전달(생략 가능).
    • [ jquery.trigger() ]

화면 효과 함수

  • tween(properties, callback)
    • css 속성 인비트윈(inbetween) 에니메이션.
    • properties: 에니메이트할 css 속성-값 pairs과 duration, after, easing 등의 추가 속성들 또는 속성들의 배열.
    • [ jquery.animateProperty(),  dojo.animateProperty() 등 ]

CSS 스타일 함수

  • setStyle(property, value)
    • css 속성 설정.
    • [ jquery.css(), dojo.style() ]
  • getStyle(property, callback)
    • css (계산된)속성 얻기.
    • [ jquery.css(), dojo.style() ]
  • addClass(className)
    • css 클래스 추가.
    • [ jquery.addClass(), dojo.addClass() ]
  • hasClass(className)
    • css 클래스 확인.
    • [ 참고: jquery.hasClass(), dojo.hasClass() ]
  • removeClass(className)
    • css 클래스 제거.
    • [ jquery.removeClass(), dojo.removeClass() ]
  • css(properties)
    • css 속성 일괄 설정.
    • [ jquery.css(), dojo.style() ]

XHR(AJAX) 함수

  • xhr(loation, url, options|fn)
    • AJAX 요청.
    • location: 결과(responseText)를 반영할 노드(생략 가능).
    • options: method, async, data, callback 등의 추가 속성 지정(생략 하거나 callback 함수만 지정 가능).
    • [ jquery.ajax(), ajax.load(), ajax.get(), ajax.post(), dojo.xhr(), dojo.xhrGet(), dojo.xhrPost()  등 ]

결론

xui.js는 jquery나 dojo 등의 기존 자바스크립트 라이브러리에서 널리 사용되지 않는 기능들과 다양한 데스크탑용 브라우져 지원을 위한 부가적인 코드를 제거하고, 자주 사용되는 함수들과 모바일 환경에서 꼭 필요한 브라우져만 지원하도록 최적화된 자바스크립트 라이브러리 입니다. 장단점을 요약하면 다음과 같습니다:
  • PROS: 크기, 성능, 구성, 소스 코드 품질
  • CONS: UI 툴킷 부재. 데스크탑 브라우져 호환성 부재. 문서 / 사용자 커뮤니티  부재.

직접 UI 툴킷을 만들 게 아니라면, 별도의 UI 툴킷을 사용해야 하므로 작은 크기로 인한 장점이 오히려 단점이 됩니다. JQueryMobile을 쓰려면 결국 jQuery가, Sench Touch를 쓰려면 결국 ExtJS가, Dijit(Dojo Widget)을 쓰려면 결국 dojo가 필요하게 되는데, 말 그대로 배보다 배꼽이 더 큰 상황이 됩니다. 또한, 데스크탑 브라우져 호환성이 부족하므로 xui.js는 모바일 웹에만 적용하고, 데스크탑 웹을 위해 별도의 자바스크립트 라이브러리를 사용해야 하므로 2중의 학습/개발이 필요하므로 장점보다는 단점이 커 보입니다.

여러 측면을 고려할 때, 새로운 모바일 웹 UI 툴킷을 자체 개발하거나, 새로운 범용 자바스크립트 라이브러리를 자체 개발한다면 좋은 기반(혹은 참고)가 될 수 있겠지만, 기존의 범용 자바스크립트 라이브러리(jquery, prototype, dojo 등...)의 대체품으로는 부적합 -_-;

저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2011/03/29 23:18
크리에이티브 커먼즈 라이선스
Creative Commons License
지난 포스트에서는 CORS에 대해서 (아직 지원하지 않는 브라우져가 많다고 지레 짐작하고) 용어만 언급하고 넘어갔다.
최근에 올라온 "Methods of communication"이라는 글에 걸린 링크를 통해 지금 당장이라도 쓸 수 있음을 확인하고, 몇 자 적어보려고 한다.

Ajax에는 Same Origin Policy라는 원칙이 있다. 말 그대로, 현재 브라우져에 보여지고 있는 HTML을 내려준 웹서버(Origin)에게만 Ajax 요청을 보낼 수 있다.

MS가 XMLHttpRequest를 처음 만들 때만 해도 이런 제약은 당연한 것처럼 보였지만, 지금에 와서는 OpenAPI를 통한 매시업(Mashup)이 활성화되는 데 가장 큰 장애물이 되었다. 매시업이 아니더라도 여러 개의 도메인을 사용해야 하는 대규모 사이트를 개발할 때도 골치거리였다. Same Origin Policy를 우회하는 방법으로 JSONP, IFRAME IO, CrossDomain Proxy 등이 고안되었지만, 보안성이 취약하다거나, 동기 호출이 안되거나, 주고 받는 데이터 형식이 제한되거나, 직관적이지 못하거나(dirty hack), ... 등의 문제점 때문에 표준화되기엔 무리가 있었다.

(중략) 한 참 뒤에야 W3C는 (MS의 IE가 제공하는 방식을 수용하여) 크로스도메인간에도 Ajax요청을 주고 받을 수 있는 방법을 표준화 했는데, 그것이 바로 CORS다.

CORS를 한 마디로 요약하면, "요청을 받은 웹서버가 허락하면 크로스도메인이라도 Ajax로 통신할 수 있다"라는 정책이다. 기술적으로는 크로스도메인에 위치한 웹서버가 응답에 적절한 Access-Control-Allow-류의 헤더를 보냄으로써 크로스도메인 Ajax를 허용 수 있다.

말이 뺑뺑도는 느낌인데, 예를 들어 보자(코드를 줄이기 위해  jQuery를 사용했지만 XMLHttpRequest를 직접 사용해도 마찬가지다). Ajax 요청을 보내는 one.html을 내려 준 a.com이 오리진 웹서버다. 이 요청을 받는 b.com이 크로스도메인 웹서버다. a.com에서 b.com으로... 그래서 크로스-도메인이다.

대충 그려보면 이런 식인데, b.com은 크로스도메인이므로 Ajax 통신이 불가능하지만, CORS를 적용하면 가능하다:



http://a.com/one.html
...
$.get('http://b.com/another.php', function(data) {
  alert(data);
})

http://b.com/another.php
...
<?php header('Access-Control-Allow-Origin:*'); ?>
...


보다시피, Ajax 클라이언트 측에는 추가적으로 할 일이 없고, 서버 측에서 할 일도 많지 않다. 웹서버(b.com)이 응답에 Access-Control-Allow-Origin헤더를 통해 모든 Origin(*)에서 오는 요청을 허락했으므로 다른 도메인(요청을 보낸 one.html을 내려 준 a.com)과 Ajax로 통신을 할 수 있다. 플래시에 익숙한 개발자라면 crossdomain.xml 을 떠오를 것이다. 맞다. 사실상 똑같다.

CORS는 FF 3.5+, 사파리 4+, 크롬 등의 대부분의 현대적인 브라우져에서 지원한다. IE의 경우엔 IE8부터 지원하는데, XMLHttpRequest대신 XDomainRequest객체를 사용해야 한다. 즉, 거의 다 된다! IE6,7만 무시하면... oTL

CORS 표준에 따르면 Origin외에도 HTTP 인증 여부, HTTP 메소드(GET, POST, ...), 특정 헤더 존재 유무 등의 다양한 기준으로 접근을 허용(preflight request)할 수 있는데, IE8은 이 스펙을 지원하지 않는다. -_-; CORS가 IE의 비표준 확장에 근거해서 만들어졌다는 점을 생각해보면.. 개그도 이런 개그가... -_-; IE9은... 아직 확인해보지 못했다. 

클라이언트 대신 서버 측에서 뭔가를 해야 한다는 것은 장점인 동시에 단점인데, 기존의 수많은 OpenAPI들을 활용하고 싶어도 제공자들이 CORS를 적용하기 전까지는 무용지물... -_- OpenAPI를 제공하고 있거나, 제공할 계획이라면 JSONP 뿐 아니라 CORS도 고려해야 할 듯...

처음 언급된지 십년이 다 된 "Web as a Platform"이 실감나는 요즘이다. 팀 버너스 리가 원하던 원치않던... 웹은 점점 플랫폼으로 진화(혹은 변신)하고 있다. 별것 아닌 CORS도 이런 관점에서 보면 조금은 다르게 보일지도...


저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2011/03/24 14:30
크리에이티브 커먼즈 라이선스
Creative Commons License

앱스프레소 확장 API를 사용한 AJAX

/*
앱스프레소(Appspresso)는 이클립스 기반의 SDK 형태로 배포되어 사용하기 더 편리하다(?)는 것과 WAC(Wholesale Applications Community)Waikiki API를 제공한다는 점을 빼면  폰갭(PhoneGap)과 비슷한 하이브리드 웹앱 프레임웍/툴이다. 이 녀석을 만든 장본인이라 블로그질 하기가 좀 뭣하지만... 어차피 보는 사람도 별로 없는 블로그라 ㅋㅋ
*/

일반적인 웹 어플리케이션(혹은 웹 서비스)이 갖는 크로스 도메인 제약이 (폰갭과 달리) 앱스프레소로 만든 웹앱에도 동일하게 적용됩니다.

W3C에 준비중인 Cross-Origin Resource Sharing(CROS)이 표준화되어 모바일 webkit에 적용되면 좋겠지만, 현재로썬 크로스도메인 제한을 극복하려면 script 태그(JSONP)나 iframe 태그(Facebook의 XFBML, dojo의 iframe IO 등)를 이용해야 합니다.

앱스프레소에서는 개발의 편의를 위해 확장 API를 제공하는데, 네트웍 관련 API들은 ax.ext.net에 모여있습니다.

이 글에서는 예제를 통해 크로스도메인 AJAX 요청을 지원하는 앱스프레소 확장 API들에 대해 알아보겠습니다.
 

중요: 첨부된 예제의 src/apis 폴더 아래에 여러개의 js 파일들이 들어있는데, 이는 기존에 배포된 Appspresso SDK의 버그로 인해 사용할 수 없었던 확장 API를 사용할 수 있도록 임시로 제공되는 것이며, 이후에 배포될 Appspresso SDK에서는 이 js 파일들이 없어도 확장 API를 사용할 수 있습니다.



예제 웹앱 프로젝트


AxExtNet.zip 파일을 Appspresso SDK의 Workspace 디렉토리에 압축을 풀고, File/Import/Existing Projects into Workspace로 이클립스 프로젝트로 추가하세요.

src/index.html에 이 글에서 설명할 ax.ext.net.get/post/curl API를 사용한 예제 코드가 모두 들어있습니다.

GET 요청 보내기 - ax.ext.net.get

function successCallback(result) {
if(result.status >= 200 && result.status < 300) {
var data = JSON.parse(result.data);
var etag = response.headers['ETag'];
// ...
}
}

function errorCallback(error) {
alert(error);
}

ax.ext.net.get('http://.../api/item.json?id=123',
successCallback, errorCallback);


첫번째 인자로 지정한 URL로 GET 요청을 보냅니다.
요청이 성공하면(서버의 응답 코드와 무관하게, 요청이 서버로 보냈고 응답을 받았으면) success 콜백함수가 호출되고, 실패하면 error 콜백함수(생략가능)가 호출됩니다. success 콜백 함수로 전달되는 인자의 data, status, headers 등의 속성을 이용해서 응답의 세부 결과를 확인할 수 있습니다.

참고:jQuery.get

POST 요청 보내기 - ax.ext.net.post

var params = { 'firstname': 'foo', 'lastname': 'bar', … };
ax.ext.net.post('http://.../api/update.json', params,
successCallback, errorCallback);


ax.ext.net.get과 동일하지만, 두번째 인자로 전달한 key-value 쌍들을 포함하는 POST 요청을 보냅니다.

더 복잡한 HTTP 요청 보내기 - ax.ext.net.curl

var settings = {
'method': 'DELETE', // 'GET', 'POST', 'PUT', …
'url': 'http://.../...',
'headers': { 'X-Custom-Header': 'custom header value', .. },
'params': { 'param1': 'value1', 'param2': 'value2', .. },
'files': { 'fileparam1': 'filepath1', 'fileparam2': 'filepath2', .. },
'success': successCallback,
'error': errorCallback,
'sent': sentCallback,
'received': receivedCallback,
...
};
ax.ext.net.curl(settings);


GET, POST 외에 PUT, DELETE 등의 요청 메소드, 커스텀 요청 헤더, 파일 등을 포함한 더 다양한 형태의 요청을 보냅니다. method와 url을 제외한 모든 속성은 생략할 수 있습니다.

참고: jQuery.ajax

ax.ext.net에는 이 글에서 설명한 것 외에도 업로드/다운로드(진행 상황을 확인까지), 메일 보내기 등의 기능을 제공합니다. 이 확장 API들을 활용하기 위해서는deviceapis.filesystem를 함께 사용해야 하는데, 다음 기회에 별도의 예제와 함께 설명하겠습니다.

오늘은 여기까지~ 휘릭=3=3=33
저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2011/03/14 18:06
크리에이티브 커먼즈 라이선스
Creative Commons License

/*
막간을 이용해서 CSS 삽질~~ just for fun~~
나름 삽질한다고 했는데... 해서 만들었는데... 아무도 안쳐다보는 것 같아서... ㅠㅠ
결과 동영상을 짤방으로~~(
웅장한 사운드 주의!!!!)
*/

 

웹킷 CSS 애니메이션으로 스타워즈 오프닝 크롤 구현하기


CSS3에는 자바스크립트의 도움없이 애니메이션 효과를 구현할 수 있는 방법이 추가되었다. 대표적인 것인 transition과 animation이다. transition은 간단한 전환 효과를 구현할 때 주로 사용되고, animation은 플래시와 유사한 키프레임 기반 애니메이션을 만들 때 사용된다.

21세기, 머나 먼 은하계 저 멀리... IE6가 세계에서 두번째로 많은 대한민국의에서 HTML5와 CSS3의 멋진 기능들이 그림의 떡일 뿐이라고 생각하던 시절이 있었지만...

우리에겐 모바일 웹이 있다! 스마트폰, 태블릿등의 모바일 단말의 브라우져는 거의 대부분이 웹킷 기반이다. 그리고 그 숫자는 기존의 PC 숫자보다 훠~ㄹ씬 많다. 적어도 모바일 웹에서만큼은 마음놓고 HTML5와 CSS3를 써도 된다!!고 말하고 싶지만... -_- 구글의 크롬은 아직 3차원 변형을 지원하지 않는다. OTL

각설하고, 이 글에서는 웹킷의 CSS 애니메이션, 정확히는 -webkit-animation과 -webkit-keyframes, -webkit-transform, -webkit-perspective 등을 활용해서 스타워즈의 오프닝 크롤을 구현해 보려고 한다.

백문이 불여일견! 소스부터 보자!
먼저, 롱~ 타임 어고 파 파~ㄹ어웨이 어쩌고 하는 부분이다.
#galaxy {
 display:block;
 position:absolute;
 left:0;
 top:50%;
 width:100%;
 height:3em;
 color:#06f;
 font-size:1.5em;
 margin-top:-1.5em;
 text-align:center;;
 vertical-align:middle;
 opacity:0;
 -webkit-animation-name:starwars_galaxy;
 -webkit-animation-duration:3s;
 -webkit-animation-timing-function:linear;
}

@-webkit-keyframes starwars_galaxy {
 from {
   opacity:1;
 }
 50% {
   opacity:1;
 }
 to {
   opacity:0;
 }
}


-webkit-animation-name:<애니메이션_식별자> 은, 노드가 표시될때 지정한 애니메이션을 수행하라는 의미다. 구체적인 애니메이션 내용은 @-webkit-keyframes <애니메이션_식별자> { … } 형식으로 정의한다. 애니메이션에서 핵심이 되는 프레임은 from(혹은 0%)에서 to (혹은 100%)까지 순차적으로 애니메이션을 수행되며, 중간 과정은 (플래시의 in-between과 비슷한 원리로) 자동으로 만들어진다.  -webkit-animation-duration:<재생시간> 은 지정한 애니메이션 전체를 재생하는 시간이다. -webkit-animation-timing-function:<타이밍함수> 은 시간이 점점 빠르게 혹은 느리게 가는 등의 효과를 지정한다. -webkit-animation-delay:<지연시간> 은 애니메이션이 시작되기 전까지의 지연 시간을 지정한다.
위의 예는, 시작하면(from) 화면에 #galaxy 레이어의 표시(opacity:1)하고, 1.5초(50%)이후 부터 투명도를 조절하기 시작해서(opacity:1) 마지막(to)에는 화면에서 사라지는(opacity:0) 애니메이션이다.

다음으로, STAR WARS라는 아웃라인 로고가 익스트림 클로즈업에서 빠르게 멀어지는 장면이다.
#title {
 position:absolute;
 display:block;
 left:-400%;
 top:30%;
 width:900%;
 height:100%;
 color:transparent;
 font-size:10em;
 -webkit-text-stroke-width:0.05em;
 -webkit-text-stroke-color:#ff3;/*XXX: this will not animated! :'( */
 text-align:center;
 white-space:nowrap;
 overflow:hidden;
 opacity:0;
 -webkit-animation-name:starwars_title;
 -webkit-animation-duration:7s;
 -webkit-animation-timing-function:ease-in-out;
 -webkit-animation-delay:3s;
}

@-webkit-keyframes starwars_title {
 from {
   font-size:1000em;
   opacity:1;
 }
 90% {
   font-size:0;
   opacity:1;
 }
 to {
   font-size:0;
   opacity:0;
 }
}

#title > p {
 font-family:'Orbitron',sans-serif;
 font-weight:900;
}

좀 더 복잡해보이지만 기본적으로는 동일하다. 타이밍 함수를 easy-in-out으로 지정해서 애니메이션의 시작과 끝은 빠르고 중간은 천친히 진행되도록 지정한 것, -webkit-text-storke 으로 텍스트의 윤곽선을 표시하는 것, 웹 폰트를 활용하는 것 정도가 특이한 부분이다.

마지막으로, 프롤로그가 스크롤되어 올라가는 부분이다.
#crawl {
 position:absolute;
 left:20%;
 top:40%;
 width:60%;
 height:60%;
 white-space:pre;
 -webkit-perspective:5em;
 -webkit-perspective-origin:50% 0%;
}

#crawl > div {
 position:absolute;
 top:0;
 left:0;
 width:100%;
 height:100%;
 overflow:hidden;
 -webkit-transform:rotateX(45deg);
}

#crawl > div > div {
 position:absolute;
 top:0;
 width:100%;
 margin:0;
 padding:0;
 color:#fc0;
 font-size:1.2em;
 font-style:italic;
 text-align:center;/*XXX: text-align:justify;text-justify:inter-word;*/
 letter-spacing:0.2em;
 opacity:0;
 -webkit-animation-name:starwars_crawl;
 -webkit-animation-duration:40s;
 -webkit-animation-timing-function:linear;
 -webkit-animation-delay:10s;
}

@-webkit-keyframes starwars_crawl {
 from {
   top:50%;
   opacity:1;
 }
 to {
   opacity:1;
   top:-100%;
 }
}


-webkit-perspective:<투영된_상단_너비> 는 2차원 평면을 원근법에 따른 3차원으로 투영할 때 상단의 너비를 지정한다. 하단의 너비는 이에 맞게 늘어나거나 줄어든다. -webkit-perspective-origin:<소실점_가로_위치> <소실점_세로_위치> 은 3차원 투영의 기준이 기준이 되는 위치(소실점)를 2차원 평면을 기준으로 지정한다. perspective는 머리 속으로 상상하기가 쉽지 않으므로 임시로 background/border 등을 설정해서 투영 전과 투영 후에 영역을 확인하는 것이 편하다.
위의 예는, 가로 60% 세로 60% 너비의 2차원 평면을 상단 가운데(50% 0%)가 다섯글자 너비(5em)인 3차원 평면(하단은 이에 맞춰 늘어나므로 밑변이 넓은 사다리꼴이 만들어진다)을  만든다. 애니메이션 자체는 단순하다. 10초동안 기다렸다가 40초에 걸쳐서 상단 좌표(top)을 50%(화면 아래에서) 위치에서 -100% 위치(화면 위로 텍스트들이 다 사라질 때까지)로 바꾸는 애니메이션이다. 이 과정이 3차원으로 변형된 평면 위에서 애니메이션되면 꽤 그럴 듯하게 보인다.

백견이 불여일RUN! 결과를 “눈"과 “귀”로 확인하자! 안타깝지만, 데스크탑용 사파리에서만 제대로 확인할 수 있다. 꽤 웅장한 사운드가 나오니 조용한 곳에선 주의 요망!!
http://jsbin.com/opoho4


아이폰이나 아이패드에서도 되어야겠지만, 마지막 자막이 올라가는 부분이 의도한대로 동작하지 않았는데, 화면을 톡톡 탭하면 정상적으로 자막이 올라가는 걸로 봐선 버그인 듯... 이 부분에 대해 명쾌한 해결책을 알려주시는 분에게 보라매 공원 반경 1km이내에서 별다방급 커피 1회 빌붙기 허용권을 증정하겠다. -_-;

사파리 깔기 싫다는 분들을 위해서 유투브 동영상도 준비했다 -.-v 역시나, 꽤 웅장한 사운드가 나오니 조용한 곳에선 주의 요망!!
http://www.youtube.com/watch?v=ml9pNaORYME


이 글에서는 웹킷이 제공하는 CSS 애니메이션을 이용해서 스타워즈의 오프닝 크롤을 구현해보았다. 이미지와 자바스크립트를 조금 쓰면 훨씬 더 그럴듯한 결과를 만들 수도 있겠지만, 웹앱과 CSS의 가능성을 보여준다는 의미에서 의도적으로 사용하지 않았다.

“하이브리드 모바일 웹앱”이라는 생소한 용어를 떠들고 다니다 보니, “네이티브로 하면 훨씬 더 쉽게 빠르게 만들 수 있는데 왜 웹으로 할려구 그러지?” 라는 얘기를 많이 듣는다. 반은 맞고 반은 틀린 얘기다. 웹으로 모든 걸 다할 순 없다. 그러나 우리가 일상적으로 접하는 앱의 90%는 웹으로도 충분히 만들 수 있다. 그리고 대부분의 경우에는 더 쉽다. 설령 조금 더 어렵다고 하더라도 그렇게 만들어두면 (아직은 좀 먼 얘기지만) 웹브라우져만 있는 환경이라면 어디에서라도 접근할 수 있다.

참고자료:
http://developer.apple.com/library/safari/#documentation/appleapplications/reference/SafariCSSRef/Articles/StandardCSSProperties.html
http://www.gesteves.com/experiments/starwars.html
http://www.youtube.com/watch?v=P9kMh04GooE
저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2011/03/13 17:05
크리에이티브 커먼즈 라이선스
Creative Commons License

웹에서 아이폰스러운 Carousel 구현하기


페이지 컨트롤(UIPageControl; Carousel; 일명 회전목마 컨트롤)은 아이폰이나 안드로이드폰을 쓰면 가장 먼저 접하게되는 UI 컨트롤이다. 일명 홈 스크린이라고 불리는 화면에서 가로 또는 세로로 플리킹(flicking)하면 이전/다음 페이지로 이동하는 그 컨트롤이다. 아이폰의 경우에는 화면 하단에 하얗고 까만 작은 동그라미가 있고, 안드로이드는 화면 상단 좌우에(폰에 따라 조금씩다르다) 작은 동그라미가 있어서, 총 몇 페이지 중에서 몇 번째 페이지를 보고 있는 지를 알려준다.

이 글에서 설명하는 방법을 안드로이드용 푸딩얼굴인식 앱을 만들면서 활용했는데, 데모 동영상에서 35초와 1분 10초 근처에 나오는 화면이 이 컨트롤을 활용한 것이다.

백문이불여일견! 코드를 살펴보자!
$(document).ready(function() {
var iscroll = new iScroll('wrapper', {
snap: 'li',
momentum: false,
hScrollbar: false,
vScrollbar: false,
onScrollEnd: function() {
$('#indicator li').each(function(i, node) {
if(i === iscroll.currPageX) {
$(node).addClass('active');
} else {
$(node).removeClass('active');
}
});
}
});
iscroll.scrollToPage(0);
});

#wrapper {
width:200px;/*=page_width*/
height:200px;/*=page_height*/
margin:0;
padding:0;
overflow:none;
background-color:#fff;
}

#scroller {
position:relative;
top:0;
left:0;
width:600px;/*=number_of_page*page_width*/
height:200px;
float:left;
}

#scroller ul {
list-style:none;
position:relative;
display:block;
margin:0;
padding:0;
top:0;
left:0;
width:100%;
height:100%;
}

#scroller li {
display:block;
float:left;
width:200px;
height:200px;
}
/* 나는 깜찍한 CSS로 아이폰스러운 페이지 인디케이터를 구현하였으나 공간이 부족하여 생략한다 -_-; */

 <div id="wrapper">
   <div id="scroller">
     <ul>
       <li><div>1st page!</div></li>
       <li><div>2nd page!</div></li>
       <li><div>3rd page!</div></li>
     </ul>
   </div>
 </div>
 <div id="indicator">
   <ul>
     <li><span>1</span></li>
     <li><span>2</span></li>
     <li><span>3</span></li>
   </ul>
 </div>


백문이불여일RUN! 결과를 확인하자!(위에서 생략했던 깜찍한 CSS도 포함되어 있음)
http://jsbin.com/epeci5


이 글에서는 iScroll 라이브러리를 활용하여 페이지 컨트롤을 구현하고, 덤으로 아이폰과 유사한 인디케이터 까지 구현해 보았다.

모바일 단말은 화면이 작기 때문에 이런 유형의 컨트롤(탭/Carousel/...)들이 꽤 다양하고, 또 유용하지만, 직접 만들자면 쉽지 않다. 그렇다고 이 컨트롤 하나 때문에 Sencha나 jQueryMobile 같은 덩치 큰 프레임웍을 사용하는 것이 부담스럽다면, iScroll 라이브러리는 한 번 쯤 살펴볼 가치가 있다.

참고자료:
http://cubiq.org/iscroll-4
https://github.com/blackdynamo/jQuery-Mobile-Carousel
http://dev.sencha.com/deploy/touch/docs/?class=Ext.Carousel
http://www.winktoolkit.org/documentation/module/592/
http://developer.apple.com/library/ios/#documentation/uikit/reference/UIPageControl_Class/Reference/Reference.html
저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2011/03/13 15:19
크리에이티브 커먼즈 라이선스
Creative Commons License

터치기반 모바일 웹킷에서 버튼 반응 속도 개선하기


아이폰/아이패드/아이팟의 모바일 사파리와 안드로이드의 모바일 크롬 등은 모두 터치기반 모바일 웹킷을 사용하는 브라우져들이다. 이 브라우져들은 버튼 등을 눌렀다(touchstart) 떼도(touchup) 즉시 반응(click)하지 않는데, 그 이유는 연속되는 터치 동작(touchstart-touchmove-touchend)들이 제스쳐(swipe, long click, …)인지 여부를 확인하기 위해 최대 300ms의 지연시간이 생기기 때문이다. 모바일 웹 사이트를 만드는 경우라면 이 정도의 지연시간은 크게 문제가 되지않지만, 상대적으로 신속한 반응을 요구하는 “웹앱"이라면 얘기가 달라진다.

해결책은 간단하다:
1. 손가락으로 무언가를 누르면(touchstart)
2. 웹킷의 기본 동작(300ms 지연)을 못하게 막고(preventDefault)
3. 움직임(touchmove) 없이
4. 손가락을 떼면(touchend)
5. 클릭(click)으로 간주한다.

touchstart/touchend을 mousedown/mouseup으로 바꿔놓고 보면 HTML5 이전에 drag & drop을 처리하기 위해서 사용하는 방식과 유사하다.

百聞不如一見! 코드를 살펴보자:
function NoClickDelay(el) {
this.element = el;
if( window.Touch ) this.element.addEventListener('touchstart', this, false);
}

NoClickDelay.prototype = {
handleEvent: function(e) {
switch(e.type) {
case 'touchstart': this.onTouchStart(e); break;
case 'touchmove': this.onTouchMove(e); break;
case 'touchend': this.onTouchEnd(e); break;
}
},

onTouchStart: function(e) {
e.preventDefault();
this.moved = false;

this.element.addEventListener('touchmove', this, false);
this.element.addEventListener('touchend', this, false);
},

onTouchMove: function(e) {
this.moved = true;
},

onTouchEnd: function(e) {
this.element.removeEventListener('touchmove', this, false);
this.element.removeEventListener('touchend', this, false);

if( !this.moved ) {
var theTarget = document.elementFromPoint(e.changedTouches[0].clientX, e.changedTouches[0].clientY);
if(theTarget.nodeType == 3) theTarget = theTarget.parentNode;

var theEvent = document.createEvent('MouseEvents');
theEvent.initEvent('click', true, true);
theTarget.dispatchEvent(theEvent);
}
}
};


百見不如一RUN! 코드를 돌려보자:
http://jsbin.com/exadi5


다시 말하지만, 위의 페이지는 터치기반의 모바일 웹킷, 즉 모바일 사파리나 모바일 크롬으로 봐야 효과가 있다.

일단 눈에 보이는 Slow Button과 Fast Button 각각을 평소대로 눌러보자. 클릭을 감지하는데 걸린 시간이 표시되는데, Fast 쪽이 조금 빠르긴 하지만 큰 차이는 없어 보인다.
이번에는 평소보다 좀 더 손끝에 감각을 모아서 “톡톡 두드린다는 느낌”으로 각 버튼을 눌러보자. Slow Button의 경우엔 아예 반응을 하지 않거나 확대(아이폰등에서는 더블탭이 자동 확대/축소)기능이 동작된다. Fast Button은 그런 동작을 하지 않는다.

이 글에서는 touchstart-touchmove-touchend 이벤트를 활용하여 버튼의 반응속도를 개선하는 방법을 알아보았다. 이 세가지 이벤트의 활용법을 잘 익혀두면 다양한 유형의 터치 입력을 처리하는데 많은 도움이 될 것이다.

참고 자료:
http://cubiq.org/remove-onclick-delay-on-webkit-for-iphone
http://code.google.com/mobile/articles/fast_buttons.html
저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2010/11/18 14:50
크리에이티브 커먼즈 라이선스
Creative Commons License
얼마전에 쓴 "HTML5/CSS3/JavaScript로 아이폰 앱 만들기"에서 설명(응? 언제 설명했는데?) 반복적인 초기 작업을 더 쉽게 할 수 있도록 Xcode 프로젝트 템플릿을 만들어 보았다.

Dropbox에 올려둔 hellowebapp-ios-xcode_project_templates.tar.gz 를 받아서,
"~/Library/Application Support/Developer/Shared/Xcode/Project Templates"에 풀고,
Xcode에서 File 메뉴의 New Project를 선택하거나,
Xcode를 실행하고 "Create a new Xcode project"를 선택)하면,
프로젝트 템플릿을 선택하는 대화상자가 나오는데,
"User Templates" 아래에 "WebApp" 카테고리 안에 "HelloWebApp"을 선택하면,
지정한 이름으로 깔끔한 "웹 앱" 프로젝트가 만들어 진다.
(입맛대로 Device나 Simulator로 타겟을 바꾸고)
이제 그냥 "Build & Run" 하시면 되시겠다~


참고로, 지난 번 스크린캐스트 이후에, 웹 리소스(html, css, js, png...)들을 다른 소스와 분리해서 "www" 디렉토리 안에 몰아 넣도록 약간 수정된 버전이다.

안드로이드용 템플릿은 어떻게 만들까 고민 중... -_-; 이거 하자고 이클립스 플러그인을 만들 수도 없고...

저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2010/11/16 12:55
크리에이티브 커먼즈 라이선스
Creative Commons License
사무실에 앉아서 이짓꺼리(?) 하고 있다.

이런 쓰잘데기 없는 동영상을 굳이 만들어 올리는 이유는 "웹 앱"(WebApp; HTML5App)이 그렇게 거창한 것도 아니고, 어려운 것도 아니고, 멀리 있는 남의 나라 이야기도 아니라는 것을 보여주기 위해서다.
PhoneGap, Titanium, QuickConnect 같은 거창한(?) 제품을 동원하지 않더라도 JQueryMobile, Jo, Wink, Sencha Touch 같은 UI 툴킷과 HTML5 canvas 태그 그리고 HTML5 JS API들(WebStorage, WebSQLDatabase, WebWorker, ...), 그리고 W3C의 DAP(Geolocation, ...)를 사용하면 웬만한 앱은 만들 수 있다.

(저번에 XCode로 했던 짓이랑 비슷해서 이번에는 시간이 많이 안걸렸다능 -.-V)



동영상 간의 의존성을 제거(?!)하기 위해 html과 js를 직접 입력했지만, 저번에 아이폰 앱 만들때 썼던 파일을 그대로 써도 된다. 당연한 얘기~

마찬가지로, 예제 소스는 github에 올려두었다.

담(이건 정말 술 이름인데...)에는 좀 더 그럴싸한 앱을 만들어보자. 뭘 만들까? 흠...

저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2010/11/14 21:18
크리에이티브 커먼즈 라이선스
Creative Commons License
풍경 1. 아이폰이 국내에 출시된지 1년도 안됐는데... 아... 아이폰 없던 시절이 어땠는지 기억조차 가물가물... 먹고 살려니 아이폰 개발 공부는 해야겠는데, 망할 놈의 옵씨... 옵씨는 그렇다 치고, 코어 파운데이션, 코어 그래픽스, 코어 애니메이션, 뭔 코어가 이렇게 많냐? 핵분열도 아니고... OTL

풍경 2. 없는 살림에 거금 10만원 들여 아이폰 앱 개발자 등록해서 1년 동안 앱 3개 겨우 올렸는데... 안드로이드가 대세? 열라 안드로이드 공부해서 앱 좀 올려 볼려니... 안드로이드 마켓은 뭐고 티스토어는 뭐고 올레마켓은 또 뭐냐? 그까이꺼 대충~ 눈감고 넘어가려니... 블랙베리? 심비안? 팜프리? 윈폰7? 바다? OTL

풍경 3. 아래아한글 새 버전 나온 줄 알았던 넷스케이프와의 첫만남, 문자열과 한판 승부를 벌였던 CGI 시대, ASP, PHP, JSP... OOO 서버 페이지 시대, 유행따라 삼만리 AJAX 시대... 어느새 HTML만으로 어플리케이션을 만드는 시대??? 먹고살려니 안할 순 없고... OTL

풍경 4. 스마트폰(그게 뭔데? 먹는거냐?)용 앱을 만들긴 만들어야 겠는데.. 새로운 언어 배우기도 귀찮고, API는 낯설고, 당장 할 줄 아는 건 웹... 그래서 웹 기술만으로 앱을 만들 수 없을까... phonegap은 또 뭐고 titanium은 또 뭐고, WAC은 또 뭐냐? OTL

그래서 준비했습니다.

(재생 시간은 3분 남짓이지만 제작하는데는 30분 넘게 걸렸다능...ㅠㅠ)



동영상은 helloworld 수준이지만, 요기까지하고 나면 나머지는 하기 나름...
예제 소스는 github에 올려두었다.

조만간(그건 또 어디서 나온 술 이름이냐?) HTML5/CSS/JavaScript로 안드로이드 앱 만들기도....


저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2010/10/08 12:57
크리에이티브 커먼즈 라이선스
Creative Commons License

업무상 필요해서 작성한 글이지만,  혹시 도움이 될까 해서 올려봅니다. 블로깅 안한지 너무 오래되서 ㅎㅎ


홈페이지: http://joapp.com/

개발자: Dave Balmer(Palm WebOS 개발자, 전 야후 개발자)

요약: all-in-one 스타일의 경량 자바스크립트 라이브러리.


특징

  • UI 툴킷
    • CSS 기반 테마/SKIN 지원
  • 오픈소스
    • OpenBSD 라이센스
  • 크로스 플랫폼
    • Palm WebOS, Safari(iOS,Desktop,Dashboard), Chrome(Android,Desktop) 등 webkit 기반 브라우져만 지원.
  • 경량
    • 자바스크립트 41K(최소화된 버전) + UI CSS/리소스(176K)
  • PhoneGap 호환(?)
    • PhoneGap과 호환되지 않는 자바스크립트 라이브러리는 ”없음”.



주요 기능


UI


최근 모바일 단말 UI의 de-facto인 iOS의 UI을 염두에 둔 UI 툴킷.
하나의 화면(joScreen)은 상단의 헤더(joTitle, joToolbar)와 푸터(joFooter, joToolbar)로 구성.
화면과 화면 사이를 앞뒤(위아래)로 이동하는 네비게이션 레이아웃(joStackController, joStack).
기본적인 HTML 폼의 입력 필드에 대응하는 위젯들(joControl, ...), 페이지 내부 팝업(joPopup) 등의 필수적인 위젯 제공.
CSS를 통한 테마/스킨 지원.
캘린더, 챠트 등의 고급 위젯 부족.
  • joContainer
    • joCard
    • joFlexcol
    • joFlexrow
    • joFooter
    • joGroup
    • joPopup
    • joScreen
    • joScroller
    • joStack
    • joStackScroller
    • joTitle
    • joToolbar
  • joControl
    • joButton
    • joCheckBox
    • joExpando
    • joHTML
    • joInput
      • joDateTime
      • joPasswordInput
      • joTextarea
    • joLabel
    • joList
      • joMenu
      • joTabBar
      • joTable
    • joKnob
    • joSlider
  • joDivider
  • joShim

Data


HTML5의 WebSQLDatabase(Webkit 기반 브라우져에는 대부분 제공됨)를 통한 로컬(클라이언트측) 데이터베이스 접근 제공.
추후에 PhoneGap과 연계하여 로컬 파일을 통한 데이터 접근을 제공할 계획으로 보임(joFile, joFileDataSource)
원격(서버측) 데이터 접근 부재.
  • joDatabase
  • joDataSource
    • joFileDataSource (x)
    • joSQLiteDataSource
  • joFile (x)


Utility


기본적인(필수적인) 유틸리티 API 제공.
추후에 PhoneGap과 연계하여 모바일에 특화된 기능을 제공할 계획으로 보임.
  • jo, joCache, joScript
  • joEvent, joSubject, joGesture
  • joChain, joYield, joWait
  • joDOM, joJSON, joLocal, joString, joTime
  • joLog
  • joClipboard, joDevice, joFocus, joPreference, joUser


유사 제품과 비교


Jo Sencha Touch jQuery DojoToolkit
지원브라우져 Webkit All All All
IE ✭✭✭ ✭✭✭ ✭✭✭
FF ✭✭✭✭✭ ✭✭✭✭✭ ✭✭✭✭✭
Webkit(Safari,Chrome) ✭✭✭✭✭ ✭✭✭✭✭ ✭✭✭✭✭ ✭✭✭✭✭
모바일 최적화 ✭✭✭✭✭ ✭✭✭
데스크탑 지원 ✭✭✭✭✭ ✭✭✭✭✭ ✭✭✭✭✭
용량 ✭✭✭ ✭✭✭✭✭
UI 위젯 툴킷 ✭✭✭ ✭✭✭✭✭
EXT2 

jQuery UI 필요. jQueryMobile은 10월 중 알파 릴리즈 예정.
✭✭
dojox.mobile은 아직 unstable
UI 위젯 성능 ✭✭✭✭ ✭✭✭
i18n/l10n/a11y ✭✭✭ ✭✭✭✭✭
OOP ✭✭ ✭✭✭
DOM/CSS ✭✭ ✭✭ ✭✭✭✭✭ ✭✭✭
Database ✭✭ ✭✭✭✭ ✭✭✭ ✭✭✭✭✭
유틸리티 ✭✭✭ ✭✭✭✭✭ ✭✭✭
확장성 ✭✭✭✭✭ ✭✭✭
문서/예제 ✭✭✭ ✭✭✭✭✭ ✭✭✭
개발자 생태계 ✭✭✭ ✭✭✭✭✭ ✭✭✭



결론


비교적 적은 용량에 (모바일) 웹 앱 개발에 필요한 기본적인(필수적인) 기능을 거의 다 포함한 all-in-one 성격의 UI 라이브러리.

단순한 API 구조 덕분에 학습 / 사용이 용이하지만, 고급 기능들이 거의 없어서 jQuery등의 다른 라이브러리들과 혼용해야 함.

(이름과 달리) HTML5나 모바일에 최적화가 부족하고, 프레임워크가 아닌 단순 UI 툴킷 + 유틸리티 라이브러리.

1명의 개발자가 단독으로 개발했고, 비교적 최근(2010.6)에 시작해서 개정 릴리즈가 많지 않았기 때문에 소스 코드의 품질이 매우 높음.

HP가 Palm을 인수한 이후, WebOS의 Mojo를 개선(혹은 대체)하기 위한 여러가지 시도를 하는 것으로 보임.

직접적인 경쟁 상대인 Sencha가 상용/오픈소스로 모호한 라이센스 정책을 갖는데 반해, Jo는 OpenBSD 라이센스(BSD 라이센스와 어떤 차이가 있는지는 추가적인 확인이 필요)에 따름.

이후,  HP/Palm의 지원과 커뮤니티의 반응에 따라 주요 플레이어로 성장할 가능성은 있으나, 10월 중에 첫 릴리즈가 나올 예정인 jQueryMobile의 완성도에 따라서는 수많은 마이너 플레이어 중의 하나로 전락할 가능성이 더 높음.

저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2009/12/10 17:15
크리에이티브 커먼즈 라이선스
Creative Commons License
원래 발표 자료는 총 15장이 었는데, 예제 코드와 설명이 필요한 것은 이번으로 마무리 하려고 한다.

implicit type conversion

자바스크립트는 약한 타입(weak typing) 이므로, 묵시적인 형변환(implicit type conversion)이 빈번하게 이루어진다. 이로 인한 부작용을 간과하면 찾기 어려운 버그를 만들 수 있다.

간단한 예를 통해 알아보자:
function test(foo) {
  alert(typeof(foo));
  alert(foo);
  if (foo) { alert('foo'); }
  if (foo == null) { alert('foo == null'); }
  if (foo === null) { alert('foo === null'); }
}

이 함수를 여러가지 파라메터를 주면서 호출해보자.
test();
test(null);
test('hello');
test('');
test(true);
test(false);
test(1);
test(1/0);
test(0/0);

특이한 것 몇가지만 얘기하면:
  • underfined는 == null 이지만 === null 은 아니다.
  • ''는 false다! (C에서는 !=0 이면 모두 true라는 사실을 기억하라)
  • 1/0(불능)은 true지만, 0/0(부정)은 false다!

묵시적 형변환과 관련된 또 다른 예를 살펴보자:
function test(foo) {
  alert(typeof(foo));
  alert(foo);
  if (foo) { alert('foo'); }
  if (!foo) { alert('!foo'); }
  if (!!foo) { alert('!!foo'); }
}

파라메터가 명확한 불린 값이라면(true/false) 아무런 문제가 없지만, 그렇지 못하면 예상치 못한 상황에 직면하게 된다:
test(true);
test(false);
test('true');
test('false');

특이한 것은:
  • !!'false'는 false가 아니라 true다.

weak typing은 아주 편리한 언어적 특성이지만, 잘못쓰면 - 특히 strong typing(C, 자바 등의 대부분의 주류 언어)에 익숙한 개발자들에게 - 치명적인 독이 될 수 있다. underfined, null, NaN 그리고 ""(빈문자열) 간의 차이는 상당히 오묘하므로, 가장 확실한 방법은 확신이 없다면 명시적인 형변환을 수행하는 것이다.

nested block scope

function test() {
  var foo = -1;
  for (var foo = 0; foo < 10; foo++) { … }
  alert(foo);
}

위의 코드에서 두번째 var 선언문은 아무 효과가 없다. 따라서, -1이 아니라 10이 출력된다. 별것 아닌것 처럼 보이지만, 문제가 되면 굉장히 찾기 어려운 버그다. jslint를 사용하면 경고를 해주는 데, 가장 확실한 방법은 모든 변수 선언을 함수 앞에 모아두는 것이다(예전 C 스타일).
 
function overloading

function test(foo) {
  alert('one arg');
}
function test(foo, bar) {
  alert('two args');
}
function test() {
  for (var i = 0; i < arguments.length; i++) {
    alert(arguments[i]);
  }
}

위의 코드에서 앞에 두개의 함수 정의는 무시되고, 마지막의 세번째 함수 정의만 유효하다. 자바스크립트에서는 arguments를 사용하여 가변 파라메터를 처리할 수 있다. 그러나, 더 좋은 방법은 이름있는 파라메터를 사용하는 것이다. 즉, 객체 하나에 파라메터의 이름과 값을 함께 전달 하는 것인데, 요즘 많이 쓰이는 대부분의 자바스크립트 라이브러리들이 모두 이 방식을 선호한다.

"string" is not array-of-chars

var str = "hello";
alert(str.charAt(2));
alert(str[2]);

위의 코드에서 앞의 alert은 출력되지만, 뒤의 alert은 에러다. 잘된다고? IE에서는 해보시길...
자바 개발자들에겐 익숙할텐데, C/C++ 개발자들은 좀 귀찮을 듯... ^^;

비슷한 예로, NodeList(예: document.getElementsByName() 등의 리턴 형식)도 배열이 아니다.

missing "radix" for  parseInt()

parseInt('1234');
parseInt('01234');
parseInt('0x1234');
parseInt('1234', 10); 
parseInt('1234', 8);
parseInt('1234', 16);

뭐가 이상하냐고? 자바에서 똑같은 짓을 해보자. -.-;;;; 자바에선 Integer.parseInt()에 radix를 지정하지 않으면 10을 지정한 것으로 처리하지만, 자바스크립트에선 알아서 하라는 뜻으로 해석한다.

var sum = parseInt(num1.value) + parseInt(num2.value);
alert(sum);

위의 코드는 의도했던 안했던, 8진수와 16진수 계산기 기능도 갖고 있다. ^^; 이런 사소한 문제가 찾아내기 힘든 버그를 만든다. jslint를 사용하면 경고를 해주는데, 가장 확실한 방법은 parseInt()를 호출할 때 무조건 두번째 파라메터(radix)를 지정하는 것이다. 

이것으로 JavaScript Common Mistakes 시리즈도 끝~
그 시작은 창대하였으나 끝은 미미하리라...=3=3=333

아.. 쪽팔려...

저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2009/12/09 19:55
크리에이티브 커먼즈 라이선스
Creative Commons License
자바스크립트로 심각한 코딩을 하기 시작하던 초기에 했던 삽질이다. 그 전까진 아예 "this"라는 키워드를 쓸 일 자체가 없었다.

가장 간단한 예제를 보자:
function test(name, button) {
this.name = name;
button.onclick = function(event) {
alert('hello, ' + this.name);
};
}
문제는, 이 코드에서 아래에 있는(4줄) "this"가 위에 있는(줄2) 그 "this"가 아니라는 건데...

그럼 어떻게 해야하나? 여러가지 방법이 있겠지만, 가장 일반 적인 방법은 이렇게 하는 거다:
function test(name, button) {
this.name = name;
var self = this;
button.onclick = function(event) {
alert('hello, ' + self.name);
};
}
변수 이름은 self가 아니어도 상관없지만, 일반적으로 self, me, this_, _this 등을 많이 쓴다.

이론에 근거한 체계적인 설명은 크록포드옹께서 쓰신 JavaScript: The Good Parts 를 정독하시고...

이것만 기억하자:
자바스크립트의 this는 함수가 "선언된 위치"가 아니라, 함수가 "호출 문맥(invocation context)호출된 위치"에 따라 결정된다.

위의 코드에서, 사용자가 버튼을 누르면 button.onclick에 연결된 콜백 함수를 호출하는데, 그 시점의 this는 함수가 선언된 위치인 test 객체가 아니라, 콜백 함수를 호출하는 "버튼"(DOM 노드)이다. 그래서 엉뚱한 값(버튼 태그의 name 속성 값)이 출력되는 것이다.

더 헷갈리다고...? Orz

대부분의 this와 관련된 문제는 위에서 설명한 꼼수와 자바스크립트의 Function.prototype.apply()Function.prorotype.call() 를 통해 해결할 수 있다. prototype.js 의 Function.bind() 와 dojo 의 dojo.hitch() 도 결국은 같은 일을 한다(그래서 jQuery에는 없다).

흠냐... 아직 많이 남았는데... 벌써... 귀차니즘 발동... -,.-;;;

저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2009/12/08 17:21
크리에이티브 커먼즈 라이선스
Creative Commons License
내 스스로와의 약속(하루에 한개씩 블로그를 쓰겠다는)을 지키면서, 또 다른 약속(지난 번 dW Live!의 페차쿠차 발표에 대한 보충 수업을 하겠다는)을 지키기 위해 여러 번에 나눠 쓰기로 했다 :p

천덕꾸러기 취급 받던 자바스크립트가 다시 각광을 받게된 것은 웹2.0 열풍에 실려 날아온 AJAX 때문이다. AJAX의 A가 Asynchronous라는 것은 자바스크립트 개발자라면 누구나 아는 사실임에 종종 이를 망각하는 경우가 있다.

가장 쉬운 예를 보자:
function get_result() {
  var result1, result2;
  $.ajax({ ..., success: function(data) { result1 = data; });
  $.ajax({ ..., success: function(data) { result2 = data; });
  return result1 + result2;
}

이게 뭐가 문제냐~고 하시면 대략 난감~ 정말 곤란~하시다.

설마 저렇게야 하겠어라고 생각하신다면, 좀 더 그럴듯한 예를 들어보자:
function get_image_size(image_src) {
  var img = new Image();
  img.src = image_src;
  return { w: img.width, h: img.height; };
}

이미지를 자바스크립트로 동적으로 이미지를 로딩하고 크기를 구해서 어떤 짓을 하려나 본데...
뭐가 문제냐고? 없으면 말고~=3=3=33

좀 더 고급스런(?) 예제로 마무리하자:
<script src="http://www.google.com/jsapi"></script>
<script>
google.load("jquery", "1");
$(document).ready(function() { ... });
</script>

좀 더 나은(정답은 없다) 방법은... 스스로 생각해 보시길...=3=3=33

i'll be back~

i'll be back~



저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2009/12/05 21:37
크리에이티브 커먼즈 라이선스
Creative Commons License
오늘 있었던 한국 developerWorks의 행사 - dW Live! 웹개발 다반사에 발표했던 슬라이드인데, 앞 포스트에서도 밝혔듯이 페차쿠차라는 형식적인 제약으로 인해 극도로 불친절하다. 좀 더 친절한 설명은 이 블로그를 통해서 차근차근 보충할 예정이다.


(위의 플래시가 안보이시는 분들은 여기가서 PDF다운 받으세요: http://docs.thinkfree.com/docs/view.php?dsn=860508)

일단 티셔츠 한 장 받아 챙기고^^, 커피 한 잔 타서 입장~

먼저, 주최측에서 WebSphere sMash라는 솔루션을 소개했다. 그러나, 생뚱맞은  REST에 대한 질문 답변에 시간을 다 써버리고 sMash는 맛도 제대로 못봤다. (발표하시느라 고생하신 분께는 죄송하지만)오늘 데모만 놓고 보면 그냥 Yahoo! Pipes 설치형 버전이라는 느낌... -.-; REST로 딴지거신 분...은... 다음에 비슷한 행사나 세미나에선 좀 참아주셨으면... 발표자도 나름대로 계획이 있다는...

이어서, 페차쿠차 형식의 발표들이 이어졌다. 숨을 헐떡이는 발표자들...을 보면서 걱정이 되기 시작했다.(대산님 발표 여러번 봤지만 이렇게 힘들어하시는 건 처음 봄 :D) 아이팟 터치 타이머 켜놓고 한 번 연습하긴했는데.. 제비뽑기로 순서를 정하다보니... 나는 끝에서 두번째... 혹유랑 소곤거리느라 긴장도 다 풀리고, 별 생각없이 30초*15장을 넘기고 내려왔다. 듣는 사람은 어땠는지 모르겠음=3=333 짧은 시간에도 불구하고 좋은 내용을 핵심만 꼭꼭집어 발표하시는 분들... 대단하심 @..@)b

계속해서, 개발자들의 수다가 이어져야 하는데... -.-? 예전에는 몇가지 주제를 걸어놓으면 원하는 그룹에 끼어서 그 주제에 대해서 토론하는 방식이었는데... 이번에는 앞 순서의 발표자들을 앞에 앉혀놓고 질문 답변 시간... 쉽게 말해 "미수다" 스타일-.-;;; 나는 형식이 바뀐 줄도 모르고, "개발자의 커리어 패스 관리, 로드맵, 창업" 등에 대한 다양한 얘기들이 오고 가는 동안, "너무 옆길로 새는거 아닌가~"하면서 입 꾹 닫고, 진행자(우일님)만 바라보고 있었다는... 끝날 때쯤 되서야 상황을 파악하고, 딸랑 한마디~ 했더니... 행사 종료... 본의 아니게 클로징 멘트를 -.-;;;;;

행사가 끝나고, 발표자들은 기념품(8G USB 메모리! 막대기 아님!) 주최측 + 발표자들 + 꼽사리들은 근처 고급(!) 반점에 가서 맥주 or 고량주를 한 잔씩하고, 자장면 or 짬뽕 or 볶음밥을 먹고~(이게 오늘 나의 첫 끼니였다ㅠ.ㅠ) 후다닥~ 집으로~ 고고씽~

아무튼, 이런 류의 작은 행사들이 KOEX에서 하는 행사 보다 훨씬 재미도 있고~ 유익하다는 사실을 재확인했다.

저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2009/12/03 20:29
크리에이티브 커먼즈 라이선스
Creative Commons License
dW Live!

dW Live!


이번 주 토요일(12월 5일) 오후에 있을 dW Live! 세미나에서  발표를 해달라는 우일님의 부탁을 받고, 그동안 신세도 많이 졌고, 예전에 개발자들의 수다 시절에 한 번 참여해 본 경험도 있고, 결정적으로 딱히 할 일도 없어서... 선뜻 응했는데...

그 동안 발표 방식이 좀 바뀌었단다~ -.-;;; 페차쿠차... 흠...
제한시간(슬라이드 15장을 한 장에 30초, 총 7분 30초)안에 발표를 끝내야 하다는데... 흠...

선정된 발표 주제는 다음과 같은데... 흠... 정말 저런 주제를 7분 30초! 만에 발표할 수 있단 말인가! 

  • 괜찮은 오픈 API 제공하기 + VLAAH API 소개 - 홍민희
  • 봄싹 싸이트(http://springsprout.org) 개발 협업 방법 및 사용 기술 - 백기선
  • 코드 품질 포탈 SONAR 적용기 - 고경철
  • 흑백무성영화한편! (HTTP) - 이동욱
  • 자바스크립트 삽질(실수?) 베스트 10 - 장동수
  • (Startup기업 CEO의 관점에서 본) 기술의 경제학 - 정지웅
  • Realtime Web 간보기 - 김석준
  • Spring Framework with JavaFX - 이승철
  • 추상 계층의 딜레마 - 황대산
  • timelog 업무 적용 실험기 - 송승렬
발표에 앞서 주최측(IBM)의 세션이 있고, 그 뒤에 페차쿠차 발표, 이어서 개발자들의 수다가 진행된다. 더 자세한 내용은 한글 developerWorks 홈페이지에서~

중간에 내 이름도 있는데... 그다지 깊이있는 얘기는 없을 듯...-.-ㅋ

자~ 이제 발표자료 준비하러=3=3=333

저작자 표시 동일 조건 변경 허락
이 장소를 Daum지도에서 확인해보세요.
서울특별시 강남구 도곡2동 | 군인공제회관
도움말 Daum 지도
Posted by iolo
hacking/web2009/11/19 16:59
크리에이티브 커먼즈 라이선스
Creative Commons License
세미나 같은 건줄 알고 9회 다음 DevDay에 참가했다가... 얼떨결에 코딩 분위기에 동참.... 우수상까지 타버렸다(상품은 무려 삼보의 320G USB 외장 하드!). 당일날 트위터에서도 언급했지만, 완전 애들 과자 뺏아먹은 것 같아... 기분이... 참... :S
아무튼, 마땅한 아이디어도 안 떠오르는데, 때마침 발표자(다음 직원이신데 성함이 기억안나네요... 죄송 m(_ _)m)께서 엄청난 오타를 날리시는 것을 보고 영감을 받아 철자 검사 기능을 추가해보기로 했다.
백엔드는 오픈소스 스펠러 프로젝트 중에서 유일하게 한글을 지원하는 hunspell(오픈오피스, 파이어폭스 등에서 쓰이는)을 사용하기로 하고...
서버측 코드는 갖고 간 노트북에 윈도만 깔려있는 관계로 자바로 작성하기로 했다.
노트북에 설치된 C 컴파일러도 없고, 귀찮기도 하고 해서, 대충 JNA를 사용하여 당장 필요한 함수 몇 개만 hunspell 바인딩을 만들었다.

그리하여, 약 4시간에 걸쳐 만든 웹 기반 스펠 체커 API + 다음 오픈 에디터 플러그인.

오타가 잔뜩 있는 문장을 입력한 다음, 툴바의 오른쪽 끝에서 세번째 있는 필름롤 아이콘을 클릭하면 스펠 체커가 틀린 단어를 빨갛게 표시해 준다. 이 빨간 단어를 클릭하면 추천 목록이 나오고, 추천 목록에서 맞는 단어를 클릭하면 해당 단어를 선택한 단어로 대치한다. 웹 기반 스펠 체커 API는 익숙한 환경이라 금방 만들었는데, 다음 오픈 에디터의 구조에 익숙하지 않아서(오후에 코딩해야하는 줄 모르고, 오전 세미나를 대충 들어서 ㅠ.ㅠ) UI가 엉망이다. UI를 전반적으로 손을 많이 봐야 할 듯...
그날 만든 다음 오픈 에디터 예제에, 간단한 API 사용 예제와 자바독 문서, 관련 링크 등을 추가해서 급하게 프로젝트 홈페이지도 만들었다.
덧: 지금은 개인적으로 호스팅하고 있는 열라 후진 서버(셀2.66G/1.5G)에 올려놓았는데, 좀 쓸만한 서버를 확보할 수 있으면 올려두고, 여기저기 웹 프로젝트에서 써 먹을 수 있을 듯...한데, 혹시 도와주실 분 계신가요? ^^;
이 장소를 Daum지도에서 확인해보세요.
서울특별시 용산구 한남동 | 서울파트너하우스
도움말 Daum 지도
Posted by iolo
hacking/web2009/09/23 14:52
크리에이티브 커먼즈 라이선스
Creative Commons License
dojo 프로젝트의 리더였던 alex가 구글로 자리를 옮긴뒤 첫 제품을 내놓았다.



"Chrome Frame"이라는 이름의 IE 플러그인(Active-X)이 그것인데, 기술적으로는 FirefoxIE Tab 확장과 비슷하지만, IE Tab은 사용자가 명시적으로 IE로 보겠다고 해야만 활성화되지만, Chrome Frame은 색다른(?) 접근 방식을 제안한다(물론, 두가지 방식 모두 Chrome Frame이 깔려있을때만 동작한다):
1. (사용자가) URL 앞에 "cf:"를 붙인다. 예를 들면 http://acid3.acidtests.org/ 하면 IE가 X같은 반응을 보이지만, cf:http://acid3.acidtests.org/ 하면 잘 된다.
2. (개발자가) HTML 페이지에 <meta http-equiv="X-UA-Compatible" content="chrome=1" /> 메타 태그를 달아놓으면 해당 페이지를 보는데 크롬을 사용한다.

첫번째 방식은 GUI 메뉴를 URL로 옮겨놓았을 뿐, 결과만 확인하고 넘어가자:

Chrome Frame 없이 IE8로 Acid3 테스트에 도전!

Chrome Frame 없이 IE8로 Acid3 테스트에 도전!


IE8을 가장한 Chrome으로 Acid3 테스트에 도전!

IE8을 가장한 Chrome으로 Acid3 테스트에 도전!


두번째 방식을 주목해보자. 이 방식을 사용하면 Chrome Frame 플러그인만 깔려있다면 자동적으로 활성화 된다. 그렇다면 Chrome Frame 플러그인만 자동으로(강제로) 깔 수 있으면... -.-ㅋ 뭔가 구린 냄새가 솔~솔~ IE로 인터넷 뱅킹이나 쇼핑몰 결제할 때만 되면 난리 법석을 떨던 ActiveX의 *랄 발광을 역이용(!)할 수 있다. 금상첨화(혹은 설상가상) 우리나라 사용자들은 ActiveX 설치할 때 "보안 경고"가 뜨면 무조건 "예"라고 해야 한다고 배워서 실천하고 있으니~ =..=

친철한 알렉스께서~ 우리를 위해 그 스크립트까지 만들어 놓으셨는데, 이를 이용해서 간단한 예제 하나 만들어 보자(IE로 http://iolo.pe.kr/acid3.html 에 접속해봐도 된다):
<html>
<head>
<title>acid3 test on IE with Chrome Frame</title>
<meta http-equiv="X-UA-Compatible" content="chrome=1" />
</head>
<body>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
 
<div id="placeholder">
<p><a href="http://acid3.acidtests.org">acid3 test</a></p>
<p><a href="cf:http://acid3.acidtests.org">acid3 test with Chrome Frame(IE Only)</a></p>
</div>

<script>
 CFInstall.check({
    node: "placeholder",
    destination: "cf:http://acid3.acidtests.org/"
  });
</script>
</body>
</html>

CFInstall.check() 함수는 기본적으로 지정한 노드(여기서는 placeholder)를 설치 페이지를 표시하는 iframe 태그로 바꾸서 설치를 유도하고, 설치가 끝나면 destination 페이지로 이동한다(자세한 설명은 공식 개발자 문서를 참조하시라~).

이런식의 스크립트를 웹 서비스의 진입부에 적당히 끼워넣어 두면... "부끄러운" 대한민국의 웹(한국 웹의 불편한 진실 참조)이 우리에게 강요했던 방식 그대로~~~ 크롬을 쓰도록 강요할 수 있다 -.-ㅋ

그런데, 구글은 이런걸 왜 만들었을까? 무엇보다도 구글이 만든 대다수의 초첨단(?)  웹 어플리케이션들을 돌리기엔 IE(6,7은 말할것도 없고 8도 도토리 기재기)의 렌더링 / 자바스크립트 엔진이 너무 구리기 때문일 것이다.

Chrome Frame이 널리 보급되기엔 넘어야 할 산이 많다. 첫째, 사용자 경험이 너무 거칠다. 플래시의 경우처럼 매끈하게(뭔가 설치한다는 느낌을 주지않고) 설치할 필요가 있다. 설치 유도 스크립트(CFInstall.js)를 많이 다듬어야 할 듯... 둘째, 다음으로 77M를 넘어서는 설치 용량이다. 사용자의 컴퓨터에 구글 크롬이 설치되어 있다면 이를 그대로 활용할 수 있을 것이다. 아마 조만간 그렇게 되겠지? 셋째, 아직은 버그가 많다. 첫술에 배부를 순 없겠지...

IE에선 느려터져서 못해먹겠던 벽돌깨기에  다시 도전해보자~
IE를 가장한 크롬으로 벽돌깨기!

IE를 가장한 크롬으로 벽돌깨기!


결론, 플래시 정도의 사용자 경험을 통해 설치할 수 있다면, IE용 페이지 따로 개발하는 대신 Chrome Frame을 써 볼만 하겠다.

Posted by iolo
hacking/web2009/09/15 20:26
크리에이티브 커먼즈 라이선스
Creative Commons License
사진작가들이 쓰는 Lightbox 얘기가 아니다. 웹개발자나 디자이너에게 Lightbox는 웹 페이지 상에서 이미지들을 뽀대나게 보여주는 일종의 Modal Dialog 형태의 UI 컴포넌트다.


대표적인 Lightbox 라이브러리로는 (유행이 좀 지난 느낌이 있지만) prototype / script.aculo.us 를 사용하여 만든 Lightbox2를 보면 어떤 것인지 쉽게 이해 된다. 요즘 유행하는 jQuery용 플러그인은 넘쳐난다.

하지만, 개인적으로 prototype이나 jQuery 보다는 dojo를 선호하기 때문에(대부분의 경우엔 별 차이가 없지만, 마이너리티 체질의 똥고집이랄까...) dojo로 Lightbox를 만들기로 했는데... 웬걸 -.-; dojox.image.Lightbox라는 녀석이 이미 있더라. 그냥 쓸까 하다가... 이 녀석이 dijit(dojo의 위젯 시스템; jQuery UI 쯤에 해당하는 모듈이다)에 의존하는 관계로 버림받고 있길래 간단히 하나 맹그러봤다.

솔직히... 만만하게 보고 시작했는데... 생각보다는 많이 복잡하더라. -,.-;;;

이름은 Lightbox와 비슷하면서도 dojo로 만들었다는 느낌이 들도록 Delightbox라고 지었다 ^^;

각설하고, 사용법을 보자면 대충 이런 식이다:

1. (jQuery빠들이 좋아하는) unobtrusive 스타일

iolo.ui.Delightbox.create(dojo.query('#content a.delightbox'));

html 페이지의 모양새가 대충 이런식이라고 하면:
...
<div id="content">
...
<a href="원본이미지url" title="제목" class="delightbox"><img src="썸네일이미지url" /></a>
<a href="원본이미지url" class="delightbox">제목</a>
...


위의 예는 html 페이지 내에서 id가 content인 태그 안쪽에서 "delightbox"라는 css 클래스를 가진 모든 a 태그를(dojo.query는 jQuery의 $의 여러가지 기능 중의 하나라고 보면 된다) delightbox 형태로 바꾼다.

이 방식의 장점은 javascript를 쓸 수 없는 환경에서도 그럭저럭 보이는 거라고 하는데... 글쎄.. 과연 그럴까? 아무튼, unobtrusive javascript에 대해서는 예전에 쓴 글을 참고하시라.

2. (dojo빠들이 좋아하는) json datastore 스타일

iolo.ui.Delightbox.fetch('http://iolo.pe.kr/screenshots/screenshots.json');

json 파일은 대충 이런 식인데, thumbnail이 없으면 title을 사용한다:
{
items: [
{ url: '원본 이미지 url', title:'제목', thumbnail:'썸네일 url' },
...
]
}

위의 예는 주어진 url에서 json으로 된 데이터를 ajax로 읽어와서 그 안에 있는 내용을 토대로 동적으로 delightbox가 결합된 html을 만든다.

3. 코딩으로 처리하기

이건 소스 코드를 참고해서 알아서 하시면 되겠다. :p 소스

소스 코드는 여기, 실제 돌아가는 페이지는 여기.

덧1. dojo의 크로스 도메인 빌드를 지원하도록 만들었으므로, 내 웹서버에는 이것과 관련해서는 js 파일이 하나도 필요없다. 여기에 대해서는 테스트 페이지의 소스 코드를 참조하시면 되겠다.

덧2. 아! 빼먹을 뻔 했는데... IE에선 안된다. CSS만 좀 손봐주면 될것 같은데... 귀찮아서-,.-;;;


Posted by iolo
hacking/web2009/08/24 14:35
크리에이티브 커먼즈 라이선스
Creative Commons License
제목 그대로 심심풀이~

플래시나 canvas같은 잡다한거(?) 안쓰고 HTML/CSS/자바스크립트만 사용해서 만들었다.
달랑 게임만 만들기엔 심심하기도 하고... 딱히 올려놓을 곳도 없고 해서... 구글 앱엔진을 이용해서 점수를 기록하는 모듈도 만들었다.


돌아가는 모습은 http://iolo.appspot.com/ 에서 볼 수 있고~
소스 코드는 http://code.google.com/p/iolothebard/ 에서 볼 수 있다~

심심풀이 코딩이 다 그렇듯...
대충 돌아가기 시작하니까 재미가 없어져서... 얼렁뚱땅 마무리했다.
혹시 관심있는 분이라면~ 이거저것 고쳐보면 재미있을라나?

Posted by iolo
hacking/web2009/06/08 21:28
크리에이티브 커먼즈 라이선스
Creative Commons License
제목은 거창한데... 내용이 없다. -,.-;;;;
그도 그럴것이... 뜬구름 중의 뜬구름 Web3.0 얘기 아닌가.

사내용으로 만든 자료라 좀 부실하긴 하지만,
웹의 탄생이전 부터 이어져오는 흐름을 정리한다는데 의미를 두고 보면 의외로 볼만할지도...*^^*

현재까지 Web3.0에 대한 논의는 시맨틱 웹, 플랫폼으로써의 웹, 그리고 유비쿼터스 세상으로의 관문으로서의 웹, 세가지 흐름으로 볼 수 있다. 물론 세가지 논의가 서로 간에 밀접한 관련이 있어서 무 자르듯 자를 수는 없겠지만...

IMHO, 시맨틱 웹은 내가 이 바닥에서 먹고 살 동안은 "The Dream of Web"으로 남을 것 같다. 유비쿼터스 웹는 돈독이 오른 가전 업체들의 말장난 단계를 벗어나려면 좀 더 시간이 필요할 듯... 가장 현실적인 것은 (구글이 밀고 있는) 어플리케이션 플랫폼으로서의 웹인 것 같은데, 이건 웹3.0이기보다는 웹2.5 정도가 적당할 듯.


Web2.0도 이제 조금씩 정리되어가는데.. 벌써 Web3.0이라니... 마지막 페이지에선 Web4.0도 나온다-,.-;;;

Posted by iolo
hacking/web2009/04/24 13:58
크리에이티브 커먼즈 라이선스
Creative Commons License
뵑만년만의 포스팅이다.
하나:

둘:

셋:

그리고, 넷:

여기가면 인쇄된 책자를 살 수 있다.
씽크프리 닥스의 임베딩 기능 테스트 삼아... 한번 해 봤음.
Posted by iolo
hacking/web2009/01/07 16:31
크리에이티브 커먼즈 라이선스
Creative Commons License

Dojo Objective Harness라니... 참 이름도 잘 짓는다. 원래는 그냥 Dojo Helper의 약자였는데... -.-;

아무튼 자바스크립트 단위테스트로 고민하고 있는 분들이라면 한번 쯤 읽어봐도 좋을 튜토리얼이다.
dojo와 무관하게 함수들을 동기/비동기로 테스트할 수 있다.
어느 정도 자동화도 가능하지만, 이 경우엔 rhino를 사용하기 때문에 실제 브라우져에서와 다른 결과가 나올 수 있으므로 그다지 유용하다고 할 수 없다. 대부분의 경우엔 수시로 브라우져를 통해서 테스트를 한번씩 돌리는 것이 더 확실하다.

간단한 대체품으로는 JsUnit이 있긴 하지만... 그닥 -.-;
dojo는 죽어도 싫다거나, 더욱 강력한 녀석을 원한다면 Selenium을 검토해보는 것이 좋을 듯 ~.~

Posted by iolo
hacking/web2008/11/16 14:56
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Offline Ajax with Apache Derby
번역: 아파치 더비를 이용한 오프라인 Ajax

자바로 만든 작고 가벼운, 그래서 너무나도 유용한  RDB인 아파치 더비
"headless 애플릿"으로 실행하여, Ajax를 위한 오프라인 저장소로 사용하는 방법을 설명한다.

그런데... 애플릿 스타트업 타임을 고려하면... 이게 과연 쓸모가 있을지는 의문... 그냥 구글 Gears를 쓰는 편이... -.-;;;

아무튼 그런걸 떠나서 더비를 이렇게 활용하겠다는 아이디어 자체는 대단히 훌륭~
LiveConnect(애플릿과 자바스크립트를 연결하는 기술)를 다시 돌아보는 것도 재미있지만, 이거 조만간 사라질거라는...



Posted by iolo
hacking/web2008/10/24 17:08
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Develop AJAX applications like the pros, Part 3: Use DWR, Java, and the Dojo Toolkit to integrate Java and JavaScript
번역: 전문가다운 Ajax 애플리케이션 개발, Part 3: DWR, 자바, Dojo 툴킷을 사용하여 자바와 자바스크립트 통합하기

전형적인 디벨로퍼웍스 스타일의 제목... 원츄! -.-)b~

제목과는 달리 dojo 얘기는 없다.
대신, 자바 개발자들을 위한 거져 먹는 Ajax! DWR이 있다.
정말~ 쉽고! 정말~ 편하다!
장담하건데... 기존에 자바로 구축된 웹 사이트에 간단한 Ajax를 추가하는 거라면 이 보다 더 좋은 솔루션은 없다.

百問而不如一見~

Posted by iolo
hacking/web2008/10/08 00:39
크리에이티브 커먼즈 라이선스
Creative Commons License
아싸~ 아기다리고기다러던~~ (이런 개그하지 말랬지~ +-.-)==@ (*..*) 퍼퍽!)

*경* Dojo Toolkit 1.2 정식 버전 릴리즈~~ *축*

Alex Russell의 뒤를 이어 Pete Higgins가 메인테이너를 맡은 뒤 첫 릴리즈다.
아무튼, 뭐가 달라졌나 볼까나~.~

새로운 데이터스토어들
  • dojox.data.JsonRestStore
  • dojox.data.CouchDBRestStore
  • dojox.data.GoogleFeedStor
  • dojox.data.GoogleSearchStore
  • dojox.data.PersevereStore - Perservere... 쓰는 사람이 있구나... -.-;
  • dojox.data.S3Store
JsonRestStore는 어디에나 써먹을 수 있을 정도고, 나머지도 나름대로 유용할 듯.

dojox.analytics.Urchin
구글 애널리틱스 스크립트 지연 로딩하는 모듈.
몇 바이트 되지도 않는 자바스크립트 때문에 가끔 먹통되는 상황을 경험해 본 개발자라면 유용하겠다.
내가 다니는 회사에서는 loginside라는 솔루션을 쓰는데, 이 녀석 조금 고치면 될 듯^^;

audio/video/object/embed 지원 모듈들
  • dojox.av.FLVideo
  • dojox.av.widget.Player
  • dojox.embed
  • dojox.embed.Flash
  • dojox.embed.Flash.proxy
  • dojox.embed.Quicktime
  • dojox.embed.Object
뭐~ 보시는 대로... dijit 위젯으로 만들어져서 일관성도 있고, 쓰기도 편해졌다.

엽기적인 크로스도메인 Ajax. 보면... 왜 엽기적이라고 하는 지 알 수 있다. -.-;
세삼 확인하는 사실...
세상은 넓고 꼴통은 많다...

dojox.io.xhrPlugins
dojo.xhr을 여러가지 방법으로 확장할 수 있는 방법을 제공한다.
예를 들면 크로스도메인일 경우엔만  IE8의 XDomainRequest나 서버측 프록시를 사용한다거나... Loading 메시지를 표시한다거나...
개인적으론, 1.2에 추가된 최고의 기능이 아닐까 한다.

dojo 0.x 시절에도 있었던 AOP 기능을 깔끔하게 새로 만들었다. 이런 거 보면 dojo가 너무 많이 앞서 갔다. -.-;

dojox.lang.observable
객체의 속성을 읽거나, 쓰거나, 메소드를 호출하는 것을 (비동기로) 감시하는 멋진 기능인데... IE에서 문제가 쪼금~ 있다는...-.-;

보안 관련 모듈들
  • dojox.secure.capability: 자바스크립트 코드를 검증한다. 그래도 eval은 여전히 evil~
  • dojox.secure.DOM: DOM 노드의 접근을 제한한다. 쉬운 말로... 자바스크립트로 DOM API의 래퍼를 다 만들었다는... -.-;;
  • dojox.secure.sandbox: 위의 모듈들을 사용하여 XHR을 통해 다른 도메인에서 로드된 HTML, JSON, 자바스크립트들의 접근을 제한한다. 옥상옥이라는게 이런건가...-.-;;;

덤으로...(알만한 사람들은 이미 알고 있겠지만)
기존에 AOL에서 제공하던 CDN 외에 구글에서 제공하는 CDN을 통해서 다운로드/설치 없이 바로 쓸 수 있다.

더 자세한 얘기는 공식 릴리즈 노트에~~

덧. 1.2 릴리즈 소식을 듣고 다운받으러 갔다가 무심결에 맨 위에 있는 링크를 눌렀더니... dojo.js -.-;;;;
prototypejquery 덕분에(?) 크기에 대한 압박이 심했나 보다. 아무튼 prototype.js나 jquery.js 대용이라면 dojo.js 파일 하나면 충분하고... dijit을 포함한 dojo 모든 것을 맛보려면 역시 풀버전~ ^^; 그 전에 눈요기가 필요하다면 Dojo Feature Explorer~ =3=333


Posted by iolo
hacking/web2008/10/05 23:14
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Ajax overhaul, Part 4: Retrofit existing sites with jQuery and Ajax forms
번역: Ajax로 사이트 전면 개편, Part 4: 기존 사이트를 jQuery와 Ajax forms를 사용하여 개선하기

열화와같은 독자들의 성원에 힘입어 연장 방영 중인 Ajax 오버홀 시리즈~

4부에서는 앞에서 한번 써 먹었던 jQuery Tabs UIjQuery Forms를 사용하여, 예제 애플리케이션인 Customize Me Now의 구매 과정을 마법사 스타일의 UI로 개선한다.

百問而不如一見~

Posted by iolo
hacking/web2008/09/23 21:14
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Ajax overhaul, Part 3: Retrofit existing sites with jQuery, Ajax tabs, and photo carousels
번역: Ajax로 사이트 전면 개편, Part 3: jQuery, Ajax 탭, 회전식 슬라이드쇼로 기존 사이트 개선하기

Ajax 오버홀, Part 1: Ajax와 jQuery로 기존 사이트 개선하기Ajax 오버홀, Part 2: jQuery, Ajax, 툴팁, 라이트박스로 기존 사이트 개선하기로 마무리된 줄 알았던 오버홀 시리즈...
열화와같은 독자들의 성원에 힘입어 연장~~?!

하긴.. 그렇게 끝나면 열라 허무했을 거다.
지금 4부까지 번역했는데... 분위기로 봐선 5부도 조만간 나올 듯...

3부에서는 jCarousel 플러그인을 이용한 회전식 슬라이드쇼와 jQuery Tabs UI 플러그인을 이용해서 탭 UI를 만든다.
百問而不如一見:


확실히 jQuery 가 좋은 것 같은데... 하지만...
나는 dojo 빠~=3=3=333

덧1. 이번 글을 번역할 때 애먹은 단어는 carousel이다. 회전 목마... -.-;;;; 저게 뭘로 봐서 회전 목마냐고...
궁여지책으로 회전식 슬라이드쇼라고 번역했지만, 찝찝하다.
편집자께서 알아서 고쳐주시겠지 했는데... 그대로다.
뾰족한 대안이 없었나 보다. 좋은 단어 추천 요망~.~/

덧2. 연재 1~2부를 번역할 때 overhaul을 어떻게 번역할 지를 고민하다가, 그냥 한글로 "오버홀"이라고 해다.
이번에는 편집자께서 제안해주신 "분해 수리"로 바꿨는데, 오늘 올라온 기사에는 "전면 개편"이라고 바뀌었다.
흠... 그런데... 뭔가... 좀...
이 연재에서 거듭 강조하는 핵심 중의 하나는 "전면" 개편이 아니라 "점진적" 개편이라는...
웃거나 말거나...=3=3=33

Posted by iolo
hacking/web2008/08/20 23:06
크리에이티브 커먼즈 라이선스
Creative Commons License
여름 휴가도 있고... 밥먹고 사는 일도 있고 해서... 한참 쉬었으니 다시 시작해보자.

dojo의 객체 시스템의 핵심은 dojo.declare다:
  • dojo.declare(className, superClass, { members... }) : 주어진 이름을 가진 클래스를 정의한다. 클래스 이름은 문자열로, 수퍼클래스는 클래스 객체로 지정해야 한다. 수퍼클래스가 없으면 null 또는 [ ] (빈 배열)을 지정하면 된다. 하나 이상의 수퍼클래스(정확히는 하나의 수퍼클래스와 여러 개의 믹스인을 배열로 지정할 수도 있다.
먼저, 단순한 클래스를 정의하는 예를 보면:
dojo.declare('Point', null, {
    x: 0,
    y: 0,
    constructor: function(x, y) {
        this.x = x || 0;
        this.y = y || 0;
    },
    moveTo: function(x, y) {
      this.x = x;
      this.y = y;
   },
    equals: function(point) {
      return (this.x == point.x) && (this.y == point.y);
    }
});

위의 예는 Point라는 이름의 클래스를 정의한다. 이 클래스는 수퍼클래스가 없으며, 하나의 생성자(constructor)와 x, y 두 개의 속성(멤버 변수)을 가지며, moveTo, equals 세 개의 메소드(멤버함수)를 가진다.
키워드는 declare(선언)이지만, 실제로 하는 일은 선언이 아니라 정의(define)다. 오히려 dojo.provide가 선언에 가깝다. 이 글의 주제에서 벗어나는 얘기니 궁금하면 구글신께 물어보시라... 나중에 시간나면 따로 쓰기로 하자~

이 클래스를 사용하는 예를 보면:
var p1 = new Point(1, 2);
var p2 = new Point();
p2.moveTo(3, 4);
alert(p1.equals(p2)); // false

보다시피 자바 등의 다른 언어와 별 차이가 없다.

계속해서, 상속의 예를 보면:
dojo.declare('Rect', [ Point ], {
    w: 0,
    h: 0,
    constuctor: function(x, y, w, h) {
       this.w = w || 0;
       this.h = h || 0;
    },
    getRight: function() {
      return x + w;
    },
    getBottom: function() {
      return y + h;
    },
    resize: function(w, h) {
      this.w = w;
      this.h = h;
    },
    equals: function(rect) {
      return this.inherited(arguments) && (this.w == w) && (this.h == h);
    }
});


위의 예는 Rect라는 이름의 클래스를 정의한다. 이 클래스는 Point를 상속받으며(x, y 두 개의 속성과 moveTo, equals 두 개의 메소드), 추가로 w, h 두 개의 속성과 getRight, getBottom, resize 세개의 메소드를 정의하며, equals를 오버라이딩(재정의)하고 있다.
equals에서 this.inherited(arguments)라는 생소한 구문이 보이는데 부모클래스에서 정의한 메소드를 호출하는 것이다. 자바로치면 super(rect)와 비슷하다고 보면 되겠다.
생성자에서 super를 호출하지 않는다는 점도 주의해야한다. 아무말 안해도 무조건 super를 호출한다. 자바스크립트는 함수 오버로딩(중복정의)을 지원하지 않기 때문에 생성자를 하나밖에 가질 수 없다.

객체 관련 유틸리티 함수들이 여러가지 있지만, 개인적으로 한 번이라도 써 본적이 있는 녀석들만 간단히 알아보면:
  • dojo.delegate(obj, { members...}) : 주어진 객체를 상속받은 객체를 만든다. dojo.declare와 달리, 클래스가 아니라 인스턴스 객체를 만든다. 간단하게 몇 가지 속성이나 메소드만 재정의한 객체를 만들때 편리하다.
  • dojo.clone(obj) : 주어진 객체의 deep-copy 객체를 만든다.
dojo는 하나 이상의 클래스를 하나의 .js 파일에 넣어두고, 이를 동적으로 로딩하는 기능을 제공하는데, dijit 설명할 때 자세히 알아보기로 하고... 여기서는 dojo 관련 소스들을 보다가 자주 보게될 함수 몇가지만 알아보자:
  • dojo.require(className) :  현재 모듈(나중에 설명한다)에서 주어진 이름의 클래스를 참조(사용)한다. 자바의 import와 비슷하지만, 자바와 달리 와일드카드(*)를 사용할 수 없다(dojo 0.4.x 쓰시던 분들도 주의!). 일반적으로 dojo.require('dijit.form.TextBox')라고 하면 dojo디렉토리/dijit/form/TextBox.js를 로딩한다고 이해해도 무방하다.
  • dojo.provide(className) : 주어진 이름의 클래스를 선언한다. 즉, 현재 모듈(나중에 설명한다)에서 주어진 이름의 클래스를 정의할 것임을 미리 알린다. 실제로는 빈 객체를 정의하기 때문에 네임스페이스 선언을 위해서 사용한다.
위의 두 함수는 dojo custom build에서도 매우 중요한 역할은 한다.

오늘은 여기까지~

다음에는 아기다리고기다리던 dijit(dojo widget)이다.

덧. 자바스크립트로 진지한 코딩을 해 본 개발자라면 IE의 trailing comma error의 공포를 알고 있을 것이다. dojo.delcare도 조심해서 쓰지 않으면 좌절을 맛보게 된다. 조만간 동의하실 것이라개인적으로 즐겨쓰는 방법은:
  1. 무조건! jslint로 검사한다. 예전에 썼던 웹 프로젝트에서 jslint로 자바스크립트 검증하기: maven 또는 ant 를 참조하시라~
  2. 무조건! 각 멤버 변수/함수를 쉼표로 끝내고, 불필요한 comma를 넣는 실수를 방지하기 위해 더미로 속성을 하나 더 넣는다. 예를 들면:
dojo.declare('Circle', [ Point ], {
    attr1: 'test',
    attr2: null,
    func1: function() {
        ...
    },
    func2: function() {
        ....
    },
    _dummy: null
});


Posted by iolo
hacking/web2008/08/13 21:58
크리에이티브 커먼즈 라이선스
Creative Commons License
웹2.0의 열기가 안정되면서 한 때 잘 나가던 몇몇 회사의 서비스들이 조용해졌다.
씽크프리도 그 중의 하나일지도... 그러나 버뜨!

쓸모도 없는 데모만 보여주고(지금은 뜨지도 않지만)... 스샷만 남발하고... 연기에 연기를 거듭하던 씽크프리 노트가 최근 업데이트에서 모습을 드러냈다.
데모 때 보다 한결 깔끔해진 모습으로~



고화질(1024x768) 동영상(30M)은 용량 문제로 따로 올렸다.

흠...
솔직히... 아직 제대로된 원격 블로깅 도구라고 하기엔 한~참 멀었지만... 다음 업데이트를 기약하면... 이번엔 요기까지~

덧. 블로그 포스팅에 촛점을 맞춰서 만들었는데...
관심있는 분들... 더 삼빡하게 하나 만들어 주세요.~.~/
Posted by iolo