[PDF] 실전 HTML5 가이드.
ITWeb/개발일반 2011. 11. 3. 14:11canvas 관련 자료 찾다가.. PDF 파일 보이길래.. 걍 스크랩 합니다.
[다운로드 URL]
http://html5.creation.net/html5-guide.pdf
사이트 URL 을 보니 윤석찬님 서버에 올라가 있는 파일 인가보내요.
작성자는 윤석찬, 신현석, 정찬명, 경준호, 권정혁 이렇게 다섯분 입니다.
[참고사이트]
. PDF 문서 31쪽에 있는 넘 밖으로 뽑았습니다.
HTML5 - WebSocket
ITWeb/개발일반 2011. 11. 2. 09:02http://www.slideshare.net/zanylove/html5-websocket-5094806
http://www.slideshare.net/trustinlee/websocket
http://dev.w3.org/html5/websockets/
http://jwebsocket.org
http://code.google.com/p/phpwebsocket/
[Client]
. HTML5 WebSocket API 를 이용해서 작성
[Server]
. 별도의 Server 프로그램 작성 필요
phpwebsocket 으로 테스트 결과 정상적으로 동작함.
기본 원리는 브라우저에서 client port 생성하고 server port 로 접속 여러개의 브라우저 실행 시 브라우저 별로 port 가 다르게 뜨기 때문에 port 충돌 현상은 없음.
netstat -n 으로 확인 하면 됩니다.
2011.11.02 현재 safari 에서 정상동작 되며, 크롬에서는 객체 지원은 하나 동작하지는 않음.( phpwebsocket 으로 테스트 )
client/server 작성 코드들은 위 링크에 다 나와 있기 때문에 별도 작성은 하지 않습니다.
w3c 에 있는 interface 만.. 스크랩 합니다.
[Constructor(DOMString url, optional DOMString protocols), Constructor(DOMString url, optional DOMString[] protocols)] interface WebSocket : EventTarget { readonly attribute DOMString url; // ready state const unsigned short CONNECTING = 0; const unsigned short OPEN = 1; const unsigned short CLOSING = 2; const unsigned short CLOSED = 3; readonly attribute unsigned short readyState; readonly attribute unsigned long bufferedAmount; // networking [TreatNonCallableAsNull] attribute Function? onopen; [TreatNonCallableAsNull] attribute Function? onerror; [TreatNonCallableAsNull] attribute Function? onclose; readonly attribute DOMString extensions; readonly attribute DOMString protocol; void close([Clamp] optional unsigned short code, optional DOMString reason); // messaging [TreatNonCallableAsNull] attribute Function? onmessage; attribute DOMString binaryType; void send(DOMString data); void send(ArrayBuffer data); void send(Blob data); };
chrome 에서 왜 안되는지 확인을 해본 결과....
- http://www.codeproject.com/KB/HTML/Web-Socket-in-Essence.aspx
- http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-09
결국 phpwebsocket 의 code base의 protocol 과 latest protocol 에 차이가 있어서였다..ㅡ.ㅡ;;
※ Protocol 전문 참조 : http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-09#page-6
WebSocket request/response in the latest draft-ietf-hybi-thewebsocketprotocol-09:
Request
GET /demo HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: V2ViU29ja2V0IHJvY2tzIQ==
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 8
Response
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: VAuGgaNDB/reVQpGfDF8KXeZx5o=
Sec-WebSocket-Protocol: chat
[Sec-WebSocket-Accept Handshake String 함수 - phpwebsocket 용]
function getComputeWebSocketHandshakeSecurityHash09 ($strKey) {
$seedKey = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
$secWebSocketAccept = $strKey . $seedKey;
$secWebSocketAccept = base64_encode(sha1($secWebSocketAccept, true));
return $secWebSocketAccept;
}
- phpwebsocket 소스 중 server.php 에서 dohandshake 와 getheaders 함수를 수정해 줘야 합니다.
[getheaders 함수]
if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$req,$match)){ $key=$match[1]; } // 추가 코드
return array($r,$h,$o,$key,$key1,$key2,$data); // $key 추가 됨
[dohandshake 함수]
list($resource,$host,$origin,$strKey, $strkey1,$strkey2,$data) = getheaders($buffer); // $strKey 추가 됨
if ($spaces1 == 0 || $spaces2 == 0 || $numkey1 % $spaces1 != 0 || $numkey2 % $spaces2 != 0) {
....
// --> 이 부분에서 disconnect 와 return false; 가 되기 때문에 close 됨 그래서 코드 변경해야 함. protocol 버전에 맞게 코드 전체를 다시 작성 하면 되나 귀찮아서.. 그냥.. 내부에 hard coding 함. ^^;
$upgrade = "HTTP/1.1 101 Switching Protocols\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept: " . getComputeWebSocketHandshakeSecurityHash09($strKey) . "\r\n" .
"\r\n";
socket_write($user->socket,$upgrade.chr(0),strlen($upgrade.chr(0)));
$user->handshake=true;
return true;
}암튼 이렇게 해서 chrome 최신 버전에서랑 safari 에서 정상 동작 확인 끝.
※ 추가, chrome 최신 버전(protocol 09)에서 websocket 사용시 send message 가 깨지는 현상이 있는 듯 함. 결국 최신 버전으로 테스트는 connection 까지 가능 하나 bidirectional sending 은 safari 에서 이전 protocol 로 테스트 하는게 아직까지는 정신 건강에 좋은 것 같내요.
모바일 광고 관련 자료 - from slideshare.net
ITWeb/개발일반 2011. 10. 31. 17:07그냥 필요한 자료 찾다가 얻어 걸린 링크 입니다.
http://www.slideshare.net/germweapon/dmc-media107
모바일 광고 관련 괜찮은 자료가 있는 것 같아 북마킹 합니다.
모바일 웹 개발 - Emulator/SDK ...
ITWeb/개발일반 2011. 10. 27. 11:26http://www.mobilexweb.com/emulators
위 사이트 들어가서 해당 페이지에 emulator 들을 다운로드 받아 개발 하면 됩니다.
[첨부파일]
그냥 구글링 하다 걸린 PDF
iframe resize 시 layer 형태로 조정하기.
ITWeb/개발일반 2011. 10. 26. 14:40(결국 div 처럼 layered 형태로 표현이 가능 함.)
쉽다!
<iframe style="position:absolute; ...." ....></iframe>
빨간색의 bold 부분만 넣어 주면 됩니다.
아래는 샘플 코드 입니다.
<iframe name="viewFrame" id="viewFrame" src="view.html" frameborder="0" scrolling="no" style="position: absolute; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-to p: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-color: transparent; display: block; left: 0px; top: 0p x; width: 320px; height: 250px;" ></iframe>
모바일 리치미디어 광고용 Javascript SDK.
ITWeb/개발일반 2011. 10. 26. 13:03http://code.google.com/p/ormma/wiki/ORMMA_JavaScript
기존 mraid 이런게 있었는데.. ormma 라는 것도 있었군요.
테스트가 필요한 시점 이내요..
구글 모바일 검색결과 예제 - PC 에서 확인해보기
ITWeb/개발일반 2011. 10. 25. 16:35이걸 그냥 소스보기 해서 보면.. 눈 돌아 갑니다.
ㅋ chrome 에서 개발자도구(F12 를 누르세요.)를 이용해서 보세요.
scramble 된 코드들이 그래도 나름 잘 정돈 되어서 보입니다.
Android phone 에서의 navigator properties
ITWeb/개발일반 2011. 10. 25. 11:45http://www.w3.org/Mobile/Specifications
http://www.quirksmode.org/js/detect.html
http://www.mobilexweb.com/blog/android-froyo-html5-accelerometer-flash-player
http://www.quirksmode.org/m/tests/browserdetect.html
일반 PC browser 와 Mobile browser 의 navigator property/attribute 가 다릅니다.
그래서 걍 list 정리해 봅니다. (Android WebView 브라우저에서 확인함)
navigator
.language
.product
.mimeTypes
.appVersion : 5.0 (Linux; U; Android2.3.5; en-ca; SGH-I727R Build/GINGERBREAD) AppleWebKit/533.1(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
.plugins
.onLine
.connection
.platform
.vendor
.appCodeName
.geolocation
.cookieEnabled
.appName
.productSub
.userAgent : Mozilla/5.0 (Linux; U; Android2.3.5; en-ca; SGH-I727R Build/GINGERBREAD) AppleWebKit/533.1(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
.vendorSub
.javaEnabled
.isApplicationInstalled
.getStorageUpdates
.registerProtocolHandler
.registerContentHandler
window.postMessage 알아보기.
ITWeb/개발일반 2011. 10. 25. 10:01https://developer.mozilla.org/en/DOM/window.postMessage
http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html#web-messaging
window.postMessage 는 cross domain 간 데이터를 주고 받는데 아주 유용한 기법을 제공 합니다.
자세한 spec 은.. 위 URL 참고 하시면 됩니다.
http://192.168.1.1/siteA.html
0. siteB 를 allow 할 allowOrigin 정의를 합니다.
var allowOrigin = "http://192.168.2.1";
1. siteB 에서 전송한 postMessage 이벤트를 catch 하기 위해서 event 등록을 합니다.
window.addEventListener("message", postMessageController, true); 또는
window.attachEvent("onmesage", postMessageController);
2. siteB 의 postMessage 이벤트를 catch 해서 실행 시킬 postMessageController 함수 작성을 합니다.
function postMessageController(e) {
if ( e.origin === allowOrigin ) {
// 실행 시킬 코드를 작성 하세요.
alert(e.data); // e.data 는 siteB 에서 전달 받은 message 입니다.
}
}
http://192.168.2.1/siteB.html
0. siteA 와 통신 하기 위한 allowOrigin 을 정의 합니다. (allowOrigin 은 그냥 임의 정의한 변수명 입니다. 바꾸셔도 되요.)
var allowOrigin = "http://192.168.1.1";
1. siteA 로 전달할 message 용 함수를 작성 합니다.
function sendMessage () {
window.parent.postMessage("Hi! Good to see you.", allowOrigin);
}
이 함수를 실행 시키면 siteA 의 postMessageController 가 동작 하게 됩니다.
이 두개 파일의 구조는 siteA.html 에 iframe 으로 siteB.html 을 embedded 시켜놓은 구조 입니다.
<html>
<head>
<title>siteA.html</title>
</head>
<body style="background:#000000;">
<iframe name="siteB" id="siteB" src="http://192.168.2.1/siteB.html" border="0" frameborder="0" width="320" height="48" scrolling="no"></iframe>
</body>
</html>
위의 샘플 pseudo code 는 siteB 에서 siteA 로 메시지를 전달 하는 예 입니다.
그렇기 때문에 siteA 에서 siteB 로 메시지를 전달하고 싶을 경우는 siteB 에 event 등록해 주시고 siteA 에서 iframe 의 window 객체를 얻어서 postMessage 를 실행 시키시면 됩니다.
모바일 웹 : navigator.geolocation 이용하기.
ITWeb/개발일반 2011. 10. 24. 10:22지원 브라우저는 safari, firefox, chrome 에서 지원됨.
<html>
<head>
<script>
function successCallback(position) {
alert(position.coords.latitude + " : " + position.coords.longitude);
}
function errorCallback(error) {
alert(error.message);
}
function load(){
if ( navigator.geolocation ) {
navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
} else {
alert("geolocation not supported");
}
}
</script>
</head>
<body onload="load()">
</body>
</html>
크롬에서 로컬 파일 실행 시켜서 테스트 했더니 주소창에 "위치추적이 차단 되었습니다." 라고 아이콘 뜨고 안됩니다.
서버에 올려서 테스트 하시면 "허용/차단" 버튼 나오면서 정상 동작 확인 가능 합니다.
successCallback, errorCallback 함수 등에 대해서는
기본 위의 참고URL 가셔서 spec 문서 한번 읽어 보시면 쉽게 이해 되실 거예요.