<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="ko"><title type="text">Firejune</title><link rel="alternate" type="text/html" href="http://firejune.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/firejune" /><subtitle type="html">이 사이트는 IT, 웹개발, 자바스크립트, 웹 프로그래밍, 웹2.0, 웹 애플리케이션 등에 대한 내용을 다룹니다.</subtitle><logo>http://firejune.com/attach/image/441618.jpg</logo><updated>1970-01-01T00:00:00+00:00</updated><generator>Tatter Tools Hybrid</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/firejune" /><feedburner:info uri="firejune" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><title type="text">클라우드9 IDE 0.7.x 업데이트와 애플리케이션 모드</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/_HsyvVFcapw/1746" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="IDE" /><category term="Cloud9" /><category term="업데이트" /><category term="클라우드9" /><category term="애플리케이션 바로가기" /><category term="맥OS" /><category term="크롬" /><category term="Node.JS" /><category term="NPM" /><category term="Sourcemint" /><category term="Dependency" /><author><name>파이어준</name></author><updated>2012-05-13T23:04:49-07:00</updated><id>http://firejune.com/1746</id><content type="html">얼마 전(지난 오월 초) 웹 기반 IDE인 &lt;a href="https://github.com/ajaxorg/cloud9"&gt;클라우드9&lt;/a&gt;(개인 사용자용)의 코드베이스의 아키텍처가 업그레이드되는 대대적인 마이너 업데이트가 있었습니다. 설치방법과 실행방법 그리고 소소하게 UI 등에 변동사항이 있어 주요한 내용을 기록합니다.&lt;br /&gt;
&lt;br /&gt;
0.7.x부터는 자체적으로 빌드해서 사용해 오던 &lt;a href="https://github.com/ajaxorg/node-builds-v4"&gt;node-builds-v4&lt;/a&gt;를 더이상 사용하지 않습니다. 이것은 실행 환경에 문제가 발생하면 대처하기 어려운 부분을 해결한 것입니다. 그래서 Node.JS 0.6.15 이상, NPM 1.1.16 이상을 필요로 합니다. 그리고 sm(Sourcemint)를 이용하여 소스상태를 관리하고 설치 및 갱신 하도록 변경되었습니다. 참고로 &lt;a href="http://sourcemint.com/"&gt;Sourcemint&lt;/a&gt;는 테스트 및 배포를 이롭게 하기 위해 프로젝트를 빌드하는데 필요한 소스와 패키지를 자체적으로 관리하며, 소스 리포지토리에서 설치, 변동 사항 반영 등이 처음부터 끝까지 완전히 자동화된 소프트웨어 구축 환경을 제공합니다.(참 멋진 녀석이군요!)&lt;br /&gt;
&lt;br /&gt;
다음과 같이 간단하게 설치할 수 있습니다:&lt;br /&gt;
&lt;pre class="command"&gt;&lt;code class="command"&gt;# npm install -g sm
# sm clone --dev https://github.com/ajaxorg/cloud9/tree/master cloud9&lt;/code&gt;&lt;/pre&gt;또는&lt;br /&gt;
&lt;pre class="command"&gt;&lt;code class="command"&gt;# git clone https://github.com/ajaxorg/cloud9.git cloud9
# cd cloud9
# sm install&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
그리고 실행합니다:&lt;br /&gt;
&lt;pre class="command"&gt;&lt;code class="command"&gt;# cd cloud9
# bin/cloud9.sh&lt;/code&gt;&lt;/pre&gt;프로젝트 폴더를 지정할 수도 있습니다:&lt;br /&gt;
&lt;pre class="command"&gt;&lt;code class="command"&gt;# bin/cloud9.sh -w ~/git/myproject&lt;/code&gt;&lt;/pre&gt;물론 포트를 변경할 수도 있습니다(기본 포트는 3131):&lt;br /&gt;
&lt;pre class="command"&gt;&lt;code class="command"&gt;# bin/cloud9.sh -p 80&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
아쉽게도 호스트네임(Hostname)은 변경을 할 수 없게 되어있지만 configs/default.js 파일의 20라인부터 다음과 같이 수정해 주면 -h 옵션으로 호스트네임을 변경할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
변경 전:&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;var projectDir = (argv.w &amp;amp;&amp;amp; path.resolve(process.cwd(), argv.w)) || process.cwd();
var fsUrl = "/workspace";

var port = argv.p || process.env.PORT || 3131;

var config = {
    name: "Cloud9",
    tmpdir: __dirname + "/../.architect",
    basePath: __dirname + "/../plugins-server",
    containers: {
        master: {
            title: "Cloud9",
            plugins: [{
                packagePath: "./cloud9.connect",
                port: port,
                host: "localhost"
            }, {
                packagePath: "./cloud9.sourcemint",&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
변경후:&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;var projectDir = (argv.w &amp;amp;&amp;amp; path.resolve(process.cwd(), argv.w)) || process.cwd();
var fsUrl = "/workspace";

var port = argv.p || process.env.PORT || 3131;
var host = argv.h || process.env.HOST || "localhost";

var config = {
    name: "Cloud9",
    tmpdir: __dirname + "/../.architect",
    basePath: __dirname + "/../plugins-server",
    containers: {
        master: {
            title: "Cloud9",
            plugins: [{
                packagePath: "./cloud9.connect",
                port: port,
                host: host
            }, {
                packagePath: "./cloud9.sourcemint",&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
이제 호스트네임 옵션이 활성화 되었습니다:&lt;pre class="command"&gt;&lt;code class="command"&gt;# bin/cloud9.sh -h firejune.io&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
업데이트는 더욱 간단합니다:&lt;br /&gt;
&lt;pre class="command"&gt;&lt;code class="command"&gt;# git pull
# sm update&lt;/code&gt;&lt;/pre&gt;만약 npm에서 디펜던시(Dependency)가 발생하면 이렇게 해결합니다:&lt;br /&gt;
&lt;pre class="command"&gt;&lt;code class="command"&gt;# sm install&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
아래 보이는 화면은 크롬에서 애플리케이션 모드로 작동하는 Cloud9의 모습입니다. 내비게이션 사이드바가 사라진 대신 상단의 도구영역이 활성화되었으며, 메뉴를 자동 숨김 하는 기능 등이 추가되었습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="image-align center"&gt;&lt;img src="http://firejune.cdn2.cafe24.com/attach/0514/120514135015725253/623872.png" width="666" height="381" alt="스크린샷 2012-05-14 오후 2.02.11.png" class="reflect null"/&gt;&lt;/div&gt;&lt;br /&gt;
이번 회사 프로젝트에는 &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt;와 Cloud9 IDE을 도입해서 협업하기로 결정했습니다. Cloud9을 맥OS에 로컬로 설치한 후 백그라운드에서 실행합니다. 그리고 크롬의 애플리케이션 바로가기 기능을 이용해서 Dock에 등록하고 실행하면 브라우저 UI가 모두 사라져 마치 레알(?) 애플리케이션을 실행하는 느낌으로 사용할 수 있습니다. 하지만 아쉽게도 맥OS용 크롬에는 이 기능이 비활성화되어 있기 때문에 Mait Vilbiks씨가 만든 &lt;a href="http://mait.vilbiks.com/files/createGcApp.dmg"&gt;createGcApp.dmg&lt;/a&gt;를 이용하여 바로 가기를 생성할 수 있습니다. :)&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;덧 2012-5-17:&lt;/h4&gt; 맥OSX에서 탭/윈도 닫기의 단축키는 Command + W 이고 컨벤션인데 클라우드9의 "커런트 탭 클로즈" 단축키는 Option(alt) + W로 되어있어 실제 윈도를 닫아버리는 실수를 자주 합니다. 이 단축키를 변경하려면 plugins-client/ext.tabbehaviors/tabbehaviors.js 파일을 열고 35라인을 아래와 같이 수정하면 Command + W 키를 이용하여 현재 탭을 닫을 수 있습니다. 물론 다른 단축키들도 입맛에 맛게 고칠 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
변경 전:&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;        ["closetab", "Option-W", "Ctrl-W", "close the tab that is currently active", "Closing active tab.", function(){ return ide.onLine &amp;amp;&amp;amp; tabEditors.activepage; }],
        ["closealltabs", "Option-Shift-W", "Ctrl-Shift-W", "close all opened tabs", "Closing all tabs.", function(){ return ide.onLine &amp;amp;&amp;amp; tabEditors.activepage; }],
        ["closeallbutme", "Option-Ctrl-W", "Ctrl-Alt-W", "close all opened tabs, but the tab that is currently active", "Closing tabs.", function(){ return ide.onLine &amp;amp;&amp;amp; tabEditors.length &amp;gt; 1 }],&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
변경 후:&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;        ["closetab", "Command-W", "Ctrl-W", "close the tab that is currently active", "Closing active tab.", function(){ return ide.onLine &amp;amp;&amp;amp; tabEditors.activepage; }],
        ["closealltabs", "Command-Shift-W", "Ctrl-Shift-W", "close all opened tabs", "Closing all tabs.", function(){ return ide.onLine &amp;amp;&amp;amp; tabEditors.activepage; }],
        ["closeallbutme", "Command-Ctrl-W", "Ctrl-Alt-W", "close all opened tabs, but the tab that is currently active", "Closing tabs.", function(){ return ide.onLine &amp;amp;&amp;amp; tabEditors.length &amp;gt; 1 }],&lt;/code&gt;&lt;/pre&gt;
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1746#p1746"&gt;Comments(2)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1746"&gt;Hits(1934)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fKKIuVKEx2OjVDCl0WjMNlViciw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fKKIuVKEx2OjVDCl0WjMNlViciw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fKKIuVKEx2OjVDCl0WjMNlViciw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fKKIuVKEx2OjVDCl0WjMNlViciw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/_HsyvVFcapw" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1746</feedburner:origLink></entry><entry><title type="text">데스크탑 업그레이드 - 12번째 에디션</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/WjSlBVoS-g4/1745" /><category term="지름" /><category term="일상" /><category term="데스크탑" /><category term="업그레이드" /><category term="12번째 에디션" /><category term="QX9770" /><category term="GTX560 Ti" /><category term="SLI" /><category term="3D Vision" /><category term="돈없다" /><author><name>파이어준</name></author><updated>2012-05-07T20:05:02-07:00</updated><id>http://firejune.com/1745</id><content type="html">&lt;h3&gt;희망사양(2,802,170원):&lt;/h3&gt;CPU : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1602261&amp;cate_c1=861&amp;cate_c2=873&amp;cate_c3=959&amp;cate_c4=0"&gt;인텔 코어i7-2세대 3820 (샌디브릿지-E)&lt;/a&gt; 쿼드코어/3.6~8 GHz - 365,490원&lt;br /&gt;
GPU : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1639999&amp;cate_c1=861&amp;cate_c2=876&amp;cate_c3=972&amp;cate_c4=0"&gt;이엠텍 HV 지포스 GTX680 Prime Edition D5 2GB&lt;/a&gt;  x 2(SLI) - 1,429,520원&lt;br /&gt;
Motherboard : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1536865&amp;cate_c1=861&amp;cate_c2=875&amp;cate_c3=968&amp;cate_c4=0"&gt;ASUS P9X79 PRO STCOM&lt;/a&gt; 인텔소켓 2011 / X79 - 425,900원&lt;br /&gt;
Memory : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1547990&amp;cate_c1=861&amp;cate_c2=874&amp;cate_c3=11043&amp;cate_c4=0"&gt;G.SKILL DDR3 4G PC3-17000 CL9 RIPJAWS ZH &lt;/a&gt; 2,133MHz x4 - 264,560원&lt;br /&gt;
HDD : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1621509&amp;cate_c1=861&amp;cate_c2=32617&amp;cate_c3=32623&amp;cate_c4=0"&gt;KINGMAX SMP35 Client (120GB)&lt;/a&gt; x 2(RAID 0) - 272,820원&lt;br /&gt;
Power: &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1595309&amp;cate_c1=861&amp;cate_c2=880&amp;cate_c3=997&amp;cate_c4=0"&gt;Skydigital PowerStation2 PS2-500CR&lt;/a&gt; - 43,880원&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;절충사양(2,087,410원):&lt;/h3&gt;CPU : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1602261&amp;cate_c1=861&amp;cate_c2=873&amp;cate_c3=959&amp;cate_c4=0"&gt;인텔 코어i7-2세대 3820 (샌디브릿지-E)&lt;/a&gt; 쿼드코어/3.6~8 GHz - 365,490원&lt;br /&gt;
GPU : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1639999&amp;cate_c1=861&amp;cate_c2=876&amp;cate_c3=972&amp;cate_c4=0"&gt;이엠텍 HV 지포스 GTX680 Prime Edition D5 2GB&lt;/a&gt;  - 714,760원&lt;br /&gt;
Motherboard : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1536865&amp;cate_c1=861&amp;cate_c2=875&amp;cate_c3=968&amp;cate_c4=0"&gt;ASUS P9X79 PRO STCOM&lt;/a&gt; 인텔소켓 2011 / X79 - 425,900원&lt;br /&gt;
Memory : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1547990&amp;cate_c1=861&amp;cate_c2=874&amp;cate_c3=11043&amp;cate_c4=0"&gt;G.SKILL DDR3 4G PC3-17000 CL9 RIPJAWS ZH &lt;/a&gt; 2,133MHz x4 - 264,560원&lt;br /&gt;
HDD : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1621509&amp;cate_c1=861&amp;cate_c2=32617&amp;cate_c3=32623&amp;cate_c4=0"&gt;KINGMAX SMP35 Client (120GB)&lt;/a&gt; x 2(RAID 0) - 272,820원&lt;br /&gt;
Power: &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1595309&amp;cate_c1=861&amp;cate_c2=880&amp;cate_c3=997&amp;cate_c4=0"&gt;Skydigital PowerStation2 PS2-500CR&lt;/a&gt; - 43,880원&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;타협사양(1,934,350원):&lt;/h3&gt;CPU : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1670614&amp;cate_c1=861&amp;cate_c2=873&amp;cate_c3=959&amp;cate_c4=0"&gt;인텔 코어i7-3세대 3770K (아이비브릿지)&lt;/a&gt; 쿼드코어/3.5~9 GHz/650 MHz GPU  - 424,210원&lt;br /&gt;
GPU : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1481887&amp;cate_c1=861&amp;cate_c2=876&amp;cate_c3=972&amp;cate_c4=0"&gt;GIGABYTE 지포스 GTX560 Ti UDV+ Super-Over Edition V2 D5 1GB&lt;/a&gt; x 2 (SLI) - 560,000원&lt;br /&gt;
Motherboard : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1637082&amp;cate_c1=861&amp;cate_c2=875&amp;cate_c3=968&amp;cate_c4=0"&gt;ASUS P8Z77-V DELUXE STCOM&lt;/a&gt; 인텔 소켓1155 / Z77 - 368,880원&lt;br /&gt;
Memory : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1547990&amp;cate_c1=861&amp;cate_c2=874&amp;cate_c3=11043&amp;cate_c4=0"&gt;G.SKILL DDR3 4G PC3-17000 CL9 RIPJAWS ZH &lt;/a&gt; 2,133MHz x4 - 264,560원&lt;br /&gt;
HDD : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1621509&amp;cate_c1=861&amp;cate_c2=32617&amp;cate_c3=32623&amp;cate_c4=0"&gt;KINGMAX SMP35 Client (120GB)&lt;/a&gt; x 2(RAID 0) - 272,820원&lt;br /&gt;
Power: &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1595309&amp;cate_c1=861&amp;cate_c2=880&amp;cate_c3=997&amp;cate_c4=0"&gt;Skydigital PowerStation2 PS2-500CR&lt;/a&gt; - 43,880원&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;업그레이드(1,685,440원):&lt;/h3&gt;CPU: &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;prod_c=1251251&amp;cate_c1=861&amp;cate_c2=873&amp;cate_c3=959&amp;cate_c4=0"&gt;인텔 코어2익스트림 QX9770 (요크필드)&lt;/a&gt; 쿼드/ 4쓰레드/3.2GHz/6MB x2 - 611,100원&lt;br /&gt;
GPU : &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1481887&amp;cate_c1=861&amp;cate_c2=876&amp;cate_c3=972&amp;cate_c4=0"&gt;GIGABYTE 지포스 GTX560 Ti UDV+ Super-Over Edition V2 D5 1GB&lt;/a&gt; x 2 (SLI) - 560,000원&lt;br /&gt;
Memory: &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;prod_c=1138337&amp;cate_c1=861&amp;cate_c2=874&amp;cate_c3=11043&amp;cate_c4=0"&gt;G.SKILL DDR3 8GB PC3-12800 CL7 RIPJAWS &lt;/a&gt; 2Gx4 - 130,080원&lt;br /&gt;
HDD : &lt;a href="http://blog.danawa.com/prod/?blogSection=1&amp;cate_c1=861&amp;cate_c2=32617&amp;cate_c3=32623&amp;cate_c4=0&amp;depth=3&amp;prod_c=1628797"&gt;Axxen Axid 100 series (120GB)&lt;/a&gt; x 2(RAID 0) - 276,280원(가이드 포함)&lt;br /&gt;
Power: &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1595309&amp;cate_c1=861&amp;cate_c2=880&amp;cate_c3=997&amp;cate_c4=0"&gt;Skydigital PowerStation2 PS2-500CR&lt;/a&gt; - 43,880원&lt;br /&gt;
Cooler: &lt;a href="http://blog.danawa.com/prod/?section_m=PC&amp;amp;prod_c=1206375&amp;cate_c1=862&amp;cate_c2=887&amp;cate_c3=13663&amp;cate_c4=0"&gt;잘만 CNPS9900 MAX 블루&lt;/a&gt; - 64,100원&lt;br /&gt;
&lt;br /&gt;
거사(?)를 앞두고 데스크탑 시스템을 업그레이드했습니다. 위 목록은 최고 희망 사양부터 &lt;a href="http://firejune.com/1544"&gt;기존 시스템&lt;/a&gt; 업그레이드까지 두루 검토하였고 결국 가장 저렴하게 성능을 끌어올리는 방법을 택했습니다. 예전 같았으면 여지없이 최고 사양으로 질렀을 텐데 한참을 고심하는 자신이 못내 아쉽더군요. 이번 업그레이드의 테마는 3D Vision입니다. 아직 n당의 3D Vision을 완벽하게 &lt;a href="http://www.nvidia.co.kr/object/3d-vision-system-requirements-kr.html"&gt;지원하는 디스플레이&lt;/a&gt;를 국내에서 구할 수가 없어서 출시를 기다리고 있습니다. CPU와 메모리를 교체하여 FSB 1600 MHz 전송속도를 가지게 했고 GTX560 Ti 그래픽 카드를 SLI로 묶었습니다. CPU는 775소켓의 전설급인 코어2익스트림 QX9770으로 오버클럭이 용이한 녀석입니다. 4년전에 출시된 CPU입니다만 i시리즈 CPU와 견줄만한 성능을 갖추었습니다. 그리고 요즘 SDD 가격이 너무 착해서 120GB 짜리를 두개를 RAID 0으로 구성했고요. 보드만 버텨준다면 앞으로 한 3-4년은 무난하지 않을까 생각합니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1745#p1745"&gt;Comments(10)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1745"&gt;Hits(4730)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zzghoSKcO3FVB_enOkngJ-iGpeA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zzghoSKcO3FVB_enOkngJ-iGpeA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zzghoSKcO3FVB_enOkngJ-iGpeA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zzghoSKcO3FVB_enOkngJ-iGpeA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/WjSlBVoS-g4" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1745</feedburner:origLink></entry><entry><title type="text">CSS 3D Transform 기반의 작은 3D 엔진 - Sprite3D.js</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/L796RzCRe9A/1744" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="CSS" /><category term="3D Transform" /><category term="WebGL" /><category term="3D" /><category term="OpenGL ES" /><category term="시멘틱" /><category term="Sprite3D.js" /><category term="WebKit" /><category term="하드웨어-엑셀레이션" /><category term="모바일 브라우저" /><category term="모바일" /><category term="오징어" /><category term="WebGL은 너무 어려워" /><author><name>파이어준</name></author><updated>2012-04-26T00:26:55-07:00</updated><id>http://firejune.com/1744</id><content type="html">&lt;a href="http://minimal.be/lab/Sprite3D"&gt;Sprite3D.js&lt;/a&gt;는 &lt;a href="http://www.webkit.org/blog/386/3d-transforms/"&gt;CSS 3D Transforms 속성&lt;/a&gt;을 이용하여 3D를 구현하는 작은 자바스크립트 3D 엔진 라이브러리입니다. 체이닝 형식의 섹시한 구문을 사용하여 HTML 요소(&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;)를 간단하게 3D 객체로 래핑할 수 있습니다. CSS 3D Transforms 속성은 태생부터가 하드웨어-엑셀레이션(hardware-acceleration)을 염두에 두어 만들어졌기 때문에 WebGL에 버금가는 성능을 보여줍니다. &lt;br /&gt;
&lt;br /&gt;
다음과 같은 문법으로 3D 객체를 생성합니다.:&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;new Sprite3D()
	.setPosition(x,y,z)
	.setRotation(rx,ry,rz)
	.setClassName('class')
	.update();&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
정말 간단한 3D 메소드들:&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;	setPosition(x,y,z) setX(x) setY(y) setZ(z) 
	move(x,y,z) moveX(x) moveY(y) moveZ(z) 
	setRotation(x,y,z) setRotationX(x) setRotationY(y) setRotationZ(z)
	rotate(x,y,z) rotateX(x) rotateY(y) rotateZ(z)
	setScale(x,y,z) setScaleX(x) setScaleY(y) setScaleZ(z)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;a href="https://www.khronos.org/registry/webgl/specs/1.0/"&gt;WebGL(OpenGL ES 2.0의 자바스크립트 바인딩) 스팩&lt;/a&gt;이 오징어로 보이네요 :)&lt;br /&gt;
&lt;br /&gt;
재미있는 점은 모바일 브라우저에서도 하드웨어 가속이 되는 3D를 구현할 수 있게 된다는 사실입니다.(아직 모바일 브라우저에서는 WebGL이 지원되지 않고 있습니다.) WebGL이 활성화된  &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;요소를 필요로하지 않는다는 얘기죠. 또한, HTML 요소를 그대로 이용하기 때문에 시멘티컬한 웹 페이지를 제공할 수 있게 된다는 것입니다. 검색도 되면서 CSS로 스타일링 할 수 있는 3D 컨텐츠는 좀 매력적이지 않나요? 아래는 Sprite3D.js로 작성된 예제인 &lt;a href="http://sprite3d.minimal.be/Box/"&gt;Carton Box&lt;/a&gt;입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="border: 1px solid #aaa; width: 666px; height: 444px; overflow: hidden;"&gt;&lt;iframe src="http://jsbin.firejune.com/CartonBox/1/" width="666" height="444"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Sprite3D.js는 특정 자바스크립트 라이브러리에 종속적이지 않습니다. 따라서 어떠한 환경에서든지 사용할 수 있으며 MIT Licence이고 WebKit 계열(Chrome, Safari, iOS, Android 4, BlackBerry), Firefox 10 그리고 Internet Explorer 10에서 정상적으로 사용할 수 있습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1744#p1744"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1744"&gt;Hits(10395)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tM8TzzH1ZoWW_W1LI_whWAW77Pk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tM8TzzH1ZoWW_W1LI_whWAW77Pk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tM8TzzH1ZoWW_W1LI_whWAW77Pk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tM8TzzH1ZoWW_W1LI_whWAW77Pk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/L796RzCRe9A" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1744</feedburner:origLink></entry><entry><title type="text">HTML5 History/State API를 이용한 Ajax 히스토리 구현</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/XhOK47jZhI4/1743" /><category term="웹개발" /><category term="자료" /><category term="history.pushState" /><category term="popstate" /><category term="자바스크립트" /><category term="HTML5" /><category term="Fire JS Bin" /><category term="History.js" /><category term="Ajax" /><category term="뒤로 가기" /><category term="시멘틱" /><category term="PHP" /><category term="JSON" /><category term="jQuery" /><category term="History/State API" /><category term="GitHub" /><category term="너무 오랜만에 포스팅했다." /><author><name>파이어준</name></author><updated>2012-04-24T04:09:25-07:00</updated><id>http://firejune.com/1743</id><content type="html">HTML5의 &lt;a href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history"&gt;History/State API&lt;/a&gt;를 이용하여 브라우저의 히스토리를 조작하는 방법에 대해 알아보겠습니다. 그동안 &lt;a href="https://developer.mozilla.org/en/DOM/window.location"&gt;location.hash&lt;/a&gt;로 꾸리 하게 밖에 구현할 수 없었던 브라우저 히스토리를 대체할 수 있는 명세로서, Ajax로 호출한 컨텐츠가 드로잉 된 페이지를 조회한 후 브라우저에서 "뒤로 가기" 버튼을 눌러 다시금 이전 위치로 이동하고 해당 컨텐트를 조회할 수 있게 하는 목적으로 사용할 수 있습니다. 알다시피, 이와 같은 뒤치다꺼리를 하지 않으면 방문객은 우리의  웹 사이트를 무심결에 떠나 버리는 불상사가 발생할 수 있지요. 얼마 전에 소개한 &lt;a href="http://jsbin.firejune.com/"&gt;Customized JS Bin&lt;/a&gt;에 이 명세를 적극적(대부분의 요청에 사용)으로 반영하면서 알아낸 몇 가지 사실들에 대하여 정리해보겠습니다.&lt;br /&gt;
&lt;br /&gt;
비동기(동적으)로 컨텐츠를 갱신할 때 매번 마음 한구석에 남는 응어리는 바로 시멘틱 웹입니다. Ajax로 불러들여 진 컨텐츠가 정적이어(검색되어)야 할 필요성 가장 먼저 판단해야 합니다. 왜냐하면, 이에 따른 추가작업이 필요하거나 구조가 달라지기 때문이죠. 만약 시멘티컬한 환경을 고려한다면 서버-사이드에서 하나의 URL을 각기다른 형식의 데이터로 응답할 필요가 있습니다. 비동기 요청에는 레이아웃을 제외한 갱신영역이나 내용만을 담은 작은 HTML 조각 혹은 JSON과 같은 응답형태를 가지고, 일반적인 요청에는 레이아웃을 포함한 완벽하게 파싱된 정적인 HTML 컨텐트를 응답하는 두 가지를 모두 준비하는 것이 좋습니다.&lt;br /&gt;
&lt;br /&gt;
 A 요소에 &lt;code&gt;href&lt;/code&gt; 속성에는 페이지가 갱신될 주소를 반드시 기입해서 웹 크롤러들이 컨텐츠를 샅샅이 긁어갈 수 있게 하고 클릭을 자바스크립트로 제어하여 Ajax로 요청 및 갱신하는 것이 일반적인 패턴입니다. 하나의 주소에서 응답형태가 다른 컨텐트를 제공하는 것이 마음에 안들지도 모릅니다. 물론 개별적으로 응답형태에 따른 주소를 제공하거나 파라미터를 이용할 수도 있겠지만, 개인적으로 선호하지 않는 방법이기 때문에 개별 주소를 사용하는 방법에 대해서는 생략하겠습니다. 대부분의 서버-사이드 언어는 Ajax 요청인지를 구분할 수 있으며, PHP는 다음과 같은 방법으로 알아냅니다.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php"&gt;&lt;code class="php"&gt;&amp;lt;?php
  $ajax = isset($_SERVER['HTTP_X_REQUESTED_WITH'])
      || (isset($_SERVER['HTTP_ORIGIN']) &amp;amp;&amp;amp; $_SERVER['REQUEST_METHOD'] == 'GET');

  if ($ajax) {
    header("Content-Type: application/json; charset=utf-8");
?&amp;gt;
{
  "title": "Fire JS Bin",
  "url": "http://jsbin.firejune.com",
  "text": "Collaborative playground for web developers."
}
&amp;lt;?php
  } else {
    header('Content-type: text/html; charset=utf-8');
?&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Fire JS Bin&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id="content"&amp;gt;Collaborative playground for web developers.&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&amp;lt;?php
}
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
 JS Bin의 컨텐츠는 코드이기 때문에 검색으로 접근될 확률이 낮습니다만, 기본 설계가 정적인 컨텐츠를 제공하는 형태로 만들어져 있기 때문에 시멘틱한 모습으로 방향을 잡았습니다. History API를 지원하는 브라우저에서는 동일한 주소에서 JSON형식의 데이터만 수신하고 그렇지 않으면 주소창의 주소가 변경되면서 이동합니다. 이제 브라우저 히스토리를 조작해 봅시다.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;  function drawHTML(data, state) {
    if (state) history.pushState(data, data.title, data.url);
    $('#content').html(data.text);
  }

  function requestError(req, state) {
    alert('WTF? ' + state);
    //location.href = this.url;
  }

  $('a').click(function() {
    if (history.pushState) {
      $.getJSON(this.href).success(drawHTML).error(requestError);
      return false;
    }
    return true;
  });&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
범국민 라이브러리인 jQuery를 이용한 간단한 예입니다. A 요소의 클릭을 감시하는 함수는 지원 여부를 구분하여 &lt;code&gt;href&lt;/code&gt;에 명시된 주소로 JSON 요청을 날린후 이벤트 진행을 중단하며 그렇지 않은 경우 A 요소가 정상적으로 클릭 되어 일반적인 주소 이동이 발생하도록 내버려 둡니다. &lt;code&gt;drawHTML&lt;/code&gt; 함수에는 패이지가 갱신될 코드와 &lt;code&gt;history.pushState&lt;/code&gt; 메서드를 호출하는 코드로 구성되어 있습니다. 이 메서드는 3개의 인자를 받는데, 해당 페이지의 상태를 보존하기 위한 데이터와 문서 제목 그리고 해당 페이지의 URL입니다. &lt;code&gt;drawHTML&lt;/code&gt; 함수의 두 번째 &lt;code&gt;state&lt;/code&gt; 인자가 유효한 때에만 실행되며 호출되는 즉시 브라우저의 주소창이 바뀌고 히스토리 스택이 쌓입니다. 여기까지는 쌓기만 한 것입니다. 이제 히스토리가 변경되면 발생하는 이벤트인 &lt;a href="https://developer.mozilla.org/en/DOM/window.onpopstate"&gt;window.onpopstate&lt;/a&gt;를 작성해 봅시다.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;  $(window).bind("popstate", function(event) {
    var data = event.originalEvent.state;
    if (data) drawHTML(data, false);
  });
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
이때 보존해 두었던 데이터를 그대로 캐시처럼 활용함으로써 두 번 다시 서버를 힘들게 하지 않아도 되는 장점이 있습니다. 그리고 &lt;code&gt;drawHTML&lt;/code&gt;의 두번째 인자를 &lt;code&gt;false&lt;/code&gt;로 넘겨 주는 것은 히스토리를 더이상 쌓지 않게 하기 위함입니다. 이미 쌓여있는 녀석을 또 쌓을 필요는 없으니까요. 이외에도 &lt;code&gt;history.replaceState&lt;/code&gt;라는 메서드가 있는데, 해당 주소의 컨텐트가 갱신된 경우에 사용하는 것입니다. 이게 전부에요. 간단하죠? 해시가 아닌 URL이 변경되는 레알 히스토리이면서 Ajax로 신규 컨텐트만 갱신하고 캐시효과도 누릴수 있기 때문에 매우 빠릅니다. 우리가 잘 알고있는 &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt;에서도 슬라이드 효과를 동반한 소스코드 살펴보기 그리고 개시물을 조회하는 곳곳에 이 API를 사용하고 있습니다.&lt;br /&gt;
&lt;br /&gt;
음... History/State API를 지원하지 않는 브라우저에서는 종전과 같이 &lt;code&gt;location.hash&lt;/code&gt;트릭으로 비스무리한 기능을 부가적으로 제공할 수 있습니다. HTML5 History/State API를 모든 브라우저에서 사용 가능하게 하는 &lt;a href="https://github.com/balupton/History.js/"&gt;History.js&lt;/a&gt;도 좋은 대안이 될 수 있을 것아서 적용했다가, JS Bin은 이미 이 해시를 이용하여 에디터의 뷰 활성 상태를 관리하기 때문에 충돌이 발생했고 또한 다소 무거운 느낌이 들어서 바로 제거했습니다. &lt;a href="http://jsbin.firejune.com/"&gt;jsbin.firejune.com&lt;/a&gt;으로 이동해서 컨텐츠와 주소창이 변경되는 모습을 직접 확인해보세요. 참 그리고 커스터마이즈한 JS Bin도 많이 진척되었습니다. 관심 있으신 분들은 &lt;a href="http://jsbin.firejune.com/ReleaseNote/"&gt;릴리즈 노트&lt;/a&gt;도 함께 봐주세요. &lt;a href="http://firejune.com/1742/JSBin+2.9.8+%EC%BB%A4%EC%8A%A4%ED%86%A0%EB%A7%88%EC%9D%B4%EC%A6%88"&gt;소개글&lt;/a&gt; 이후 자세한 변동내역이 모두 기록되어 있습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1743#p1743"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1743"&gt;Hits(9907)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HkPIFfzR5zqbycy9QvA0powO9D4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HkPIFfzR5zqbycy9QvA0powO9D4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HkPIFfzR5zqbycy9QvA0powO9D4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HkPIFfzR5zqbycy9QvA0powO9D4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/XhOK47jZhI4" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1743</feedburner:origLink></entry><entry><title type="text">JSBin 2.9.8 커스토마이즈</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/Qjntpeci7MI/1742" /><category term="웹개발" /><category term="자료" /><category term="JSBin" /><category term="커스토마이즈" /><category term="자바스크립트" /><category term="CSS3" /><category term="HTML5" /><category term="WebKit" /><category term="2.9.8" /><category term="CODA" /><category term="Apprise" /><category term="CodeMirror2" /><category term="Ajax 히스토리" /><category term="Minifier" /><category term="Beautifier" /><category term="트위터" /><category term="프로젝트" /><category term="jQuery" /><category term="Closure Compiler" /><author><name>파이어준</name></author><updated>2012-03-14T09:42:33-07:00</updated><id>http://firejune.com/1742</id><content type="html">&lt;div class="image-align center"&gt;&lt;a href="http://jsbin.firejune.com/"&gt;&lt;img src="http://firejune.cdn2.cafe24.com/attach/0315/120315011822691054/465571.png" width="664" height="345" alt="jsbin.png" class="reflect hasborder"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
그동한 소스분석 용도로 잘 사용해 오던 &lt;a href="http://firejune.com/1627/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8+%ED%98%91%EC%97%85+%EB%8F%84%EA%B5%AC+JS+Bin+%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0"&gt;JSBin&lt;/a&gt;을 새로운 버전으로 업데이트 하려다가 커스토마이즈 하는 기쁨에 쉼취해 회사일도 마다하고 최근 3주간 &lt;a href="http://jsbin.firejune.com/"&gt;불꽃 코딩을 작렬&lt;/a&gt;했습니다. 애용중인 맥용 소스코드 편집기인 Panic사의 &lt;a href="http://www.panic.com/coda/"&gt;코다&lt;/a&gt;에 영감을 얻어 웹기반으로 연출하려고 소스를 재작성한 것입니다. 이제 얼추 모습을 갖추어 그동안의 커스토마이즈 내역을 기록하고자 합니다. &lt;a href="http://jsbin.com/"&gt;기존 JSBin&lt;/a&gt;에 새로운 피쳐들을 여럿 추가했습니다. 레이아웃 리프레시, 편집, 보기, 저장소 도구를 상호작용 컨텍스트 메뉴로 리그룹, 저장소 이름 설정, 트위터 인증을 통한 저장소 관리 및 협업, &lt;a href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history"&gt;히스토리를 지원&lt;/a&gt;하는 Ajax 데이터 CRUD, CSS 편집 지원, 편집기(&lt;a href="http://codemirror.net/"&gt;CodeMirror2&lt;/a&gt;) 환경 설정 및 테마 설정, 단축키 지원 확대, CSS3 기반(애니메이션, 웹폰트 아이콘 사용 노 이미지), 상태바, 문자열 찾기 및 찾아 바꾸기, &lt;a href="http://code.google.com/p/minify/"&gt;Minifier&lt;/a&gt; 및 &lt;a href="http://jsbeautifier.org/"&gt;Beautifier&lt;/a&gt;‎ 내장 및 북마클릿 생성 도구, &lt;a href="https://developers.google.com/closure/compiler/"&gt;Closure Compiler&lt;/a&gt; 도구 제공, 매치 하이라이터, 커서위치 표시기, &lt;a href="http://www.webkit.org/blog/363/styling-scrollbars/"&gt;씬 스크롤러&lt;/a&gt;, 패널별 단축 메뉴, 저장소 문자열 검색 및 패널 보임/숨김, 모든 상황을 로컬 스토리지에 보존 등이 주요한 내용입니다. WebKit 계열 브라우저를 중심으로 작업했기 때문에 타 브라우저에서는 오작동이 발생할 수 있으며, 일부 기능(다이얼로그(&lt;a href="http://thrivingkings.com/apprise/"&gt;Apprise&lt;/a&gt;), 서체 크기 조정, 코드 폴딩, 자동 완성, 코드 힌트, SNS 공유, 커밋 및 포크 추적, Diff 도구 등)은 아직 미구현 상태입니다. &lt;a href="http://jsbin.firejune.com/"&gt;jsbin.firejune.com&lt;/a&gt;에서 직접 경험해 보세요.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1742#p1742"&gt;Comments(4)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1742"&gt;Hits(24043)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IV99uqxvMr87QmWfYcfE9rsn4c8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IV99uqxvMr87QmWfYcfE9rsn4c8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IV99uqxvMr87QmWfYcfE9rsn4c8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IV99uqxvMr87QmWfYcfE9rsn4c8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/Qjntpeci7MI" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1742</feedburner:origLink></entry><entry><title type="text">HTML5 Canvas 기반 이미지 비교 - JS-ImageDiff</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/Hs66C2XO_J0/1741" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="HTML5" /><category term="github" /><category term="JS-ImageDiff" /><category term="Canvas" /><category term="GitHub" /><author><name>파이어준</name></author><updated>2012-02-27T13:41:24-08:00</updated><id>http://firejune.com/1741</id><content type="html">얼마 전 &lt;a href="http://www.humblesoftware.com/flotr2/index"&gt;Flotr2&lt;/a&gt;를 배포한 &lt;a href="http://www.humblesoftware.com/"&gt;Humble software development&lt;/a&gt;에서 만든  &lt;a href="http://humblesoftware.github.com/js-imagediff/"&gt;JS-ImageDiff&lt;/a&gt;는 HTML5 Canvas 요소를 이용하여 이미지의 변동사항을 비교할 수 있게 하는 자바스크립트로 작성된 작은 유틸리티입니다. Node.JS용으로도 배포되었으며 사용법과 실행 결과는 다음과 같습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;var a = new Image()
  , b = new Image()
  , count = 0
  , canvas, context, c;

a.onload = b.onload = function () {
  count++;
  
  // Both images have loaded.
  if (count &amp;gt;= 2) {
    canvas = imagediff.createCanvas();
    canvas.width = 200;
    canvas.height = 200;
    context = canvas.getContext('2d');
    c = imagediff.diff(a, b);
    context.putImageData(c, 0, 0);
    document.body.appendChild(canvas);
  }
};

a.src = '/image/a.jpg';
b.src = '/image/b.jpg';

document.body.appendChild(a);
document.body.appendChild(b);&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;

&lt;div id="demo"&gt;&lt;/div&gt;

&lt;style&gt;
div.example { margin: 24px 0 32px 0; overflow: hidden }
div.label { width: 200px; display: inline-block; text-align: center; }
div.label-a { margin-left: 5px; }
div.separator { width: 18px; display: inline-block; text-align: center; }
div.image {
  width: 200px; height: 200px; margin: 0 18px 6px 0;
  border: 1px solid #999; display: block; float: left;
}
div.example.transparency div.image-b,
div.example.transparency div.image-c {
  background: url('data:image/gif;base64,R0lGODlhDAAMAKECAGZmZpmZmf///////yH5BAEKAAIALAAAAAAMAAwAAAIWjA+ph5ps3IMSwFBvzVRq3zmfGC5QAQA7') 6px 0px;
}&lt;/style&gt;
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1741#p1741"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1741"&gt;Hits(26376)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CqBSvJNpmXb7sToP8OJ1tUu9EDk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CqBSvJNpmXb7sToP8OJ1tUu9EDk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CqBSvJNpmXb7sToP8OJ1tUu9EDk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CqBSvJNpmXb7sToP8OJ1tUu9EDk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/Hs66C2XO_J0" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1741</feedburner:origLink></entry><entry><title type="text">IE 버전에 따른 하위 호환성을 HTML만으로 구분</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/9cM1H9NHoIw/1740" /><category term="웹개발" /><category term="자료" /><category term="IE" /><category term="호환성" /><category term="버전" /><category term="HTML" /><category term="스타일시트" /><category term="조건부 주석" /><category term="뭣이? 이미 알고 있다고?!" /><author><name>파이어준</name></author><updated>2012-02-25T02:26:31-08:00</updated><id>http://firejune.com/1740</id><content type="html">하위 버전 의존도가 높은 IE에서 호환성을 유지하기 위해 다양한 방법의 트릭들으로 스타일을 유지해 왔습니다. IE 관련 스타일 이슈들이 디펙되어 가는 모습은 마치 개임속의 몹을 잡는듯한 희열을 안겨주지만, 스파게티가 되어가는 코드들을 짜고 앉아 있자니 마음 한구석이 짠해지는 경험을 이 바닥에 있는 분이라면 다들 경험해 보셨을 거란 생각을 합니다. 기획자분이 불현듯 출현해 졸라 미안한 표정으로 "IE6 하위 호환성은 이제 우리도 포기한대요."라는 대사를 칠까 봐 두렵기까지 합니다. 시맨틱이고 나발이고 밑바닥부터 다시 재작성해야 할 공산이 크니까요. 이러한 상황에 대응하기 적합한 새로운 트릭이 있어 여기에 공유합니다. 바로 조건부 주석을 십분 활용하는 것이죠.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="html"&gt;&lt;code class="html"&gt;&amp;lt;!--[if lt IE 7 ]&amp;gt;&amp;lt;body class="source ie ie6"&amp;gt;&amp;lt;![endif]--&amp;gt; 
&amp;lt;!--[if lt IE 8 ]&amp;gt;&amp;lt;body class="source ie ie7"&amp;gt;&amp;lt;![endif]--&amp;gt; 
&amp;lt;!--[if gte IE 8 ]&amp;gt;&amp;lt;body class="source ie"&amp;gt;&amp;lt;![endif]--&amp;gt; 
&amp;lt;!--[if !IE]&amp;gt;&amp;lt;!--&amp;gt;&amp;lt;body class="source"&amp;gt;&amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
이 코드는 body 요소에 IE 버전을 구분할 수 있는 클래스 이름을 지정하여 CSS 핵으로 떡칠이 되어있는 스타일 시트를 이제 클래스 이름만으로 깔끔하게 구분할 수 있게 되었습니다. 하지만 IE 계열 브라우저에서만 사용되는 코드들 때문에 불필요한 로딩지연으로 선량한 브라우저들이 피해를 받는다고요?&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="html"&gt;&lt;code class="html"&gt;&amp;lt;link rel="stylesheet" href="/css/style.css" type="text/css" /&amp;gt;
&amp;lt;!--[if lt IE 7 ]&amp;gt;&amp;lt;link rel="stylesheet" href="/css/ie6.css" type="text/css" /&amp;gt;&amp;lt;![endif]--&amp;gt; 
&amp;lt;!--[if lt IE 8 ]&amp;gt;&amp;lt;link rel="stylesheet" href="/css/ie7.css" type="text/css" /&amp;gt;&amp;lt;![endif]--&amp;gt; 
&amp;lt;!--[if gte IE 8 ]&amp;gt;&amp;lt;link rel="stylesheet" href="/css/ie8.css" type="text/css" /&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
요렇게 하면 아예 버전별로 스타일을 구분하여 로드할 수 있습니다. IE6 호환성을 해제하려면 ie6.css만 제거하는 것으로 간단하게 해결되지요. 물론, 더 응용하면 하위 IE가 아니거나 하위 버전에서만 필요로 하는 자바스크립트 컴포넌트나 모듈을 구분하여 작성하고 위와 같이 로드할 수도 있겠습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1740#p1740"&gt;Comments(1)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1740"&gt;Hits(25862)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PZZ__yOMFj7-_rhWjd75NoWhETk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PZZ__yOMFj7-_rhWjd75NoWhETk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PZZ__yOMFj7-_rhWjd75NoWhETk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PZZ__yOMFj7-_rhWjd75NoWhETk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/9cM1H9NHoIw" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1740</feedburner:origLink></entry><entry><title type="text">Dropbox 무료계정 용량 늘리기 대행 - 라이프해커 2.0</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/B29RnMkv2Ds/1738" /><category term="정보" /><category term="라이프해커 2.0" /><category term="드랍박스" /><category term="용량 늘리기" /><category term="대행" /><category term="평생" /><category term="영구적" /><category term="Dropbox" /><category term="드롭박스" /><category term="무조건 이득" /><category term="Edu 인증" /><category term="$7.50" /><category term="PayPal" /><category term="찌질하게 시리" /><category term="2년 동안 사람들 꾀어서 8기가 늘려놓은 시간이 졸 아깝다 ㅅㅂ" /><author><name>파이어준</name></author><updated>2012-02-23T08:24:39-08:00</updated><id>http://firejune.com/1738</id><content type="html">&lt;a href="http://geek2live.org/archives/2365"&gt;&lt;img src="http://firejune.com/attach/0224/120224010016473023/212946.png" width="666" alt="스크린샷 2012-02-24 오전 12.59.48.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;라이프해커 2.0에서 제공하는 서비스:&lt;/h3&gt;&lt;br /&gt;
1) &lt;strong&gt;Dropbox 무료계정&lt;/strong&gt;:  무료 계정은 현재 용량이 얼마인지와  상관없이 가장 빠른 시간내에 최종 용량을 미니멈 18GB까지 확장시켜 드립니다. 오다가 접수된후 용량이 18GB까지 늘어나는데 소요되는 시간은 일반적으로 48시간을 초과하지 않습니다. 드롭박스의 기타 이벤트와 베타 테스트에 미리 참여하셨던 일부 고객분들은, 저희 서비스를 이용하셔서 최종 용량을 20GB ~ 24GB(무료 계정)로 만드셨습니다. 아무튼, 저희는 여러분들의 현재 용량/이벤트 참여여부와 상관없이, Dropbox에서 주는 16GB의 보너스용량 미만부분을 모두 채워 드립니다.  &lt;br /&gt;
&lt;br /&gt;
2) &lt;strong&gt;Dropbox Pro 계정&lt;/strong&gt;:  유료 서비스 사용자는 저희를 통해, 최고로 32GB의 용량을 별도로 얻으실 수 있으며, 나중에 유료 서비스를 해제하실 경우에도 32GB의 용량을 계속 무료로 사용하실 수 있게 되십니다. 유료계정의 서비스는 별도의 채널을 통해서 진행되기에, 이 곳에서 미리 선결재를 하지 마시고 &lt;a href="mailto:lifehacker3.0+Pro@gmail.com"&gt;lifehacker3.0+Pro@gmail.com&lt;/a&gt;으로 이메일을 보내셔서 요구되는 자료와 가격 및 결재방법을 확인하신후 진행 부탁드립니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;관련 참고 링크:&lt;/h3&gt;&lt;br /&gt;
&lt;ul class="square"&gt;
  &lt;li&gt;&lt;strong&gt;무료계정 용량 늘리기 대행: &lt;a href="http://geek2live.org/archives/2365"&gt;http://geek2live.org/archives/2365&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Dropbox의 보너스 용량 방침: dropbox.com/help/200&lt;/li&gt;
  &lt;li&gt;현재 자신의 Dropbox 용량 확인: dropbox.com/account&lt;/li&gt;
  &lt;li&gt;드롭박스 리퍼롤 현황 기입요구 사항: &lt;a href="http://goo.gl/Xbli2"&gt;http://goo.gl/Xbli2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
위 첨부한 화면은 제 드랍박스의 무료계정 정보입니다. 야매 냄새가 물씬 풍기는 것이, 언제 중단될지 모르니 서두르는게 좋겠네요. 이건 시간투자 대비 무조건 이득입니다. 드랍박스를 사랑하고 $7.50(&lt;a href="https://www.paypal.com"&gt;PayPal&lt;/a&gt;)이 아깝지 않은 대인배(?)시라면 &lt;a href="http://geek2live.org/archives/2365"&gt;&lt;strong&gt;지금 당장 신청&lt;/strong&gt;&lt;/a&gt;하세요~ ^^
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1738#p1738"&gt;Comments(1)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1738"&gt;Hits(16277)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JevNIxmMPFJNTTrnloukAqh-z2Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JevNIxmMPFJNTTrnloukAqh-z2Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JevNIxmMPFJNTTrnloukAqh-z2Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JevNIxmMPFJNTTrnloukAqh-z2Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/B29RnMkv2Ds" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1738</feedburner:origLink></entry><entry><title type="text">내용이 긴 싱글 페이지의 멋진 전환효과 - Curtain.js</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/413hEa_xbPY/1737" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="jQuery" /><category term="Curtain.js" /><category term="전환효과" /><category term="싱글 페이지" /><category term="날로먹기" /><category term="인터랙티브" /><author><name>파이어준</name></author><updated>2012-02-14T09:01:03-08:00</updated><id>http://firejune.com/1737</id><content type="html">&lt;div class="image-align center"&gt;&lt;a href="http://curtain.victorcoulon.fr" title=""&gt;&lt;img src="http://firejune.cdn2.cafe24.com/attach/0215/120215013019774493/706778.png" width="643" alt="curtain.png" class="centered hasborder"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Victor Coulon씨가 작성한 &lt;a href="http://curtain.victorcoulon.fr"&gt;Curtain.js&lt;/a&gt;는 긴 내용을 다루는 싱글 페이지로 구성된 웹 페이지에 멋진 전환 효과를 부여하는 jQuery 플러그인입니다. 문서의 섹션을 패널들로 화면에 고정하고 해당 패널을 스크롤 하면 마치 커튼이 타고 올라가는 듯한 페이지 전환효과가 발생합니다. 스크롤 바나 마우스 휠 또는 키보드를 이용하는 종전의 관습을 그대로 따르기 때문에 사용자에게 혼란을 일으키지 않으면서 마치 상호작용이 발생하는 듯 한 전환 효과를 만들어낼 수 있습니다. 기본적인 사용방법은 다음과 같아요.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;$(function () {
    $('.curtains').curtain({
        scrollSpeed: 600,
        menu: $('.menu')
    });
});&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Victor Coulon씨는 &lt;a href="http://editsquarterly.com/"&gt;Edits Quarterly&lt;/a&gt;와 &lt;a href="http://www.interviewmagazine.com/"&gt;interviewmagazine.com&lt;/a&gt;, &lt;a href="http://madebygrave.com/"&gt;madebygrave.com&lt;/a&gt; 등의 사이트에서 영감을 얻었다고 말했으며 이 소스를 누구나 사용할 수 있도록 소스를 &lt;a href="https://github.com/Victa/curtain.js"&gt;GitHub&lt;/a&gt;에 공개했습니다. 트렌디하면서 인터랙티브한 컨텐츠를 제공하는 느낌을 아주 쉽게 날로 먹을 수 있겠군요.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1737#p1737"&gt;Comments(1)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1737"&gt;Hits(10830)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RE6Or6xLZ9w4I2CKr14weRnS32A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RE6Or6xLZ9w4I2CKr14weRnS32A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RE6Or6xLZ9w4I2CKr14weRnS32A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RE6Or6xLZ9w4I2CKr14weRnS32A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/413hEa_xbPY" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1737</feedburner:origLink></entry><entry><title type="text">EVE 온라인 - WebGL 모델 뷰어 서비스 시작</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/oLs2uMhUP50/1736" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="WebGL" /><category term="게임" /><category term="EVE 온라인" /><author><name>파이어준</name></author><updated>2012-02-10T10:26:39-08:00</updated><id>http://firejune.com/1736</id><content type="html">&lt;div class="image-align center"&gt;&lt;a href="http://www.eveonline.com/universe/spaceships/"&gt;&lt;img src="http://firejune.cdn2.cafe24.com/attach/0211/120211025535329042/906727.png" width="640" height="365" alt="eveonline.png" class="reflect null"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href="http://www.eveonline.com/"&gt;EVE 온라인&lt;/a&gt;의 제작자인 CCP 게임은 WebGL을 이용하여 그들의 게임에 등장하는 우주선과 지형 등을 3D로 관찰할 수 있고 관련 정보를 제공하는 &lt;a href="http://www.eveonline.com/universe/spaceships/"&gt;웹페이지&lt;/a&gt;를 서비스하기 시작했습니다. 이제 WebGL을 실제 서비스에 적용하는 사례가 나타나는군요. 아주 훌륭한 쇼케이스입니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1736#p1736"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1736"&gt;Hits(12581)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/K8T56rNn8yxLMm--jazSD7GVRsg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K8T56rNn8yxLMm--jazSD7GVRsg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/K8T56rNn8yxLMm--jazSD7GVRsg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/K8T56rNn8yxLMm--jazSD7GVRsg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/oLs2uMhUP50" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1736</feedburner:origLink></entry><entry><title type="text">파비콘을 이용하여 새소식을 알리는 - Tinycon</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/2ei16PEulg8/1735" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="캔버스" /><category term="Tinycon" /><category term="파비콘" /><category term="급뻘짓" /><author><name>파이어준</name></author><updated>2012-02-07T21:28:44-08:00</updated><id>http://firejune.com/1735</id><content type="html">&lt;a href="http://tommoor.github.com/tinycon/"&gt;Tinycon&lt;/a&gt;은 현재 웹사이트에서 사용 중인 파비콘에 작은 번호를 동적으로 표시되도록 조작하여 사용자에게 새 소식을 알리는 작은 라이브러리입니다. HTML5 캔버스 요소를 지원하는 브라우저에서만 작동합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="image-align center"&gt;&lt;a href="http://tommoor.github.com/tinycon/" title=""&gt;&lt;img src="http://firejune.cdn2.cafe24.com/attach/0208/120208133909496977/616071.png" width="653" alt="tinycon.png" class="centered hasborder"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
구글 지메일, 리더 등과 같은 서비스에서는 새 소식을 알리는 카운트를 동적으로 타이틀 텍스트에 출력하여 사용자에게 확인이 필요함을 시각적으로 알리고 있습니다만 구글의 "탭 고정"이나 파이어폭스에서 "앱 탭" 기능을 사용하면 페이지의 타이틀이 숨고 파비콘만 남게 되어 무용지물입니다. 이러한 경우라면 웹사이트에서 발생한 이벤트를 전달할 때 아주 효과적으로 사용할 수 있는 기막힌 아이디어입니다. &lt;br /&gt;
&lt;br /&gt;
기본적인 사용방법은 다음과 같습니다.&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;Tinycon.setBubble(6);&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
다음과 같은 옵션을 이용하여 사용자화 할 수 있습니다.&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;Tinycon.setOptions({
    width: 7, // the width of the alert bubble
    height: 9, // the height of the alert bubble
    font: '10px arial', // a css string to use for the fontface (recommended to leave this)
    colour: '#ffffff', // the foreground font colour
    background: '#549A2F', // the alert bubble background colour
    fallback: true // should we fallback to a number in brackets for browsers that don't support canvas/dynamic favicons
});&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;del&gt;1초마다 1씩 카운트가 증가하도록 이곳에 적용했습니다. 보이나요?&lt;/del&gt;&lt;br /&gt;
이 사이트를 사용 중인 접속자(활성 사용자) 카운트로 변경했습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1735#p1735"&gt;Comments(2)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1735"&gt;Hits(11693)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uZAvII8b9reK6C3u4BAF9q1MyAI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uZAvII8b9reK6C3u4BAF9q1MyAI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uZAvII8b9reK6C3u4BAF9q1MyAI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uZAvII8b9reK6C3u4BAF9q1MyAI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/2ei16PEulg8" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1735</feedburner:origLink></entry><entry><title type="text">한 문서를 실시간으로 여럿이 동시에 편집하는 - ShareJS</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/Rk2FLxiwgtE/1734" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="Node.JS" /><category term="모듈" /><category term="ShareJS" /><category term="Google Wave" /><category term="Socket.IO" /><category term="Redis" /><category term="Operational Transform" /><category term="운영변환" /><author><name>파이어준</name></author><updated>2012-02-03T14:30:23-08:00</updated><id>http://firejune.com/1734</id><content type="html">Joseph Gentle씨는 &lt;a href="http://en.wikipedia.org/wiki/Operational_transformation"&gt;Operational Transform(운영변환) 알고리즘&lt;/a&gt;을 구현한 &lt;a href="http://nodejs.org/"&gt;Node.JS&lt;/a&gt;용 모듈인 &lt;a href="http://sharejs.org/"&gt;ShareJS&lt;/a&gt;를 배포했습니다. 이 모듈은 여러명의 사용자가 웹브라우저에서 하나의 문서를 실시간으로 동시에 편집 할 수 있는 애플리케이션을 쉽게 구축할 수 있도록 돕는 것이 목적입니다. 그는 운영변환 알고리즘을 제대로 구현하는 것은 아주 어렵고 오랜 시간이 소요된다고 토로했습니다. 이 알고리즘의 핵심은 하나의 문서를 여럿이 동시에 편집해도 충돌이 일어나지 않게하는 구조를 가진다는 것입니다. 그리고 자신을 &lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt; 팀의 엔지니어로 일하면서 2년동안 &lt;a href="https://docs.google.com/present/view?id=dggjrx3s_1573xdhxprd"&gt;연구한 결과&lt;/a&gt;를 ShareJS로 다시 작성한 것이라 밝혔습니다. 이제 여러분도 &lt;a href="http://etherpad.com/"&gt;Etherpad&lt;/a&gt;와 같은 문서 편집 도구를 쉽사리 만들어 낼 수 있게 된 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;sharejs.open('blag', 'text', function(error, doc) {
  var elem = document.getElementById('pad');
  doc.attach_textarea(elem);
});&lt;/code&gt;&lt;/pre&gt;이봐봐... 정말이에요! 단 4줄로 Etherpad 같은 앱을 구현해 버리잖아요.&lt;br /&gt;
&lt;br /&gt;
&lt;div id="editor" style="border: 1px solid #aaa; width: 664px; height: 331px; position: relative;"&gt;&lt;/div&gt;








&lt;br /&gt;
위 데모는 ShareJS의 예제 중 하나인 실시간 협업 코드 편집기입니다. 당신이 지금 편집하고 있는 상황은 이 웹페이지에 접속한 모든 사용자에게 실시간으로 방송됩니다. 물론 동시에 편집하는 것도 가능합니다. 이것은 웹상에서 코드를 편집하기 위한 라이브러리인 &lt;a href="http://ace.ajax.org/"&gt;Ace&lt;/a&gt;(&lt;a href="http://www.cloud9ide.com/"&gt;Cloud9 IDE&lt;/a&gt;에서 사용됨)와 실시간 통신을 위한 &lt;a href="http://socket.io/"&gt;Socket.IO&lt;/a&gt;, 그리고 &lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt; 데이터베이스를 이용하여 마지막 편집 데이터를 영구 보존하도록 만들어졌습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1734#p1734"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1734"&gt;Hits(11305)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KIYIANklsYi0Y-jrVHmQ9b0ug54/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KIYIANklsYi0Y-jrVHmQ9b0ug54/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KIYIANklsYi0Y-jrVHmQ9b0ug54/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KIYIANklsYi0Y-jrVHmQ9b0ug54/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/Rk2FLxiwgtE" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1734</feedburner:origLink></entry><entry><title type="text">D3.js 기반 실시간 시계열 데이터 그래프 - Rickshaw</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/1D7Gzb9KHrg/1733" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="대화형" /><category term="그래프" /><category term="상호작용" /><category term="챠트" /><category term="실시간" /><category term="D3.js" /><category term="Rickshaw" /><category term="시계열 데이터" /><category term="Time-Series" /><category term="Data-Driven" /><author><name>파이어준</name></author><updated>2012-02-01T23:05:28-08:00</updated><id>http://firejune.com/1733</id><content type="html">사진 서비스인 &lt;a href="http://www.shutterstock.com/"&gt;Shutterstock&lt;/a&gt;에서 만든 &lt;a href="http://shutterstock.github.com/rickshaw/"&gt;Rickshaw&lt;/a&gt;는 시계열(Time-Series) 데이터를 웹페이지에 그래프로 그려주는 도구입니다. 히스토리컬 한 정적인 데이터 셋을 실시간으로 지속해서 갱신해 줍니다. 커브, 바, 라인, 퍼센트, 스트림 등의 다양한 그래프를 지원하며 그래프의 특정 구간을 확대하거나 곡선을 단순화 하거나 옵셋을 변경하거나 특정 타임셋에 이벤트를 발생시키고 정보를 조회하는 등의 상호작용이 실시간으로 반영되도록 설계되었습니다.&lt;br /&gt;
&lt;br /&gt;
Rickshaw는 Mike Bostock씨의 &lt;a href="http://mbostock.github.com/d3/"&gt; D3.js&lt;/a&gt;를 래핑하는 형식으로 구축되었으며, D3.js는 데이터 기반 문서(Data-Driven Documents)의 작성을 돕기위한 목적으로 만들어진 작은 라이브러리입니다. 상호작용이 용이하고 데이터의 흐름을 부드러운 애니메이션으로 처리할 수 있도록하여 실시간 데이터를 다루는데 제격입니다. 백번 말하는것보다 한번 보는게 낫겠죠. 이 &lt;a href="http://mbostock.github.com/d3/talk/20110921/"&gt;인터랙티브 슬라이드&lt;/a&gt;를 죽 훓터보세요.&lt;br /&gt;
&lt;br /&gt;
아래 데모는 커스터마이즈 된 것으로 기존 데모의 버그를 수정하고 jQuery 의존성을 제거했으며 스택이 150건이 쌓이면 오래된 순서로 타임셋이 드랍되도록 했습니다. 때마침 시계열 데이터 그래프에서 특정 타임셋에 발생하는 이벤트를 효율적으로 표시할 수 있는 수단을 찾고 있었는데 잘 나와주었네요. 개인적으로 운영하는 &lt;a href="http://firejune.io/"&gt;firejune.io의 실시간 서버 상황&lt;/a&gt;에 에 우선적으로 적용해 볼 예정입니다.&lt;br /&gt;
&lt;br /&gt;

&lt;div id="side_panel"&gt;
  &lt;section id="offsets" class="toggler"&gt;
    &lt;input type="radio" name="offset" id="stack" value="stack" checked&gt;
    &lt;label for="stack"&gt;stack&lt;/label&gt;
    &lt;input type="radio" name="offset" id="percent" value="percent"&gt;
    &lt;label for="percent"&gt;percent&lt;/label&gt;
    &lt;input type="radio" name="offset" id="stream" value="stream"&gt;
    &lt;label for="stream"&gt;stream&lt;/label&gt;
    &lt;input type="radio" name="offset" id="lines" value="lines"&gt;
    &lt;label for="lines"&gt;lines&lt;/label&gt;
  &lt;/section&gt;
  &lt;section id="renderers" class="toggler"&gt;
    &lt;input type="radio" name="renderer" id="stack_renderer" value="curves" checked&gt;
    &lt;label for="stack_renderer"&gt;curves&lt;/label&gt;
    &lt;input type="radio" name="renderer" id="bar_renderer" value="bars"&gt;
    &lt;label for="bar_renderer"&gt;bars&lt;/label&gt;
    &lt;input type="radio" name="renderer" id="step_interpolation" value="step"&gt;
    &lt;label for="step_interpolation"&gt;step&lt;/label&gt;
  &lt;/section&gt;
&lt;/div&gt;

&lt;div id="legend"&gt;&lt;/div&gt;
&lt;div id="chart_container"&gt;
  &lt;div id="chart"&gt;&lt;/div&gt;
  &lt;div id="timeline"&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;link type="text/css" rel="stylesheet" href="/stylesheets/rickshaw.min.css"&gt;
&lt;style&gt;
#chart_container { position: relative; display: inline-block; }
#legend {
  background-color: white; display: inline-block; clear: both;
  vertical-align: top; margin-top: 10px; padding: 0; left: 0;
}
#legend .label { color: #404040; }
#legend .action { color: black; opacity: 0.5; }
#legend ul { padding: 0; }
#legend li { padding: 6px 0; }

#side_panel { margin: 10px 0 20px 94px; }
#offsets { float: left; }
#renderers {}
#timeline { line-height: 18px; text-align: left; }

.toggler { display: block; margin: 0; }
.toggler input[type=radio]:checked {
  outline: 2px solid steelblue;
}
.toggler input[type=radio] {
  margin: 0 7px; width: 39px;
  height: 27px; position: absolute;
  -moz-appearance: button;
}
.toggler input[type=radio]:disabled {
  opacity: 0.5;
}
.toggler label {
  display: inline-block; padding: 0;
  width: 39px; height: 0px; padding-top: 27px;
  text-align: center; font-size: 10px; color: #808080;
  background-repeat: no-repeat; position: relative;
  margin: 0 7px; cursor: pointer;
}

label[for=stack] { background: url(/attach/0202/120202001759880996/945529.png); }
label[for=stream] { background: url(/attach/0202/120202001759880996/697864.png); }
label[for=percent] { background: url(/attach/0202/120202001759880996/943980.png); }
label[for=lines] { background: url(/attach/0202/120202001759880996/104042.png); }
label[for=stack_renderer] { background: url(/attach/0202/120202001759880996/677835.png); }
label[for=bar_renderer] { background: url(/attach/0202/120202001759880996/557999.png); }
label[for=step_interpolation] { background: url(/attach/0202/120202001759880996/802217.png); }
&lt;/style&gt;

 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1733#p1733"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1733"&gt;Hits(36856)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yd6Hktm7u4NMh2vXx30DifjkGOI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yd6Hktm7u4NMh2vXx30DifjkGOI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yd6Hktm7u4NMh2vXx30DifjkGOI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yd6Hktm7u4NMh2vXx30DifjkGOI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/1D7Gzb9KHrg" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1733</feedburner:origLink></entry><entry><title type="text">HTML5 제대로 알고 씁시다! - html5please.us</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/RD95zZOtt_0/1732" /><category term="웹개발" /><category term="자료" /><category term="HTML5" /><category term="CSS3" /><category term="html5please.us" /><category term="polyfill" /><category term="폴리필" /><category term="땜빵" /><category term="크로스-브라우저" /><category term="마음의 벽" /><author><name>파이어준</name></author><updated>2012-01-31T09:28:23-08:00</updated><id>http://firejune.com/1732</id><content type="html">&lt;div class="image-align center"&gt;&lt;a href="http://html5please.us/"&gt;&lt;img src="http://firejune.cdn2.cafe24.com/attach/0201/120201011953124840/346064.png" width="650" height="481" alt="html5please.png" class="reflect hasborder"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
HTML5의 현재 상황을 제대로 알고 사용하자는 취지로 만들어진 웹사이트인 &lt;a href="http://html5please.us/"&gt;html5please.us&lt;/a&gt;는 HTML5와 CSS3 등에서 지원하는 기능들을 찾고, 그것이 사용할 준비가 되어 있는지 알고, 대략적인 개념을 설명하고 있으며, 꼭 필요한 것인지를 판별하고, 필요로 하는 작업을 확정/폴리필(polyfill)/예비로 구분하여 정의하고 있습니다. 추천하는 떔빵(?) 라이브러리 정보도 제공하고 있네요. 그리고 이 웹사이트에 개제된 정보가 잘못되었다고 판단되면 직접 수정하거나 &lt;a href="https://github.com/h5bp/html5please"&gt;GitHub&lt;/a&gt;로 Pull 요청을 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="clear:both;" class="textbox1"&gt;여기에는 듣보잡 단어인 polyfill(폴리필)이라는 신조어가 나오는데 뭔 개소리냐며 지나치다가 하도 눈에 자주 밟혀서 이제야 조사해 보았습니다. "polyfill"이란 최신 브라우저에서는 작동하지만 오래된 브라우저에서는 HTML5 API를 모방하는 자바스크립트 라이브러리 따위의 도움을 받아 정상적으로 작동하도록 대안으로 기능을 구현하는 행위를 의미합니다. 폴리필에 대한 더 자세한 내용은 Remy Sharp씨가 작성한 &lt;a href="http://remysharp.com/2010/10/08/what-is-a-polyfill/"&gt;"What is a Polyfill?"&lt;/a&gt; 포스트를 참고 하세요.&lt;br /&gt;
&lt;br /&gt;
그리고 폴리필하기 위한 라이브러리들의 이름에서 자주 등장하는 단어가 shim(쉠?)인데 "틈 메우는 쐐기, 나무, 쇠, 돌"이란 뜻이 있습니다. 직역하자면 구린 브라우저(또는 브라우저 벤더 지들 끼리 쳐 싸우느라 사용방법이 다르거나 없음)에서 지원하지 않는 어떠한 기능을 땜빵하려는 목적 정도로 이해할 수 있겠네요. &lt;a href="http://www.modernizr.com/"&gt;Modernizr&lt;/a&gt;에서 작성한 &lt;a href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills"&gt;HTML5 Cross Browser Polyfills&lt;/a&gt; 위키 문서에는 폴리필하기 위한 각종 땜질용 라이브러리들이 일목요연하게 정리되어 있으니 이 또한 참고하세요.&lt;/div&gt;
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1732#p1732"&gt;Comments(2)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1732"&gt;Hits(52824)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IftRjt0_MDLN31FpGTOWsgXadjY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IftRjt0_MDLN31FpGTOWsgXadjY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IftRjt0_MDLN31FpGTOWsgXadjY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IftRjt0_MDLN31FpGTOWsgXadjY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/RD95zZOtt_0" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1732</feedburner:origLink></entry><entry><title type="text">자바스크립트가 비활성화 되었다면 리디렉션</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/AKvJq_BVtD0/1731" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="noscript" /><category term="대체 콘텐츠" /><category term="http-equiv" /><category term="트릭" /><category term="enable-javascript.com" /><category term="번역" /><author><name>파이어준</name></author><updated>2012-01-31T01:23:17-08:00</updated><id>http://firejune.com/1731</id><content type="html">이제는 좀처럼 자바스크립트가 없는 웹페이지를 찾아보기 힘들 정도로 자바스크립트는 대중화되었습니다. 그러나 웹브라우저에는 자바스크립트를 비활성화하는 기능이 존재하기 때문에 모든 사용자가 자바스크립트를 사용할 수 있는 환경이라 판단하는 것은 옳지 않습니다.(그딴 사용자는 무시하자고 하는 분이 계시면 마음의 벽을 쌓으시길...) 이런 경우 사용자에게 자바스크립트를 활성화 할 것을 권고하는 등으로 사용하는 요소가 바로 &lt;a href="http://www.w3.org/TR/html5/scripting-1.html#the-noscript-element"&gt;noscript 요소&lt;/a&gt;인데 요녀석을 대체 컨텐츠로 리디렉션하는 트릭이 있어 공유합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="html"&gt;&lt;code class="html"&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="utf-8"&amp;gt;
    &amp;lt;noscript&amp;gt;
      &amp;lt;meta http-equiv="refresh" content="0; url=noscript.html"&amp;gt;
    &amp;lt;/noscript&amp;gt;
    &amp;lt;title&amp;gt;Redirect to a Page for Print if JavaScript is disabled&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
      &amp;lt;h1&amp;gt;Redirect to a Page for Print if JavaScript is disabled&amp;lt;/h1&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;section&amp;gt;
      &amp;lt;p&amp;gt;JavaScript is &amp;lt;em&amp;gt;enabled&amp;lt;/em&amp;gt;.&amp;lt;/p&amp;gt;
    &amp;lt;/section&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
noscript 요소를 head 요소에서 사용하고 meta 요소에 http-equiv속성을 refresh로 설정했습니다. 지정된 시간이 지나면 특정 주소로 이동하는 meta 요소입니다. 위 코드는 자바스크립트를 사용할 수 없는 환경의 사용자를 구분하여 noscript.html로 리디렉션합니다. 이를 응용하면 link 요소와 style 요소등을 응용하여 스타일의 변화를 꾀할 수도 있을 것입니다.(HTML4에서도 작동하는지는 확인하지 못했어요;)&lt;br /&gt;
&lt;br /&gt;
마땅히 리디렉션 시킬 곳이 없다거나 대체 컨텐츠를 만들기 귀찮다면 &lt;a href="http://www.enable-javascript.com"&gt;enable-javascript.com&lt;/a&gt;으로 연결하는 것을 권장합니다. 크로아티아 친구들이 서비스하는 이 웹사이트는 방문객이 자바스크립트의 필요성과 활성화하는 방법을 상세히 설명하는 내용을 다루고 있습니다.(한국어가 없길래 날로 번역해서 넘겨줬더니 발빠르게 &lt;a href="http://www.enable-javascript.com/ko/"&gt;페이지를 추가&lt;/a&gt;해 주더군요. 리소스 작업을 구글닥에서 실시간으로 협업한 Toni씨 반가웠고, 번역에 도움주신 여친님 고마워요. ㅎㅎ)
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1731#p1731"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1731"&gt;Hits(23426)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5KmQDKsKgEwkbp_37rtB7Mylans/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5KmQDKsKgEwkbp_37rtB7Mylans/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5KmQDKsKgEwkbp_37rtB7Mylans/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5KmQDKsKgEwkbp_37rtB7Mylans/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/AKvJq_BVtD0" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1731</feedburner:origLink></entry><entry><title type="text">인상적인 오디오 신디사이저 - Morning Star Synth</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/ucyvgfWN-L0/1730" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="HTML5" /><category term="Morning Start Synth" /><category term="오디오" /><category term="신디사이저" /><category term="Monophonic Bassline" /><author><name>파이어준</name></author><updated>2012-01-30T12:37:04-08:00</updated><id>http://firejune.com/1730</id><content type="html">&lt;div class="image-align center"&gt;&lt;a href="http://bitterspring.net/ms/morningstar/"&gt;&lt;img src="http://firejune.cdn2.cafe24.com/attach/0131/120131044550819878/331001.png" width="650" height="406" alt="morningstar.png" class="reflect null"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Cristiano Belloni씨는 순수 HTML5만을 이용하여 스텝 시퀸서에 의해 제어되는 &lt;a href="http://blog.dubspot.com/moog-minitaur-the-new-tabletop-monophonic-bass-synth-namm-2012/"&gt;Monophonic Bassline&lt;/a&gt; 신디사이저인 &lt;a href="http://bitterspring.net/ms/morningstar/"&gt;Morning Star&lt;/a&gt;를 만들었습니다. 모질라가 밀고있는 &lt;a href="https://wiki.mozilla.org/Audio_Data_API"&gt;Audio Data API&lt;/a&gt;와 구글이 밀고있는 &lt;a href="https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html"&gt;Web Audio API&lt;/a&gt;를 모두 지원하는 &lt;a href="http://kievii.net/"&gt;KievII&lt;/a&gt; 라이브러리를 사용했습니다. 이 라이브러리 역시 Cristiano Belloni씨가 배포한 것으로, 오디오 DSP 뿐만 아니라 다양한 GUI 요소들까지도 포함하고 있습니다. 손잡이(knobs), 슬라이더 등은 캔버스 요소로 만들어 졌으며, 전체 UI가 하나의 캔버스 요소입니다.&lt;br /&gt;
&lt;br /&gt;
신디사이저 자체에는 스탭 편집, 피아노 롤, 페턴 제어, 녹음 및 재생, 다양한 효과들 등, 아주 많은 기능을 포함하고 있습니다. 사용자의 마지막 변동 사항을 자동으로 localStorage에 저장하여 편집 도중 브라우저를 닫았다 열어도 계속해서 작업을 이어나갈 수 있습니다. 또한 자신이 작업한 음악을 URL로 내보낼수 있어 친구와 협업하는 것도 가능하다고 합니다. 보다 자세한 정보는 &lt;a href="http://bitterspring.net/blog/2012/01/25/morning-star-synth-0-1-released/"&gt;Cristiano Belloni씨의 블로그에 작성&lt;/a&gt;되어 있으며, 소스코드는 &lt;a href="https://github.com/janesconference/MorningStar"&gt;Github에 공개&lt;/a&gt;했습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1730#p1730"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1730"&gt;Hits(17133)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5OdoVrBWqDs2dqCruVhUktKcdBg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5OdoVrBWqDs2dqCruVhUktKcdBg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5OdoVrBWqDs2dqCruVhUktKcdBg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5OdoVrBWqDs2dqCruVhUktKcdBg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/ucyvgfWN-L0" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1730</feedburner:origLink></entry><entry><title type="text">WebRTC 데모 - 포토부스 스타일 라이브 비디오 이펙츠</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/gIDA2PeRcT8/1728" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="WebGL" /><category term="포토부스" /><category term="getUserMedia" /><category term="웹캠" /><category term="WebRTC" /><category term="구글은 참 무섭습니다." /><author><name>파이어준</name></author><updated>2012-01-29T12:38:37-08:00</updated><id>http://firejune.com/1728</id><content type="html">애플의 기본 프로그램인 &lt;a href="http://www.apple.com/kr/ipad/built-in-apps/photobooth.html"&gt;포토부스&lt;/a&gt;의 멋진 그래픽 필터 효과들을 사용해 본 경험이 있으세요? Paul Neave씨는 브라우저만으로 이와 유사한 기능을 제공하는 &lt;a href="http://neave.com/webcam/html5/"&gt;HTML5 비디오 이펙츠 데모&lt;/a&gt;를 선보였습니다. 아쉽게도, 지금 출시된 브라우저들은 플래시를 이용하지 않는 한 웹캠을 사용할 수 있는 방법이 없지만, 최근 구글 크롬은 &lt;a href="http://tools.google.com/dlpage/chromesxs"&gt;차기 버전(코드네임 카나리아)&lt;/a&gt;에 들어갈 핵심기능인 &lt;a href="http://www.webrtc.org/"&gt;WebRTC(Web Real-Time Communications)&lt;/a&gt; API의 getUserMedia를 이용하여 이 데모를 정상적으로 수행해 볼 수 있습니다. 카나리아를 구하는 방법과 설정하는 방법은 조금있다가 살펴 보기로 하고요. 이 데모에 포함된 비디오에 실시간으로 반영되는 효과들은 자바스크립트와 WebGL을 이용한 것입니다. 대략 살펴 보면, HTML5의 비디오 요소에서 얻어낸 아웃풋 데이터를 캔버스 요소로 불러와서 WebGL의 쉐이더 효과를 입힌 것입니다. 포토부스와 유사한 카운트가 나타나면서 스냅샷을 찍을 수 있고 찍은 사진을 소셜 네트워크에 공유하거나 다운로드 할 수 있습니다. 정말 멋지지 않아요?&lt;br /&gt;
&lt;br /&gt;
&lt;div class="image-align center"&gt;&lt;a href="http://neave.com/webcam/html5/" title=""&gt;&lt;img src="http://firejune.cdn2.cafe24.com/attach/0130/120130024501287808/119058.png" width="664" alt="videoeffects.png" class="centered hasborder"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
만약 getUserMedia가 활성 되지 않은 경우 별도로 준비된 동영상이 나타나며 여러 그래픽 효과들만 실험해 볼 수 있습니다. 웹캠과 연동하여 태스트하려면 조금 복잡한 과정을 거쳐야 합니다. 앞서 말씀드린 크롬의 카나리아 버전을 설치한 후에 실행 옵션을 주어야 하는데, 윈도 버전은 속성창을 열어 대상란의 쌍따옴표(")뒤에 "--enable-media-stream" 이라고 작성해 주어야 하고 맥용은 다음과 같이 실행합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="command"&gt;&lt;code class="command"&gt;open -a "/Applications/Google Chrome Canary.app" --args --enable-media-stream&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
그리고 주소창에 "chrome://flags"를 입력하여 나타난 옵션 패널에서 "Media Stream Flag"를 활성시키고 재시작 합니다. 보다 자세한 사용법은 &lt;a href="http://www.webrtc.org/running-the-demos"&gt;이 곳&lt;/a&gt;에 있으니 참고하세요. 최대 100fps까지 확보되며 안정적으로 작동하는 것을 확인하였습니다. &lt;a href="http://www.apple.com/kr/mac/facetime/"&gt;페이스타임&lt;/a&gt;과 같은 웹앱이 나오는 것도 이제 시간문제로군요. 떨거지들이 어영부영 만든 블라블라 API의 웃는 얼굴에 침이라도 뱉듯이 종지부를 찍어버리는 구글은 참 무섭습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1728#p1728"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1728"&gt;Hits(39093)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZVhmTcHUAF7UY-GyRawacX5kKik/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZVhmTcHUAF7UY-GyRawacX5kKik/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZVhmTcHUAF7UY-GyRawacX5kKik/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZVhmTcHUAF7UY-GyRawacX5kKik/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/gIDA2PeRcT8" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1728</feedburner:origLink></entry><entry><title type="text">Clog 버전 0.1.2 업데이트 릴리즈</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/tjOxExNwA_A/1727" /><category term="웹개발" /><category term="자료" /><category term="Node.JS" /><category term="모듈" /><category term="배포" /><category term="업데이트" /><category term="컬러풀" /><category term="콘솔" /><category term="디버깅" /><category term="업데이트는 당분간 이걸로 땡" /><category term="GitHub" /><category term="프로젝트" /><author><name>파이어준</name></author><updated>2012-01-16T00:30:03-08:00</updated><id>http://firejune.com/1727</id><content type="html">머리털나고 처음으로 배포했던 &lt;a href="http://nodejs.org/"&gt;Node.JS&lt;/a&gt;용 모듈인 &lt;a href="http://firejune.com/1701/Node.JS%EC%97%90%EC%84%9C+%EC%BB%AC%EB%9F%AC%ED%92%80%ED%95%9C+%EC%BD%98%EC%86%94+%EB%94%94%EB%B2%84%EA%B9%85%EC%9D%84+-+Clog+%EB%B0%B0%ED%8F%AC"&gt;Clog&lt;/a&gt;를 0.1.2 버전으로 업데이트했습니다. 이 마이너 업데이트는 종전과 로그 출력방법이 동일하며 새롭게 &lt;code&gt;configure&lt;/code&gt; 메서드가 추가되었습니다. 이 메서드를 이용하면 콘솔의 유형 단위로 로그를 필터링 할 수 있습니다. 사용 방법은 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;var clog = require('clog');

// display level configration:
clog.configure({'log level': 2});
//=&amp;gt; {'log': true, 'info': true, 'warn': false, 'error': false, 'debug': false}

// custom display level configration:
clog.configure({
  'log level': {
    'log': true,
    'info': true,
    'warn': false,
    'error': true,
    'debug': false
  }
});
//=&amp;gt; {'log': true, 'info': true, 'warn': false, 'error': true, 'debug': false}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;code&gt;configure&lt;/code&gt; 메서드는 객체를 인자로 받으며 'log level' 속성에 정의된 디스플레이 래밸의 숫자 또는 커스텀 래밸 플래그들로 구성된 객체를 인식하도록 만들었습니다. 래밸의 수는 log, info, warn, error, debug순으로 허용할 단계를 의미합니다. 즉 2를 기입하면 log와 info만 출력하게 되는 것이죠. 만약 당신이 모든 로그를 제외한 경고만 출력하고 싶다면 다음처럼 작성하면 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;clog.configure({
  'log level': {
    'log': false,
    'info': false,
    'warn': true,
    'error': false,
    'debug': false
  }
});

// or

clog.configure({'log level': 0});
clog.configure({'log level': {'warn': true}});&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
또한 &lt;code&gt;configure&lt;/code&gt; 메서드는 나중에 다시 정의해도 문제되지 않으며, 커스텀 레이블도 필터링 할 수도 있도록 처리되었습니다. 커스텀 레이블을 사용중이라면 다음과 같이 필터링 할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;clog('server', 'start listening on port 3000');  // custom head
clog.configure({'log level': {'server': false}});&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
이 옵션들을 잘 이용하면 운영과 개발 모드를 구분하여 자동으로 필터링하거나 어떤 상황에서 특정 메시지만 출력하도록 하는 동적인 구현도 가능할 거예요. 다음 업데이트에는 사용자 지정 색상을 지원하도록 할 예정입니다만, 언제 실행에 옮길지는 저도 잘 모르겠습니다; 끝으로 &lt;a href="https://github.com/firejune/clog"&gt;GitHub&lt;/a&gt;를 통해 이 아이디어를 주신 &lt;a href="https://github.com/hashar"&gt;Antoine Musso&lt;/a&gt;씨와 여로모로 전파에 힘써주신 &lt;a href="http://ajaxian.kr/"&gt;A.J&lt;/a&gt;님, &lt;a href="http://blog.outsider.ne.kr/"&gt;Outsider&lt;/a&gt;님 그리고 Clog를 애용해 주시는 모든 여러분들께 감사드립니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1727#p1727"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1727"&gt;Hits(246175)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/f2NwFCWOvax9hUFXJxznOjTjbd8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f2NwFCWOvax9hUFXJxznOjTjbd8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/f2NwFCWOvax9hUFXJxznOjTjbd8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f2NwFCWOvax9hUFXJxznOjTjbd8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/tjOxExNwA_A" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1727</feedburner:origLink></entry><entry><title type="text">CSS3와 자바스크립트를 이용한 프리젠테이션 impress.js</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/uDF3Uq2J-xI/1725" /><category term="웹개발" /><category term="자료" /><category term="impress.js" /><category term="자바스크립트" /><category term="CSS3" /><category term="프리젠테이션" /><category term="HTML5" /><category term="10만원 상품권 득" /><author><name>파이어준</name></author><updated>2012-01-13T00:39:56-08:00</updated><id>http://firejune.com/1725</id><content type="html">사내 개발자가 아닌 분들을 대상으로 하는 HTML5 발표가 있어서 자료를 조사하던 중 Bartek Szopka씨가 만든 &lt;a href="http://bartaz.github.com/impress.js/#/bored"&gt;impress.js&lt;/a&gt;를 발견하고 소개했습니다. 보시던 분들의 반응이 아주 좋더군요. impress.js는 CSS3와 자바스크립트를 이용하여 인상깊은 프리젠테이션을 웹기반으로 만들어 줍니다. 화면 전환에는 다양한 CSS transition과 3D transform이 사용되었습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://jsbin.firejune.com/impress/2#/bored" width="666" height="444" style="border: 1px solid #aaa;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
HTML5의 스펙들 중 &lt;code&gt;classList&lt;/code&gt;와 &lt;code&gt;dataset&lt;/code&gt; API를 사용하기 때문에 이를 지원하지 않는 브라우저에서는 정상적으로 작동하지 않는다고 합니다. impress.js가 제대로 작동하는 브라우저는 현재 크롬과 사파리밖에 없습니다. 위 데모를 작동시키려면 프레임 영역을 클릭하고 방향키를 눌러보세요.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1725#p1725"&gt;Comments(6)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1725"&gt;Hits(106702)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YN5offKM-4I8Tl_kEttRqYx3RL8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YN5offKM-4I8Tl_kEttRqYx3RL8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YN5offKM-4I8Tl_kEttRqYx3RL8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YN5offKM-4I8Tl_kEttRqYx3RL8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/uDF3Uq2J-xI" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1725</feedburner:origLink></entry><entry><title type="text">iOS 디바이스별 화면 구성요소 치수들</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/firejune/~3/JhYgv5CFPFk/1723" /><category term="웹개발" /><category term="자료" /><category term="iOS" /><category term="디바이스" /><category term="화면" /><category term="치수" /><category term="아이폰" /><category term="아이패드" /><category term="프로젝트" /><category term="레티나 디스플레이" /><category term="아이팟" /><category term="모바일" /><category term="프로젝트" /><author><name>파이어준</name></author><updated>2012-01-12T22:37:53-08:00</updated><id>http://firejune.com/1723</id><content type="html">iOS 기기용 웹앱이나 네이티브앱 개발시 유용하게 사용될 수 있는 치수들입니다. 특히, 모든 iOS 기기를 지원하는(유니버셜) 앱을 개발할 때 자주 찾게 되는 자료중 하나입니다. 스테이터스 바, 네비게이션 바, 탭 바, 키보드 등의 사이즈를 세웠을 때와 눕혔을 때로 구분하여 측정했습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;아이폰의 화면 치수&lt;/h3&gt; 아이폰에서 해상도를 계산할 때 굳이 레티나 디스플레이의 해상도(640 x 960)를 의식하여 계산할 필요는 없습니다. 단순히 이미지가 사용되는 곳에 더블픽셀(@x2)의 고해상도 이미지를 한 셋트 더 준비하면 된다는 사실만 기억하세요.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Portrait - 세웠을 때&lt;/h4&gt;앱 시작시 나타나는 오프닝 이미지는 기본으로 320 x 367 픽셀의 "filename.png"로 설정하고 레티나용으로 표시될 이미지는 640 x 734 픽셀의 "filename@2x.png"로 설정하면 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://firejune.com/attach/0113/120113112137615483/643901.jpg" width="540" height="744" alt="iphone_portrait_dimensions.jpg" /&gt;&lt;br /&gt;
iPhone Portrait Width: &lt;strong&gt;320px&lt;/strong&gt;&lt;br /&gt;
iPhone Portrait Height: &lt;strong&gt;480px&lt;/strong&gt;&lt;br /&gt;
 	 &lt;br /&gt;
Status Bar Height: &lt;strong&gt;20px&lt;/strong&gt;&lt;br /&gt;
Nav Bar Height: &lt;strong&gt;44px&lt;/strong&gt;&lt;br /&gt;
Main Content Area Height: &lt;strong&gt;367px&lt;/strong&gt;&lt;br /&gt;
Tab Bar Height: &lt;strong&gt;49px&lt;/strong&gt;&lt;br /&gt;
 	 &lt;br /&gt;
Keyboard Height: &lt;strong&gt;216px&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://firejune.com/attach/0113/120113112137615483/698460.jpg" width="440" height="216" alt="iphone_portrait_keyboard_sizes.jpg" /&gt;&lt;br /&gt;
키보드가 나타난 상황에서는 메인 스크린의 일부와 탭바를 가립니다. 키보드 크기를 제외한 나머지 영역의 크기를 계산할 때 참고하세요.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Landscape - 눕혔을 때&lt;/h4&gt;아이폰을 눕혔을 때 나타나는 변화는 메인 컨텐츠 영역의 높이가 480에서 219픽셀로 줄어드는 것이고 네비게이션 바의 높이가 44에서 32픽셀로 줄어든다는 것입니다. 오프닝 이미지는 기본으로 480 x 219 픽셀 그리고 레티나용(@2x)은 960 x 438 픽셀입니다. 참고로 아이폰의 앱 시작 이미지는 세로와 가로 모두 준비할 필요가 없습니다. 자신의 앱이 가로와 세로 중 어디에 최적화 되어있는지를 판단하여 한가지만 준비하면 됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://firejune.com/attach/0113/120113112137615483/856283.jpg" width="580" height="309" alt="iphone_landscape_dimensions.jpg" /&gt;&lt;br /&gt;
iPhone Landscape Width: &lt;strong&gt;480px&lt;/strong&gt;&lt;br /&gt;
iPhone Landscape Height: &lt;strong&gt;320px&lt;/strong&gt;&lt;br /&gt;
 	 &lt;br /&gt;
Status Bar Height: &lt;strong&gt;20px&lt;/strong&gt;&lt;br /&gt;
Nav Bar Height: &lt;strong&gt;32px&lt;/strong&gt;&lt;br /&gt;
Main Content Area Height: &lt;strong&gt;219px&lt;/strong&gt;&lt;br /&gt;
Tab Bar Height: &lt;strong&gt;49px&lt;/strong&gt;&lt;br /&gt;
 	 &lt;br /&gt;
Keyboard Height: &lt;strong&gt;162px&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://firejune.com/attach/0113/120113112137615483/452171.jpg" width="534" height="150" alt="iphone_landscape_keyboard_sizes.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;아이패드의 화면 치수&lt;/h3&gt;아이패드는 아직 레티나 디스플레이를 지원하지 않기 때문에 더블픽셀(@2x) 이미지를 준비할 필요가 없습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Portrait - 세웠을 때&lt;/h4&gt;&lt;img src="http://firejune.com/attach/0113/120113112137615483/365119.jpg" width="580" height="599" alt="ipad_portrait_dimensions.jpg" /&gt;&lt;br /&gt;
iPad Portrait Width: &lt;strong&gt;768px&lt;/strong&gt;&lt;br /&gt;
iPad Portrait Height: &lt;strong&gt;1024px&lt;/strong&gt;&lt;br /&gt;
 	 &lt;br /&gt;
Status Bar Height: &lt;strong&gt;20px&lt;/strong&gt;&lt;br /&gt;
Nav Bar Height: &lt;strong&gt;44px&lt;/strong&gt;&lt;br /&gt;
Main Content Area Height: &lt;strong&gt;911px&lt;/strong&gt;&lt;br /&gt;
Tab Bar Height: &lt;strong&gt;49px&lt;/strong&gt;&lt;br /&gt;
 	 &lt;br /&gt;
Keyboard Height: &lt;strong&gt;264px&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://firejune.com/attach/0113/120113112137615483/436220.jpg" width="580" height="172" alt="ipad_portrait_keyboard_sizes.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Landscape - 눕혔을 때&lt;/h4&gt; 아이폰과 달리 아이패드는 화면을 눕혔을 때 네비게이션 바의 높이에는 변화가 없습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://firejune.com/attach/0113/120113112137615483/294447.jpg" width="580" height="449" alt="ipad_landscape_dimensions.jpg" /&gt;&lt;br /&gt;
iPad Landscape Width: &lt;strong&gt;1024px&lt;/strong&gt;&lt;br /&gt;
iPad Landscape Height: &lt;strong&gt;768px&lt;/strong&gt;&lt;br /&gt;
 	 &lt;br /&gt;
Status Bar Height: &lt;strong&gt;20px&lt;/strong&gt;&lt;br /&gt;
Nav Bar Height: &lt;strong&gt;44px&lt;/strong&gt;&lt;br /&gt;
Main Content Area Height: &lt;strong&gt;655px&lt;/strong&gt;&lt;br /&gt;
Tab Bar Height: &lt;strong&gt;49px&lt;/strong&gt;&lt;br /&gt;
 	 &lt;br /&gt;
Keyboard Height: &lt;strong&gt;352px&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://firejune.com/attach/0113/120113112137615483/441908.jpg" width="580" height="172" alt="ipad_landscape_keyboard_sizes.jpg" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Qo0ZM6zIl63zOfn6Jjb0WgWv2i8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qo0ZM6zIl63zOfn6Jjb0WgWv2i8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Qo0ZM6zIl63zOfn6Jjb0WgWv2i8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qo0ZM6zIl63zOfn6Jjb0WgWv2i8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/firejune/~4/JhYgv5CFPFk" height="1" width="1"/&gt;</content><feedburner:origLink>http://firejune.com/1723</feedburner:origLink></entry></feed>

