<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko"><title type="text">Firejune Blog</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 xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="firejune" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><title type="text">자바스크립트 협업 도구 JS Bin 설치하기</title><link rel="alternate" type="text/html" href="http://firejune.com/1627" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="JSBin" /><category term="설치" /><category term="PHP" /><category term="JAVA" /><category term="Google Closure Compiler" /><author><name>파이어준</name></author><updated>2010-08-31T03:00:57-07:00</updated><id>http://firejune.com/1627</id><content type="html">&lt;a href="http://jsbin.com/"&gt;JS Bin&lt;/a&gt;은 오픈소스 기반의 자바스크립트 협업 도구입니다. PHP로 만들어진 녀석이라 설치를 시도했습니다만, &lt;a href="http://code.google.com/intl/ko-KR/closure/compiler/"&gt;구글의 Closure Compiler&lt;/a&gt;(JAVA)를 이용한 빌드 과정이 포함되어 있어서 걍 안쓰고 말았더랬습니다. 일반적인 웹 호스팅 서비스에서는 자바 서블릿을 실행할 수 없기 때문입니다. &lt;a href="http://ajaxian.kr/archives/1287"&gt;A.J님&lt;/a&gt;과 &lt;a href="http://boxersb.com/archives/190"&gt;boxersb님&lt;/a&gt;이 설치하는 모습을 보고 "이거 서버 시스템 스킬을 익혀야 하나..."하는 생각을 하며 마냥 부러워만 하다가 꼼수가 떠올라 우회할 수 있는 몇가지 방법을 시도하여 &lt;a href="http://jsbin.firejune.com"&gt;성공&lt;/a&gt;했고 그 과정을 기록합니다.&lt;br /&gt;
&lt;br /&gt;
1. &lt;a href="http://github.com/remy/jsbin"&gt;github&lt;/a&gt;로 부터 소스를 내려받습니다.&lt;br /&gt;
2. 동봉된 sql 파일들을 DB에 등록합니다.&lt;br /&gt;
3. 동봉된 phpMake 파일을 phpMake.php로 이름을 변경하고 마지막 부분을 다음과 같이 편집합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;변경 전:&lt;/strong&gt;&lt;br /&gt;
&lt;pre class="php"&gt;&lt;code class="php"&gt;...
// google compile in to jsbin.VERSION.js
echo "Google compiler compressing...\n";
system ('java -jar "./lib/compiler.jar" --js="' . SPROCKETIZED . '" --js_output_file="' . PRODUCTION . '" --warning_level=QUIET');

unlink(SPROCKETIZED);
echo "Compressed: " . PRODUCTION . "\nFile size: " . filesize(PRODUCTION) . " bytes.\n";
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;strong&gt;변경 후:&lt;/strong&gt;&lt;br /&gt;
&lt;pre class="php"&gt;&lt;code class="php"&gt;...
// google compile in to jsbin.VERSION.js
echo "Google compiler compressing...\n";

$ch = curl_init("http://closure-compiler.appspot.com/compile");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "output_info=warnings&amp;amp;output_info=errors&amp;amp;output_info=statistics&amp;amp;output_info=compiled_code&amp;amp;output_format=json&amp;amp;compilation_level=SIMPLE_OPTIMIZATIONS&amp;amp;js_code=".urlencode(file_get_contents(SPROCKETIZED)));

$output = json_decode(curl_exec($ch));
curl_close($ch);

if ($output-&amp;gt;compiledCode) {
  file_put_contents(PRODUCTION, $output-&amp;gt;compiledCode, LOCK_EX);
  echo "Compressed: " . PRODUCTION . "\nFile size: " . filesize(PRODUCTION) . " bytes.\n";
} else {
  echo "Compile error!";
}
unlink(SPROCKETIZED);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
4. jsbin 폴더를 웹 서버에 업로드합니다.&lt;br /&gt;
5. 브라우저의 주소창에서 phpMake.php를 호출합니다.&lt;br /&gt;
6. 설치된 경로에서 작동여부를 확인합니다.&lt;br /&gt;
&lt;br /&gt;
서버에서 자바 서블릿을 실행하는 부분을 구글에서 제공하는 Closure Compiler의 오픈 API를 사용하는 방식으로 변경한 것입니다. 결국 스크립트를 빌드하는 과정 때문에 설치를 못하고 있었던 것입니다. 더 쉬운 방법으로는 jsbin.com에서 이미 빌드되어 서비스 되고있는 &lt;a href="http://jsbin.com/js/2.0.9/jsbin.js"&gt;/js/2.x.x/jsbin.js&lt;/a&gt; 파일을 저장하여 정적으로 호출해도 해결되는 문제인 것입니다. 더욱 자세한 설치 방법은 위 두 분의 포스팅을 참고하면 되겠습니다. 추가적으로 나름 한글화를 시도했으며, 루트에 설치하지 않아도 되도록 소스를 전반적으로 수정했습니다. 계정 인증으로 보안하고, 실제 서버에 있는 자바스크립트 리소스를 호출하여 편집할 수 있도록 손보면 온라인 에디터로도 손색이 없겠더군요. 이미 누군가 하고 있겠죠? 참 오랜만에 포스팅합니다. 개인사정으로 한동안 방치하게 될지도 모르겠습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1627#p1627"&gt;Comments(2)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1627"&gt;Hits(505)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eHMrrVh-6NAlc64KsJTmcyVaPFo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eHMrrVh-6NAlc64KsJTmcyVaPFo/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/eHMrrVh-6NAlc64KsJTmcyVaPFo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eHMrrVh-6NAlc64KsJTmcyVaPFo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">WebDevMobile 열린세미나 - CSS3 발표자료 공유</title><link rel="alternate" type="text/html" href="http://firejune.com/1626" /><category term="웹개발" /><category term="자료" /><category term="CSS3" /><category term="속성" /><category term="발표자료" /><category term="WebDevMobile" /><author><name>파이어준</name></author><updated>2010-08-14T04:24:44-07:00</updated><id>http://firejune.com/1626</id><content type="html">&lt;iframe src="http://html5.firejune.com/css3.html" width="664" height="525" style="border: 1px solid #aaa;"&gt;
&lt;/iframe&gt;&lt;p class="cap1"&gt;슬라이드를 클릭한 후 방향키를 이용하여 다음으로 넘길수 있습니다.&lt;/p&gt;
&lt;br /&gt;
WebDevMobile에서 주관하는 &lt;a href="http://webdevmobile.com/xe/13228"&gt;열린세미나&lt;/a&gt;에서 금일 발표한 슬라이드입니다. "CSS3의 속성들"을 소개하는 부분의 소스와 예제는 &lt;a href="http://zenelements.com"&gt;zenelements.com&lt;/a&gt;를 참고했으며, "구린 브라우저 사용자에게는 구린 사용 경험을 제공하자"라는 다소 괴변 스러운 메시지를 전달하고자 했습니다. 이번 역시 급조해서 만든 슬라이드라 진행이 순조롭지 못했고 주제와 내용이 일치하지 않는 구석이 있었습니다. 어째 저는 발표를 하면 할수록 더 못하는 것 같습니다. 그럼에도 즐겁게 경청해 주신 여러분께 진심으로 감사드립니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1626#p1626"&gt;Comments(14)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1626"&gt;Hits(1435)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tYPBgIPa1Y6GKVsQbj9RpGQ1PR8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tYPBgIPa1Y6GKVsQbj9RpGQ1PR8/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/tYPBgIPa1Y6GKVsQbj9RpGQ1PR8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tYPBgIPa1Y6GKVsQbj9RpGQ1PR8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">ThinVNC 버전 0.9.0.10 업데이트</title><link rel="alternate" type="text/html" href="http://firejune.com/1625" /><category term="웹개발" /><category term="자료" /><category term="ThinVNC" /><category term="HTML5" /><category term="원격제어" /><category term="업데이트" /><category term="Canvas" /><category term="자바스크립트" /><category term="날로먹기!" /><author><name>파이어준</name></author><updated>2010-07-29T09:50:12-07:00</updated><id>http://firejune.com/1625</id><content type="html">&lt;div class="image-align right"&gt;&lt;a href="http://www.supportsmith.com/ThinVNC/HTML5-VNC.aspx"&gt;&lt;img src="http://firejune.com/attach/0729/100729233058621993/606786.png" width="316" height="130" alt="ThinVNC.png" class=" null"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.supportsmith.com/ThinVNC/HTML5-VNC.aspx"&gt;ThinVNC&lt;/a&gt;는 브라우저만으로 데스크탑을 원격으로 제어할 수 있게 하는 소프트웨어입니다. &lt;a href="http://firejune.com/1590"&gt;일전에 소개한 적이 있죠.&lt;/a&gt; 서버에 해당하는 PC에 ThinVNC를 설치하고 뷰어에 해당하는 클라이언트는 브라우저로 접속한 페이지인 것입니다. 최근 업데이트된 0.9.0.10 버전은 도저히 웹으로 구현한 것이라 믿기지 않을 정도로 속도가 향상되었고 쓸만한 기능들이 많이 생겼습니다. 프레젠테이션 도구가 추가되어 다른 사용자를 초대하고 관리할 수 있으며(암호 설정 가능), 현재 보여지는 화면을 모니터링 하고 화면에 떠 있는 특정 애플리케이션을 숨길 수도 있습니다. 이 밖에도 SSL 데이터 전송 방식이 추가되었으며, 윈도 서비스 모드로 실행할 수 있게 되었습니다. 그리고 기업 환경에서는 하나의 IP에 프록시 게이트웨이를 설정하여 ThinVNC가 설치되어있는 PC의 IP 또는 이름을 입력하여 접근할 수도 있습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="image-align center"&gt;&lt;a href="http://www.supportsmith.com/ThinVNC/Architecture.aspx" title=""&gt;&lt;img src="http://firejune.com/attach/0729/100729233058621993/407289.jpg" width="540" alt="ThinVNC - Gateway3.jpg" class="centered hasborder"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
뷰어는 HTML5로 구현 되었습니다. 별도의 브라우저 플러그인이나 소프트웨어의 설치를 강요하지 않기 때문에 여러 사용자들을 손쉽게 초대하여 온라인 프레젠테이션을 하거나 교육하는 목적으로 사용하기에 적합하다고 합니다. ThinVNC는 윈도 2000/XP/2003/Vista/7/Server8에서 작동하고 HTML5를 지원하는 Firefox, Chrome, Opera, Safari 등의 브라우저를 이용하여 접속할 수 있습니다. 비영리 목적으로는 무료로 사용할 수 있으며, GPL 라이센스의 오픈소스 프로젝트입니다.&lt;br /&gt;
&lt;br /&gt;
우리 회사에서도 관련 프로젝트를 진행 중이고 참여하고 있는데 살짝 위협적으로 느껴지는군요.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1625#p1625"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1625"&gt;Hits(1487)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SqcT9i4QwaKrM67Xc11SWSKnZ9c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SqcT9i4QwaKrM67Xc11SWSKnZ9c/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/SqcT9i4QwaKrM67Xc11SWSKnZ9c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SqcT9i4QwaKrM67Xc11SWSKnZ9c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">내 트위터 데이터 덤프하기 - twtdump.js</title><link rel="alternate" type="text/html" href="http://firejune.com/1624" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="데이터" /><category term="덤프" /><category term="북마클릿" /><category term="오픈 API에 장난질 하면 DDOS 쳐 맞습니다." /><author><name>파이어준</name></author><updated>2010-07-25T02:41:17-07:00</updated><id>http://firejune.com/1624</id><content type="html">트위터가 가진 데이터는 왜이리 가지고 싶은걸까요? 요 며칠동안 트위터에 저장된 데이터를 가져오기 위해 그들이 제공하는 오픈 API로 많은 삽질을 해 보았지만 이렇다 할 성과를 거두지 못했습니다. 얻은 결론은 오픈 API를 통해서는 트위터 사이트로 부터 얻어낼 수 있는 만큼의 데이터를 확보하기는 어렵다는 것입니다. 그래서 다음과 같은 북마클릿을 만들었습니다. 이 북마클릿은 트위터에서 현재 머무르고 있는 곳의 모든 자료를 JSON 스트링으로 만들어 줍니다. 예를들어 @사용자ID 를 클릭하여 멘션을 조회하는 상태라면 트위터 서비스에서 허용한 데이터 출력 범위 내의 모든 멘션 데이터를 JSON으로 만들어 주는 것입니다. &lt;br /&gt;
&lt;br /&gt;
HTML로 부터 얻어내는 데이터는 다음과 같습니다.&lt;br /&gt;
&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;{
  "user": {
    "screen_name": "zziuni",
    "profile_image_url": "http://a0.twimg.com/profile_images/1082290724/gravatar_normal.jpg"
  },
  "id": "19455882373",
  "text": "@firejune 큰일날뻔했군요.. waterjune.com 될뻔.. ㅡ ㅡ;",
  "source": "&amp;lt;a href=\"http://www.tweetdeck.com\" rel=\"nofollow\"&amp;gt;TweetDeck&amp;lt;/a&amp;gt;",
  "created_at": "Sun Jul 25 00:12:55 +0000 2010",
  "in_reply_to_status_id": "19431051539"
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
일단 이곳에서 필요로하는 최소한의 데이터 속성들만 수집하였으며 필요하면 더 많은 속성을 추출할 수도 있을 것입니다. &lt;del&gt;그리고 유기적으로 연결된 글들을 표현하기 위한 데이터이므로 "in_reply_to_status_id" 값이 없는 것들은 제외하였습니다.&lt;/del&gt; 아래의 북마클릿을 브라우저의 북마크 바에 끌어다 놓고 트위터 페이지에서 추가된 북마클릿을 클릭하여 사용할 수 있습니다. 수집이 완료되는 즉시 결과을 페이지에 출력하며 AJAX 요청이 많이 일어나기 때문에 환경에 따라서는 수분이 소요될 수도 있습니다. 트위터가 사용하는 스크립트를 이용하기 때문에 나중에는 작동하지 않을 수도 있으니 필요한 분들은 지금 덤프하세요.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="javascript:$(function(){function%20k(){if(!$(%27#more%27).length)return%20l();$.ajax({type:%27GET%27,url:$(%27#more%27).attr(%27href%27),dataType:%27json%27,beforeSend:function(){$(%27#timeline%20li:last-child%27).addClass(%27last-on-page%27);$(%27#more%27).addClass(%27loading%27).html(%27%27)},success:function(a){updateTimeAgo();twttr.is.def(a.users)%26%26twttr.User.merge(a.users);$(%27#timeline%27).append($(a[%27#timeline%27]).find(%27.hentry%27));$(%27#pagination%27).html(a[%27#pagination%27]);page.retainTimeline=true;window.onPageChange%26%26onPageChange();page.retainTimeline=null;$.Timeline.triggerTimelineChanged();$(%27#more%27).length?k():l()},error:function(){$(%27#timeline%20li:last-child%27).removeClass(%27last-on-page%27);$(%27#more%27).removeClass(%27loading%27).text(_(%27more%27));(new%20ShortNotification).setMessage(_(%27Whoops!%20Something%20went%20wrong.%20Please%20try%20again!%27)).show()}})}function%20l(){var%20a=$(%27#profile-image%27),d=$(%27div.screen-name%27).html(),c=[],b,e,h,i,j,f;$(%27#timeline%27).find(%27li.hentry%27).each(function(){b=$(this);e=b.find(%27.entry-date%27);h=b.find(%27img%27);i=e.find(%27.timestamp%27);j=e.next(%27span%27);f=j.next(%27a[href*=twitter.com]%27);f=!f.length?%27%27:f.attr(%27href%27).split(%27/%27);var%20g={screen_name:h.attr(%27alt%27)||d,profile_image_url:(a.length?a:h).attr(%27src%27)},o=this.id.split(%27_%27)[1],m;m=b.find(%27.entry-content%27).html().replace(/%3C%5Cw+(%5Cs+(%27[^%27]*%27|%22[^%22]*%22|[^%3E])+)?%3E|%3C%5C/%5Cw+%3E/gi,%27%27);var%20n;n=j.html().replace(%27via%20%27,%27%27).replace(/%26/g,%27%26amp;%27).replace(/%3C/g,%27%26lt;%27).replace(/%3E/g,%27%26gt;%27);g={user:g,id:o,text:m,source:n,created_at:eval(%27(%27+i.attr(%27data%27)+%27)%27).time,in_reply_to_status_id:f[f.length-1]||%27%27};c.push(g)});window.js_beautify||(js_beautify=function(g){return%20g});document.write(%27%3Cpre%3E%27+js_beautify(JSON.stringify(c),2)+%27%3C/pre%3E%27)}jQuery.extend({includeStates:{},include:function(a,d,c){if(typeof%20d!=%27function%27%26%26!c){c=d;d=null}a=a.replace(%27%5Cn%27,%27%27);jQuery.includeStates[a]=false;var%20b=document.createElement(%27script%27);b.type=%27text/javascript%27;b.onload=function(){jQuery.includeStates[a]=true;d%26%26d.call(b)};b.onreadystatechange=function(){if(!(this.readyState!=%27complete%27%26%26this.readyState!=%27loaded%27)){jQuery.includeStates[a]=true;d%26%26d.call(b)}};b.src=a;if(c){if(c.constructor!=Array)c=[c];setTimeout(function(){var%20e=true;$.each(c,function(h,i){if(!i())return%20e=false});e?document.getElementsByTagName(%27head%27)[0].appendChild(b):setTimeout(arguments.callee,10)},10)}else%20document.getElementsByTagName(%27head%27)[0].appendChild(b);return%20function(){return%20jQuery.includeStates[a]}}});$(%27body%27).append(%22%3Cp%20style=%27position:absolute;font-weight:bold;top:0;right:0;z-index:999;background:#eee;color:#333;padding:5px%2010px;%27%3EDumping...%3C/p%3E%22);$.include(%27http://firejune.com/attach/1122/071122050124325839/094579.js%27);k()});void(0);"&gt;twtdump&lt;/a&gt; 북마클릿 - 이 링크를 브라우저의 북마크 바로 끌어다 놓으세요.&lt;br /&gt;
&lt;a href="http://firejune.com/public/javascripts/twtdump.js"&gt;twtdump.js&lt;/a&gt; 스크립트 소스 - 직접 수정해서 사용하세요.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1624#p1624"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1624"&gt;Hits(1093)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2CwaFzvkV9YhuN-MzA61bmfMpJM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2CwaFzvkV9YhuN-MzA61bmfMpJM/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/2CwaFzvkV9YhuN-MzA61bmfMpJM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2CwaFzvkV9YhuN-MzA61bmfMpJM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">트위터의 @Anywhere API 사용하기</title><link rel="alternate" type="text/html" href="http://firejune.com/1623" /><category term="웹개발" /><category term="자료" /><category term="@Anywhere" /><category term="자바스크립트" /><category term="OAuth" /><category term="메서드" /><category term="API" /><category term="트위터" /><category term="이 글로 뭘 말하고 싶은게냐" /><author><name>파이어준</name></author><updated>2010-07-16T07:31:35-07:00</updated><id>http://firejune.com/1623</id><content type="html">&lt;div class="image-align center"&gt;&lt;a href="http://firejune.com/attach/0716/100716164429911061/938383.png" onclick="Zooming(this, 824, 548); return false;" title=""&gt;&lt;img src="http://firejune.com/attach/0716/100716164429911061/938383.png" width="650" height="432" alt="oauth_diagram.png" class="centered null"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
위 다이어그램은 &lt;a href="http://twitter.com/"&gt;트위터&lt;/a&gt;에서 제공하는 &lt;a href="http://oauth.net/"&gt;OAuth&lt;/a&gt; API의 다이어그램입니다. OAuth는 외부(서드파티 애플리케이션)에서 계정을 인증할 수 있는 방법의 하나로써 사용자의 패스워드를 필요로 하지 않고 사용자의 데이터에 접근할 수 있게하는 토큰패싱 매커니즘입니다. 여러 서비스들이 이를 사용한 오픈 API를 제공하고 있습니다. 대표적으로 트위터에서 지원하고 있으며,  Gmail도 OAuth API를 제공하겠다고 발표하여 이제는 오픈 ID의 개념으로 확산되고 있는 추세입니다. 외부에서 로그인을 필요로하는 정보를 취득하는 방법으로 계정 정보를 입력하는 절차를 거치는 것이 일반적이었습니다만, 제 3자에게 아이디와 비밀번호가 고스란히 노출되어 버리는 치명적인 단점이 있어 심각한 보안 문제를 야기할 수 있기 때문에 OAuth를 대안으로 삼고 있는듯 합니다. &lt;del&gt;최근 트위터는 OAuth API를 이용하는 서드파티 애플리케이션에 더 많은 혜택을 제공하는 방식으로 사용을 권장하고 있습니다.&lt;/del&gt;&lt;br /&gt;
&lt;br /&gt;
얼마전에 트위터에서 발표한 &lt;a href="http://dev.twitter.com/anywhere"&gt;@Anywhere&lt;/a&gt;는 자신의 사이트 또는 블로그에 트위터와 손쉽게 연동할 수 있게하는 자바스크립트 위젯 라이브러리입니다. 놀랍게도 서버를 거치지 않고 자바스크립트만으로 OAuth를 통해 인증하는 모습에 감탄하여 분석해 보았습니다. @Anywhere는 OAuth 2.0 API를 사용하더군요. 크로스-도메인 POST 요청이 일어나는 것을 확인해 보았더니 &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; 요소를 이용한 트릭입디다. 살짝 실망하고 더 파다보니 잡다한 자바스크립트 리소스들을 다수 호출하는 것도 마음에 들지 않더군요. 그래서 가벼운 OAuth 인증 라이브러리를 만들어 보려고 했습니다. 하지만 애초 목적과는 달리 @Anywhere의 API를 사용하는 재미에 흠뻑 빠져들고 말았습니다. &lt;a href="http://dev.twitter.com/anywhere/begin"&gt;트위터의 @Anywhere 개발 문서&lt;/a&gt;에는 초심자를 위한 위젯 사용법만 나와있고 입맛대로 가지고 놀기에는 정보가 턱없이 부족해서 소스분석으로 알아낸 다소 불친절(?)한 명세들을 공개합니다. 위젯 생성관련 메서드는 이미 공개되어 있기 때문에 설명은 생략했고 자바스크립트만으로 서드파티 웹 애플리케이션을 개발할 수 있을 만한 REST API와 사용자 메서드들을 집중 공략했습니다. 대부분의 사용자 메서드는 통신이 발생하기 때문에 비동기식으로 작동하며 'is'로 시작하는 메서드가 아니면 jQuery처럼 체인 형식으로 작성할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;

&lt;h3&gt;Anywhere methods&lt;/h3&gt;
&lt;ul class="square"&gt;
  &lt;li&gt;&lt;strong&gt;twttr.anywhere&lt;/strong&gt; : 초기화 arg1 = version or callback(client), arg2 = callback(client)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;twttr.anywhere.config&lt;/strong&gt; : 환경설정 arg1 = options&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;twttr.anywhere.signOut&lt;/strong&gt; : 로그아웃&lt;/li&gt;
&lt;/ul&gt;&lt;br/&gt;

&lt;h3&gt;Client methods&lt;/h3&gt;
&lt;ul class="square"&gt;
  &lt;li&gt;&lt;strong&gt;client.signIn&lt;/strong&gt; : 로그인&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.isConnected&lt;/strong&gt; : 연결상태 확인&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.requireConnect&lt;/strong&gt; : 연결 여부 확인&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;client.hovercards&lt;/strong&gt; : 호버카드 생성&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.linkifyUsers&lt;/strong&gt; : 트위터 사용자 링크 생성&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.tweetBox&lt;/strong&gt; : 트위터 컨텐츠 입력창 생성&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.connectButton&lt;/strong&gt; : 트위터 연결 버튼 생성&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.followButton&lt;/strong&gt; : 팔로우 버튼 생성&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;client.one&lt;/strong&gt; : EventProvider&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.trigger&lt;/strong&gt; : EventProvider&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.bind&lt;/strong&gt; : EventProvider&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.unbind&lt;/strong&gt; : EventProvider&lt;/li&gt;
&lt;/ul&gt;&lt;br/&gt;

&lt;h3&gt;REST API methods&lt;/h3&gt;
&lt;ul class="square"&gt;
  &lt;li&gt;&lt;strong&gt;client.Base&lt;/strong&gt; : 트위터 Base API&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.CurrentUser&lt;/strong&gt; : 트위터 CurrentUser API
    &lt;ul&gt;
      &lt;li&gt;block&lt;/li&gt;
      &lt;li&gt;follow&lt;/li&gt;
      &lt;li&gt;notifications&lt;/li&gt;
      &lt;li&gt;report&lt;/li&gt;
      &lt;li&gt;statics&lt;/li&gt;
      &lt;li&gt;unblock&lt;/li&gt;
      &lt;li&gt;unfollow&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.DirectMessage&lt;/strong&gt; : 트위터 DirectMessage API
    &lt;ul&gt;
      &lt;li&gt;send: DirectMessage&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.List&lt;/strong&gt; : 트위터 List API&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.Place&lt;/strong&gt; : 트위터 Place API
    &lt;ul&gt;
      &lt;li&gt;find: Place&lt;/li&gt;
      &lt;li&gt;nearby: Collection&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.SavedSearch&lt;/strong&gt; : 트위터 SavedSearch API&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.SearchResult&lt;/strong&gt; : 트위터 SearchResult API&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.Status&lt;/strong&gt; : 트위터 Status API
    &lt;ul&gt;
      &lt;li&gt;favorite : Status&lt;/li&gt;
      &lt;li&gt;find : Status&lt;/li&gt;
      &lt;li&gt;publicTimeline : Collection&lt;/li&gt;
      &lt;li&gt;reply : Status&lt;/li&gt;
      &lt;li&gt;retweet : Status&lt;/li&gt;
      &lt;li&gt;search : Collection&lt;/li&gt;
      &lt;li&gt;unfavorite : Status&lt;/li&gt;
      &lt;li&gt;update : Status&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;client.User&lt;/strong&gt; : 트위터 User API
    &lt;ul&gt;
      &lt;li&gt;current : CurrentUser&lt;/li&gt;
      &lt;li&gt;find : User&lt;/li&gt;
      &lt;li&gt;findAll : Collection&lt;/li&gt;
      &lt;li&gt;search : Collection&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;&lt;br/&gt;

&lt;h3&gt;User methods&lt;/h3&gt;
&lt;ul class="square"&gt;
  &lt;li&gt;&lt;strong&gt;user.data&lt;/strong&gt; : 사용자 정보 arg1 = attribute, arg2 = value&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;user.block&lt;/strong&gt; : 블락 arg1 = options&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.follow&lt;/strong&gt; : 팔로 arg1 = options&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.unblock&lt;/strong&gt; : 언블락 arg1 = options&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.unfollow&lt;/strong&gt; : 언팔 arg1 = options&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.update&lt;/strong&gt; : 트윗 arg1 = string, arg2 = params&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;user.directMessage, user.dm&lt;/strong&gt; : DM 발송 arg1 = string, arg2 = callback(object)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.notifications&lt;/strong&gt; : 휴대폰 기기 알림 arg1 = mode, arg2 = options&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.report&lt;/strong&gt; : 스팸 신고 arg1 = callback(options)&lt;/li&gt;


  &lt;li&gt;&lt;strong&gt;user.lists&lt;/strong&gt; : 리스트 목록 호출 arg1 = callback(array)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.subscriptions&lt;/strong&gt; : 리스트 구독자 목록 호출 arg1 = options&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.memberships&lt;/strong&gt; : 리스트 멤버 목록 호출  arg1 = callback(array)&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;user.timeline&lt;/strong&gt; : 타임라인 목록 호출 arg1 = callback(array)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.favorites&lt;/strong&gt; : 즐겨찾기 목록 호출 arg1 = callback(array)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.followers&lt;/strong&gt; : 팔로어 목록 호출 arg1 = callback(array)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.friends&lt;/strong&gt; : 친구 목록 호출 arg1 = callback(array)&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;user.isBlocking&lt;/strong&gt; : 블락 여부 확인 arg1 = screenName, arg2 = callback(boolean)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.isFollowedBy&lt;/strong&gt; : 맞팔 여부 확인 arg1 = screenName, arg2 = callback(boolean)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.isFollowing&lt;/strong&gt; : 팔로우 여부 확인 arg1 = screenName, arg2 = callback(boolean)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.isFriend&lt;/strong&gt; : 친구 여부 확인 arg1 = screenName, arg2 = callback(boolean)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;user.isMutual&lt;/strong&gt; : 관계 여부 확인 arg1 = screenName, arg2 = callback(boolean)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h3&gt;Examples&lt;/h3&gt;&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;&amp;lt;script src="http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&amp;amp;v=1"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type="text/javascript"&amp;gt;
  twttr.anywhere(function(client) {
    var currentUser, screenName, profileImage, profileImageTag;

    if (client.isConnected()) {
      currentUser = client.currentUser;
      screenName = currentUser.data('screen_name');
      profileImage = currentUser.data('profile_image_url');
      profileImageTag = "&amp;lt;img src='" + profileImage + "'/&amp;gt;";

      $('#connect-placeholder').append("Logged in as " + profileImageTag + " " + screenName);
    } else {
      client("#connect-placeholder").connectButton();
    };
  });
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;var footer = $('#hovercard-footer');
client.User.find(screenName).dm('당신을 언팔하고 블록했습니다. 안녕히 계세욧!').unfollow({
    success: function() {
      footer.addClass("following");
    },
    error: function(result) {
      if (result.status == 403 &amp;amp;&amp;amp; result.response.error.match(/already requested to follow/))
        footer.addClass("follow-pending");
      else if (result.status != 401)
        footer.addClass("follow-alert");
    }
  }).block({
    success: function() {
      footer.addClass("blocking")
        .removeClass("sms-setting-not-off")
        .addClass("sms-setting-off")
    },
    error: function() {
      footer.removeClass("not-following").addClass("following");
    }
  });
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
이곳에 &lt;a href="http://firejune.com/1534"&gt;트위터와 연동&lt;/a&gt;한 댓글들의 툴팁은 완전히 커스토마이즈 된 것입니다. &lt;del&gt;아직 몇몇 알아내지 못한 기능과 버그들이 있긴 하지만요.&lt;/del&gt; 변화가 느껴지지 않는 분들은 &lt;a href="javascript:new%20Storage('ImgEffect').remove();new%20Storage('Include').remove();%20location.reload();%20void(0);"&gt;여기를 클릭&lt;/a&gt;하여 로컬-스토리지에 보관된 리소스 캐시를 수동으로 제거하세요.&lt;br /&gt;
&lt;br /&gt;
* 댓글 및 툴팁 연동을 위한 Anywhere 클래스 생성&lt;br /&gt;
* 툴팁에 트위터 호버카드 타입 추가&lt;br /&gt;
* @Anywhere 자바스크립트 리소스를 로컬에서 호출하도록 수정&lt;br /&gt;
* @Anywhere OAuth 인증 후 호버카드 정보 및 액션 변경&lt;br /&gt;
* @Anywhere OAuth 인증 후 특정 대상 멘션 작성 기능 추가&lt;br /&gt;
* @Anywhere OAuth 인증 후 기본 댓글 작성을 트위터에 작성하는 기능 추가&lt;br /&gt;
* @Anywhere OAuth 인증 후 리트윗 작성 기능 추가&lt;br /&gt;
* Anywhere 클래스에 onSignIn, onSignOut, onInitialize 멀티플 콜백 추가
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1623#p1623"&gt;Comments(8)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1623"&gt;Hits(3197)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/35AmUdgCWIHJ2W-oUk0Vxr1muz0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/35AmUdgCWIHJ2W-oUk0Vxr1muz0/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/35AmUdgCWIHJ2W-oUk0Vxr1muz0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/35AmUdgCWIHJ2W-oUk0Vxr1muz0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">인터넷 익스플로러 6-7-8에서 CSS3사용하기 - PIE</title><link rel="alternate" type="text/html" href="http://firejune.com/1622" /><category term="웹개발" /><category term="자료" /><category term="CSS3" /><category term="IE" /><category term="css3pie" /><category term="PIE" /><category term="htc" /><category term="크로스-브라우저" /><category term="VML" /><author><name>파이어준</name></author><updated>2010-07-13T19:14:11-07:00</updated><id>http://firejune.com/1622</id><content type="html">&lt;a href="http://css3pie.com/"&gt;&lt;img src="http://firejune.com/attach/0714/100714095245470674/417982.png" width="194" height="127" alt="css3pie.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://css3pie.com/"&gt;PIE(Progressive Internet Explorer)&lt;/a&gt;는 인터넷 익스플로러 6-7-8에서 CSS3의 몇몇 속성들을 인식하고 출력하는 첨부파일(.htc)형식의 라이브러리입니다. 얼마 전에 소개했던 &lt;a href="http://firejune.com/1605"&gt;IE-CSS3&lt;/a&gt;와 마찬가지로 VML을 이용하며, &lt;code&gt;behavior: url(PIE.htc);&lt;/code&gt;를 해당 속성에 작성하는 사용방법 역시 비슷합니다. 두드러진 차이점은 보다 많은 CSS3속성들을 지원하고 자바스크립트로 핸들할 수 있다는 것입니다.&lt;br /&gt;
&lt;br /&gt;

&lt;ul class="square"&gt;
  &lt;li&gt;border-radius&lt;/li&gt;
  &lt;li&gt;box-shadow&lt;/li&gt;
  &lt;li&gt;border-image&lt;/li&gt;
  &lt;li&gt;multiple background images&lt;/li&gt;
  &lt;li&gt;linear-gradient as background image&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
그리고 추가적인 CSS3 속성들을 표현하기 위해 개발중이라고 합니다. IE-CSS3 프로젝트를 포크한 냄새가 강하게 풍깁니다만 언급은 없군요. 아무튼 멋진 프로젝트입니다. 그럴싸한 도메인으로 서비스 되는 것으로 보아 뭔가 공식화 되는 느낌이 드네요.&lt;br /&gt;
&lt;br /&gt;

&lt;style type='text/css'&gt;
  #demo {
    width: 660px;
    position: relative;
    z-index: 2;
    font-size: 11px;
    font-family: sans-serif;
  }

  #target {
    position: absolute;
    left: 0;
    top: 5px;
    width: 200px;
    text-align: center;
    padding: 60px 0;
    background: #EEE;
    border: 1px solid #999;
    font-size: 18px;

    /* default CSS3 values: */
    /*-webkit-border-radius: 8px;
    -moz-border-radius: 8px;
    border-radius: 8px;
    -webkit-box-shadow: #666 0 2px 3px;
    -moz-box-shadow: #666 0 2px 3px;
    box-shadow: #666 0 2px 3px;
    background: -webkit-gradient(linear, 0 0, 0 bottom, from(#9F9), to(#393));
    background: -moz-linear-gradient(#9F9, #393);
    -pie-background: linear-gradient(#9F9, #393);*/
  }

  #controls {
    margin: 0 0 20px 220px;
  }

  #controls input {
    font-family: monospace;
    font-size: 1em;
    vertical-align: middle;
  }

  #controls fieldset {
    border: 1px solid #CCC;
    padding: 3px 10px 5px;
    margin: 0 0 10px;
  }

  #controls fieldset legend {
    line-height: normal;
    color: #000;
  }

  #controls fieldset fieldset {
    margin: 0 0 5px;
    padding-left: 5px;
    line-height: 25px;
  }

  #controls ul, #controls li {
    display: block;
    list-style: none;
    margin: 0;
    padding: 0;
  }

  #controls .toggle {
    float: left;
  }
  #controls .details {
    float: right;
  }
  #controls .details label {
    margin-left: 2px;
  }

  .colorPicker {
    position: absolute;
    z-index: 100;
    margin-top: 20px;
    border: 1px solid #CCC;
    background: #FFF;
    -webkit-box-shadow: #999 2px 2px 6px;
    -moz-box-shadow: #999 2px 2px 6px;
    box-shadow: #999 2px 2px 6px;
    /*behavior: url(/PIE.htc);*/
  }

  #output {
    display: block;
    border: 1px solid #CCC;
    background: #EEE;
    margin: 0 0 20px;
    padding: 20px;
    white-space: pre;
  }
&lt;/style&gt;

&lt;div id="demo"&gt; 

  &lt;div id="target"&gt; 
    Mmmmm, pie.
  &lt;/div&gt; 

  &lt;div id="controls"&gt; 
    &lt;fieldset id="featureControls"&gt; 
      &lt;legend&gt;CSS3 features&lt;/legend&gt; 

      &lt;fieldset&gt; 
        &lt;legend&gt;border-radius&lt;/legend&gt; 

        &lt;div class="toggle"&gt; 
          &lt;input type="checkbox" id="borderRadiusToggle" class="featureToggle" checked="checked" /&gt; 
          &lt;label for="borderRadiusToggle"&gt;Enable&lt;/label&gt; 
        &lt;/div&gt; 

        &lt;div class="details"&gt; 
          &lt;label for="borderRadiusSize"&gt;Radius size:&lt;/label&gt; 
          &lt;input type="text" id="borderRadiusSize" value="8" size="3" /&gt; 
        &lt;/div&gt; 
      &lt;/fieldset&gt; 

      &lt;fieldset&gt; 
        &lt;legend&gt;box-shadow&lt;/legend&gt; 

        &lt;div class="toggle"&gt; 
          &lt;input type="checkbox" id="boxShadowToggle" class="featureToggle" checked="checked" /&gt; 
          &lt;label for="boxShadowToggle"&gt;Enable&lt;/label&gt; 
        &lt;/div&gt; 

        &lt;div class="details"&gt; 
          &lt;label for="boxShadowBlur"&gt;Blur size:&lt;/label&gt; 
          &lt;input type="text" id="boxShadowBlur" value="3" size="3" /&gt; 

          &lt;label for="boxShadowX"&gt;X offset:&lt;/label&gt; 
          &lt;input type="text" id="boxShadowX" value="0" size="3" /&gt; 

          &lt;label for="boxShadowY"&gt;Y offset:&lt;/label&gt; 
          &lt;input type="text" id="boxShadowY" value="2" size="3" /&gt; 
        &lt;/div&gt; 

      &lt;/fieldset&gt; 

      &lt;fieldset&gt; 
        &lt;legend&gt;linear-gradient&lt;/legend&gt; 

        &lt;div class="toggle"&gt; 
          &lt;input type="checkbox" id="gradientToggle" class="featureToggle" checked="checked" /&gt; 
          &lt;label for="gradientToggle"&gt;Enable&lt;/label&gt; 
        &lt;/div&gt; 

        &lt;div class="details"&gt; 
          &lt;label for="gradientColor1"&gt;Top color:&lt;/label&gt; 
          &lt;input type="text" class="color" id="gradientColor1" value="#EEFF99" size="7" /&gt; 

          &lt;label for="gradientColor2"&gt;Bottom color:&lt;/label&gt; 
          &lt;input type="text" class="color" id="gradientColor2" value="#66EE33" size="7" /&gt; 
        &lt;/div&gt; 
      &lt;/fieldset&gt; 
    &lt;/fieldset&gt; 
    
    &lt;fieldset id="pieControls"&gt; 
      &lt;legend&gt;Options&lt;/legend&gt; 
      &lt;ul&gt; 
        &lt;li&gt; 
          &lt;input type="checkbox" id="pieToggle" checked="checked" /&gt; 
          &lt;label for="pieToggle"&gt;Enable PIE (only affects IE)&lt;/label&gt; 
        &lt;/li&gt; 
        &lt;li&gt; 
          &lt;input type="checkbox" id="codeToggle" /&gt; 
          &lt;label for="codeToggle"&gt;Show CSS&lt;/label&gt; 
        &lt;/li&gt; 
      &lt;/ul&gt; 
    &lt;/fieldset&gt; 
  &lt;/div&gt; 

  &lt;code id="output"&gt; 
    
  &lt;/code&gt; 
&lt;/div&gt;


 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1622#p1622"&gt;Comments(2)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1622"&gt;Hits(2127)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/auX2NTMjG2nkunxZWA27YRhNgD8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/auX2NTMjG2nkunxZWA27YRhNgD8/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/auX2NTMjG2nkunxZWA27YRhNgD8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/auX2NTMjG2nkunxZWA27YRhNgD8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">순수 CSS3로 만든 페이지 넘기기 효과</title><link rel="alternate" type="text/html" href="http://firejune.com/1621" /><category term="웹개발" /><category term="자료" /><category term="순수" /><category term="CSS3" /><category term="플립" /><category term="책장" /><category term="애니메이션" /><category term="이제 이런건 자바스크립트로 하는거 아니다." /><author><name>파이어준</name></author><updated>2010-07-12T19:46:02-07:00</updated><id>http://firejune.com/1621</id><content type="html">&lt;style type="text/css"&gt; 
  #all {
    width: 666px;
    height: 470px;
    margin-left: auto;
    margin-right: auto;
    border: 1px solid #aaa;
  }
  #page-flip {
    background-image: url(/attach/0713/100713111624397432/491584.jpg);
    position: absolute;
    padding: 40px 40px 40px 340px;
    width: 286px;
    height: 390px;
    overflow: hidden;
  }
  #r1 {
    position: absolute;
    z-index: 2;
    -webkit-transform-origin: 1315px 500px;
    -webkit-transform: translate(-1030px, -500px) rotate(-32deg);
    -webkit-transition-property: -webkit-transform, -webkit-transform-origin;
    -webkit-transition-duration: 1s;
  }
  #p1 {
    width: 1285px;
    height: 1388px;
    overflow: hidden;
  }
  #p1 &gt; div {
    -webkit-transform-origin: 285px 0;
    -webkit-transform: translate(1030px, 500px) rotate(32deg);
    -webkit-transition-property: -webkit-transform, -webkit-transform-origin;
    -webkit-transition-duration: 1s;
    width: 285px;
    height: 388px;
    background-image: url(/attach/0713/100713111624397432/452736.jpg);
  }
  #p1 &gt; div &gt; div {
    width: 10px;
    height: 388px;
    background: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .25)), to(rgba(0,0,0,0)));
  }
  #p2 &gt; div {
    width: 285px;
    height: 388px;
    -webkit-box-shadow: 0 0 11px rgba(0, 0, 0, .5);
    position: absolute;
    z-index: 1;
    background-image: url(/attach/0713/100713111624397432/471817.jpg);
  }
  #r3 {
    -webkit-transform-origin: 1315px 500px;
    -webkit-transform: translate(-1030px, -500px) rotate(-32deg);
    -webkit-transition-property: -webkit-transform, -webkit-transform-origin;
    -webkit-transition-duration: 1s;
    position: absolute;
    z-index: 2;
  }
  #s3 {
    -webkit-transform-origin: 70px 500px;
    -webkit-transform: translate(215px, -500px) rotate(-32deg) translate(40px, 0);
    -webkit-transition-property: -webkit-transform, -webkit-transform-origin;
    -webkit-transition-duration: 1s;
    position: absolute;
    z-index: 1;
  }
  #page-flip:hover #s3 {
    -webkit-transform-origin: 325px 500px;
    -webkit-transform: translate(-40px, -500px) rotate(0deg) translate(40px, 0);
  }
  #sp3 {
    width: 25px;
    height: 1000px;
    background: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .25)), to(rgba(0,0,0,0)));
    -webkit-transition-property: width;
    -webkit-transition-duration: 1s;
    overflow: hidden;
  }
  #page-flip:hover #sp3 {
    width: 11px;
  }
  .s {
    width: 285px;
    height: 388px;
    position: absolute;
    overflow: hidden;
    z-index: 3;
  }
  #s2 {
    -webkit-transform-origin: 45px 500px;
    -webkit-transform: translate(240px, -500px) rotate(-32deg);
    -webkit-transition-property: -webkit-transform, -webkit-transform-origin;
    -webkit-transition-duration: 1s;
    position: absolute;
  }
  #sp2 {
    width: 15px;
    height: 1000px;
    background: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, .18)), to(rgba(0,0,0,0)));
    overflow: hidden;
  }
  #s4 {
    opacity: 1;
    -webkit-transition-duration: 0.5s;
  }
  #page-flip:hover #s4 {
    opacity: 0;
  }
  #page-flip:hover #s2 {
    -webkit-transform-origin: 300px 500px;
    -webkit-transform: translate(-15px, -500px) rotate(0deg);
  }
  #p3 {
    width: 1285px;
    height: 1388px;
    overflow: hidden;
  }
  #p3 &gt; div {
    -webkit-transform-origin: 0 0;
    -webkit-transform: translate(1255px, 500px) rotate(-32deg);
    -webkit-transition-property: -webkit-transform, -webkit-transform-origin;
    -webkit-transition-duration: 1s;
    -webkit-box-shadow: 0 0 11px rgba(0, 0, 0, .5);
    width: 285px;
    height: 388px;
    background-image: url(/attach/0713/100713111624397432/292330.jpg);
    overflow: hidden;
  }
  #p3 &gt; div &gt; div {
    width: 9px;
    height: 500px;
    float: right;
    background: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0)), to(rgba(0,0,0,.20)));
  }
  #page-flip:hover #r1 {
    -webkit-transform-origin: 1570px 500px;
    -webkit-transform: translate(-1285px, -500px) rotate(0deg);
  }
  #page-flip:hover #p1 &gt; div {
    -webkit-transform-origin: 285px 0;
    -webkit-transform: translate(1285px, 500px) rotate(0deg);
  }
  #page-flip:hover #r3 {
    -webkit-transform-origin: 1570px 500px;
    -webkit-transform: translate(-1285px, -500px) rotate(0deg);
  }
  #page-flip:hover #p3 &gt; div {
    -webkit-transform-origin: 0 0;
    -webkit-transform: translate(1000px, 500px) rotate(0deg);
  }
  #all a {
    display: block;
    position: absolute;
    margin: -20000px 0 0 0;
    padding: 1px;
    z-index: 3;
    -webkit-transition-property: margin;
    -webkit-transition-duration: 0.01s;
  }
  #coke {
    width: 253px;
    height: 158px;
  }
  #all a:hover
  {
    padding: 0;
    border: 1px dotted #92C7C1;
  }
  #page-flip:hover #coke {
    -webkit-transition-delay: .8s;
    margin: 33px 0 0 14px;
  }
  #meninas {
    width: 253px;
    height: 167px;
  }
  #page-flip:hover #meninas {
    -webkit-transition-delay: .8s;
    margin: 203px 0 0 14px;
  }
&lt;/style&gt;

&lt;div id="all"&gt; 
  &lt;div id="page-flip"&gt; 
    &lt;div id="r1"&gt;&lt;div id="p1"&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; 
    &lt;div id="p2"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt; 
    &lt;div id="r3"&gt;&lt;div id="p3"&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; 
    &lt;div class="s"&gt;&lt;div id="s3"&gt;&lt;div id="sp3"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; 
    &lt;div class="s" id="s4"&gt;&lt;div id="s2"&gt;&lt;div id="sp2"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; 
    &lt;a id="coke" href="http://www.romancortes.com/blog/pure-css-coke-can/" title="Pure CSS Coke Can"&gt;&lt;/a&gt; 
    &lt;a id="meninas" href="http://www.romancortes.com/blog/css-3d-meninas/" title="CSS 3D Meninas"&gt;&lt;/a&gt; 
  &lt;/div&gt; 
&lt;/div&gt;&lt;br /&gt;
CSS를 예술의 경지까지 끌어올린 Román Cortés씨는 순수 CSS만으로 &lt;a href="http://firejune.com/1507"&gt;3D 패럴랙스 효과&lt;/a&gt;를 만들어 내고 &lt;a href="http://firejune.com/1536"&gt;콜라 캔&lt;/a&gt;과 &lt;a href="http://firejune.com/1552"&gt;찌그러진 콜라 캔&lt;/a&gt;을 입체적으로 매핑한 경험이 있습니다. 그는 이제 조금더 실용적인 곳에 CSS 테크닉을 적용하기 시작했습니다. 위 예제 역시 약간의 HTML과 CSS만을 이용하여 작성된 것이며 마우스 행동에 따른 &lt;a href="http://www.romancortes.com/blog/pure-css3-page-flip-effect/"&gt;책장을 넘기는 효과&lt;/a&gt;가 적용되어 있습니다. 마치 플래시로 구현한 듯한 애니메이션을 보여주며, 그라디언트와 쉐도를 적절히 이용하여 사실적으로 표현했습니다. 웹킷 기반의 크롬과 사파리 브라우저에서만 작동하며 iOS나 맥OS 위의 사파리에서는 &lt;code&gt;transition&lt;/code&gt; 속성이 하드웨어 가속을 지원하기 때문에 매우 부드러운 애니메이션을 경험할 수 있습니다. iOS에서는 약간 뒤틀리긴 하지만요.&lt;br /&gt;
&lt;br /&gt;
아... 요것이랑 비슷한 것을 자바스크립트로 구현하던 짱박아둔 예제가 있었는데 완전히 새 됐군요.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1621#p1621"&gt;Comments(4)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1621"&gt;Hits(3132)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZU9jk828Am1gvEL-OIUmwECdDdo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZU9jk828Am1gvEL-OIUmwECdDdo/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/ZU9jk828Am1gvEL-OIUmwECdDdo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZU9jk828Am1gvEL-OIUmwECdDdo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">이미지를 예쁘게 하는 CSS 보더</title><link rel="alternate" type="text/html" href="http://firejune.com/1620" /><category term="웹개발" /><category term="자료" /><category term="팬시" /><category term="보더" /><category term="RGBA" /><category term="CSS3" /><category term="CSS" /><category term="이미지" /><author><name>파이어준</name></author><updated>2010-07-08T23:47:08-07:00</updated><id>http://firejune.com/1620</id><content type="html">Evan Byrne씨는 간단한 CSS 아이디어로 &lt;a href="http://www.evanbyrne.com/article/fancy-inset-css-image-borders"&gt;이미지를 더욱 예쁘게 표현하는 보더&lt;/a&gt;를 만드는 방법에 대하여 소개했습니다. 이것은 CSS 가짜 요소를 사용하는 방법입니다. &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;요소에는 가짜 요소를 사용할 수 없기 때문에 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;요소를 추가하고 &lt;code&gt;:after&lt;/code&gt; 가짜요소에 스타일을 지정합니다. 이때 &lt;code&gt;font-size&lt;/code&gt;와 &lt;code&gt;ine-height&lt;/code&gt;속성으로 보더와 이미지 사이에 생기는 공백을 제거해 주어었네요. 결과는 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;

&lt;style type="text/css"&gt;
.fancy{
	position:relative;
	display:inline-block;
	font-size:0;
	line-height:0;
}

.fancy:after{
	position:absolute;
	top:1px;
	left:1px;
	bottom:1px;
	right:1px;
	border:1px solid rgba(255,255,255,0.5);
	outline:1px solid rgba(0,0,0,0.2);
	content:" ";
}
&lt;/style&gt;
&lt;br /&gt;

&lt;h3&gt;적용전:&lt;/h3&gt;
&lt;img src="http://firejune.com/attach/0709/100709151617006404/882988.jpg" width="400" height="200" alt="dingo.jpg"/&gt;

&lt;h3&gt;적용후:&lt;/h3&gt;
&lt;span class="fancy" onclick="Sound.play('naturea');"&gt;
&lt;img src="http://firejune.com/attach/0709/100709151617006404/882988.jpg" width="400" height="200" alt="dingo.jpg"/&gt;
&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;코드:&lt;/h3&gt;&lt;pre class="html"&gt;&lt;code class="html"&gt;&amp;lt;span class="fancy"&amp;gt;&amp;lt; img src="dingo.jpg" /&amp;gt;&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class="css"&gt;&lt;code class="css"&gt;.fancy{
	position:relative;
	display:inline-block;
	font-size:0;
	line-height:0;
}

.fancy:after{
	position:absolute;
	top:1px;
	left:1px;
	bottom:1px;
	right:1px;
	border:1px solid rgba(255,255,255,0.5);
	outline:1px solid rgba(0,0,0,0.2);
	content:" ";
}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
보더와 겹친 이미지 영역이 살짝 묻어나오는 것이 마치 포토샵으로 처리한 것 같죠? CSS3의 명세인 RGBA로 색상을 지정했기 때문에 IE계열 브라우저에서는 작동하지 않습니다. ;)
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1620#p1620"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1620"&gt;Hits(1853)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3MFJOmlz9MSDpQuBiArjyNxHfvA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3MFJOmlz9MSDpQuBiArjyNxHfvA/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/3MFJOmlz9MSDpQuBiArjyNxHfvA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3MFJOmlz9MSDpQuBiArjyNxHfvA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">스타크래프트 II 베타 패치 16</title><link rel="alternate" type="text/html" href="http://firejune.com/1619" /><category term="게임/오락" /><category term="문화" /><category term="스타크래프트2" /><category term="최종 베타" /><category term="이번 주말은 버로우 모드다!" /><author><name>파이어준</name></author><updated>2010-07-08T07:32:19-07:00</updated><id>http://firejune.com/1619</id><content type="html">&lt;img src="http://firejune.com/attach/0708/100708231822872358/794867.png" width="655" height="384" alt="sc2.png" /&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;h3&gt;일반 &lt;/h3&gt;
&lt;ul class="square"&gt;
  &lt;li&gt;집결 지점을 지정하면 유닛이 이제 '공격 이동' 명령이 아닌 '이동' 명령을 받습니다.&lt;/li&gt;
  &lt;li&gt;플레이어의 캐릭터 코드를 이용해서 스타크래프트 II 캐릭터 친구를 추가하는 기능이 생겼습니다. 캐릭터 친구 코드는 서버에서 지정한 숫자 코드이고, 친구 추가 창에 있습니다.&lt;/li&gt;
  &lt;li&gt;Battle.net 업적과 보상이 더 새로워졌습니다.
이제 '빠른 대전'에서 1대1, 2대2, 3대3, 4대4, 개별 전투 등 가능한 모드를 모두 이용할 수 있습니다.&lt;/li&gt;
  &lt;li&gt;이제 모든 난이도의 인공지능과 플레이할 수 있습니다.&lt;/li&gt;
  &lt;li&gt;플레이 모드 중 인공지능 플레이어를 상대로 하는 협동전을 선택할 수 있습니다.&lt;/li&gt;
  &lt;li&gt;월드 오브 워크래프트와 스타크래프트 II에서 게임 간 통합 커뮤니티 기능을 지원합니다.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;저그 밸런스 조정&lt;/h3&gt;
&lt;ul class="square"&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;감염충&lt;/strong&gt;&lt;/p&gt;
    &lt;p&gt;광기 기술이 삭제되었습니다.&lt;/p&gt;
    &lt;p&gt;감염된 테란 기술이 추가되었습니다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;감시군주&lt;/strong&gt;&lt;/p&gt;
    감염된 테란 기술이 삭제되었습니다.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;울트라리스크&lt;/strong&gt;&lt;/p&gt;
    기절과 정신 제어에 면역입니다.
  &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
드디어 최종 베타가 곧 시작된다고 합니다. 그리고 현재 16번째 패치를 적용할 수 있습니다. 업데이트하는 시간이 재법 걸리니 미리미리 적용해 놓으시기 바랍니다. 우후훗!
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1619#p1619"&gt;Comments(4)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1619"&gt;Hits(1002)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Wy0nuXzC9X1cq3L2R7kCbpa_Mf4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wy0nuXzC9X1cq3L2R7kCbpa_Mf4/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/Wy0nuXzC9X1cq3L2R7kCbpa_Mf4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wy0nuXzC9X1cq3L2R7kCbpa_Mf4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">Scripty2 하드웨어 가속 애니메이션 테스트</title><link rel="alternate" type="text/html" href="http://firejune.com/1618" /><category term="웹개발" /><category term="자료" /><category term="Scripty2" /><category term="맥OS" /><category term="iOS" /><category term="CSS" /><category term="transform" /><category term="자바스크립트" /><category term="Effect.Morph" /><category term="나오긴 하는거에요?" /><author><name>파이어준</name></author><updated>2010-07-07T01:43:57-07:00</updated><id>http://firejune.com/1618</id><content type="html">&lt;a href="http://scripty2.com/accel/"&gt;&lt;img style="border: 1px solid #aaa;" src="http://firejune.com/attach/0707/100707153407499591/178622.png" width="636" height="299" alt="scripty2.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://scripty2.com/"&gt;Scripty2&lt;/a&gt; 프로젝트 오너인 &lt;a href="http://mir.aculo.us"&gt;Thomas Fuchs&lt;/a&gt;씨는 하드웨어 가속을 지원하는 &lt;a href="http://scripty2.com/accel/"&gt;애니메이션 테스트 페이지&lt;/a&gt;를 만들고 공개했습니다. 그가 말하는 하드웨어 가속은 맥OS와 iOS에서만 지원되는 CSS transforms을 이용하는 것으로 &lt;code&gt;Effect.Morph&lt;/code&gt;을 이용한 자바스크립트 애니메이션에서 가속 지원여부를 판단하여 처리합니다. 그래서 맥OS용 사파리 또는 아이폰, 아이패드용 사파리에서만 하드웨어 가속을 경험할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
반가운 소식으로는 올 여름 베타 테스트를 진행하게 될 것이라고 했습니다. 사용자 친화적인 API들, 하드웨어 가속을 지원하는 특수효과, 테마 지원, 확장 가능한 UI 컴포넌트들, 멀티-터치 지원, 그리고 API문서가 함께 공개된다고 합니다. 3년이라는 시간동안 겨우 알파 딱지를 떼는군요. 참 느긋한 분이에요.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1618#p1618"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1618"&gt;Hits(1270)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pGhbKRDqEL7lZyZ6LiElaKM7AJY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pGhbKRDqEL7lZyZ6LiElaKM7AJY/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/pGhbKRDqEL7lZyZ6LiElaKM7AJY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pGhbKRDqEL7lZyZ6LiElaKM7AJY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">Web Forms 2.0을 모든 브라우저에서 - webforms2</title><link rel="alternate" type="text/html" href="http://firejune.com/1617" /><category term="웹개발" /><category term="자료" /><category term="HTML5" /><category term="Web Forms 2.0" /><category term="자바스크립트" /><category term="라이브러리" /><category term="찜!" /><author><name>파이어준</name></author><updated>2010-07-06T04:31:50-07:00</updated><id>http://firejune.com/1617</id><content type="html">HTML5 명세에 포함된 &lt;a href="http://www.whatwg.org/specs/web-forms/current-work/"&gt;Web Forms 2.0&lt;/a&gt;을 이용하면 자바스크립트의 도움을 받지 않고도 입력 조건 설정이나 유효성 검사 및 오류 메시지 출력, 동적 레이블, 데이트 피커, 슬라이더 등의 막강한 기능들을 마크업만으로 사용할 수 있습니다. 그리고 IE 6, 7을 비롯한 HTML5를 지원하지 않는 일부 브라우저에서는 Weston Ruter씨가 만든 &lt;a href="http://code.google.com/p/webforms2/"&gt;webforms2&lt;/a&gt; 자바스크립트 라이브러리를 이용하면 동일한 코드만으로 Web Forms 2.0을 사용할 수 있게 됩니다.&lt;br /&gt;
&lt;br /&gt;
사용방법은 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;요소 안에 webform2.js 파일를 로드하는 것입니다:&lt;br /&gt;
&lt;pre class="html"&gt;&lt;code class="html"&gt;&amp;lt;script type='text/javascript' src='webforms2.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Weston Ruter씨는  Web Forms 2.0 명세가 HTML5로 옮겨 가면서 기껏 만들어 놓은 반목 모델(Repetition model)이 제외(drop)되었었다고 합니다. 그래서 현재 프로젝트는 중단한 상태이며 모든 것이 명확해지면 작업을 재개하여 IE8을 포함한 더욱 많은 브라우저를 지원하게 될 것이라고 했습니다.&lt;br /&gt;
&lt;br /&gt;
나중에 이 프로젝트가 완성되면 거의 필수 라이브러리가 되겠군요. 찜!
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1617#p1617"&gt;Comments(2)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1617"&gt;Hits(1567)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/J5uppGMcVpQeICJx9JdkQEy6Dsg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J5uppGMcVpQeICJx9JdkQEy6Dsg/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/J5uppGMcVpQeICJx9JdkQEy6Dsg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J5uppGMcVpQeICJx9JdkQEy6Dsg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">HTML5 오픈 컨퍼런스 발표자료 공유</title><link rel="alternate" type="text/html" href="http://firejune.com/1616" /><category term="웹개발" /><category term="자료" /><category term="HTML5" /><category term="자바스크립트" /><category term="API" /><category term="발표자료" /><author><name>파이어준</name></author><updated>2010-07-02T06:31:05-07:00</updated><id>http://firejune.com/1616</id><content type="html">&lt;iframe src="http://html5.firejune.com/api.html" width="664" height="525" style="border: 1px solid #aaa;"&gt;
&lt;/iframe&gt;&lt;p class="cap1"&gt;슬라이드를 클릭한 후 방향키를 이용하여 다음으로 넘길수 있습니다.&lt;/p&gt;
&lt;br /&gt;
금일 있었던 &lt;a href="http://webappscon.com/html5/"&gt;HTML5 오픈 컨퍼런스&lt;/a&gt;에서 &lt;a href="http://html5.firejune.com/api.html"&gt;발표한 자료&lt;/a&gt;를 공유합니다. 웹에 공개된 예제와 코드들로 구성했기 때문에 이미 알고 계신 분들도 있을 줄로 압니다. 발표를 앞두고 충분한 준비시간을 가지지 못해 실수가 잦았습니다. 전달해 드리고 싶은 내용이 많았지만 예상치 못한 상황들이 전개되는 바람에 엉뚱한 곳에 시간을 소비했습니다. 컨퍼런스 종료 후 나눠드린 "&lt;a href="http://webstandards.or.kr/html5"&gt;실전 HTML5 가이드&lt;/a&gt;"책자에 발표때 못다한 &lt;a href="http://html5.firejune.com/doc.html"&gt;내용들이 실려&lt;/a&gt;있어 조금이나마 위안이 되는군요. 이번 행사를 진행하느라 고생하신 모든 분들과 여러모로 도움주신 &lt;a href="http://frends.kr"&gt;FRENDS 회원님들&lt;/a&gt; 그리고 부족함에도 불구하고 재미있게 경청해 주신 여러분께 진심으로 감사드립니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1616#p1616"&gt;Comments(14)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1616"&gt;Hits(2956)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/llizEF7iWbK1haFgpltut9SfWq0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/llizEF7iWbK1haFgpltut9SfWq0/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/llizEF7iWbK1haFgpltut9SfWq0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/llizEF7iWbK1haFgpltut9SfWq0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">Momentile의 IE6 거부 메시지</title><link rel="alternate" type="text/html" href="http://firejune.com/1615" /><category term="웹개발" /><category term="자료" /><category term="IE6" /><category term="호환성" /><category term="거부" /><category term="메시지" /><category term="브라우저" /><category term="왕따" /><author><name>파이어준</name></author><updated>2010-06-28T17:16:29-07:00</updated><id>http://firejune.com/1615</id><content type="html">&lt;a href="http://www.flickr.com/photos/robotjohnny/3629069606/sizes/l/in/dateposted/"&gt;&lt;img src="http://firejune.com/attach/0629/100629090538417636/763086.jpg" width="666" height="466" alt="pretty.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
위 화면은 IE6으로 &lt;a href="http://www.momentile.com/"&gt;Momentile&lt;/a&gt; 웹 사이트에 접근시 나타나는 화면입니다. 왠지 IE6이 측은하게 느껴지네요.&lt;!--&lt;br /&gt;
IE6의 말: 얘들아, 나랑 놀아줘!&lt;br /&gt;
사파리의 말: 꺼져 쉑캬!&lt;br /&gt;
오페라의 말: 맞다, 이기 또 우리꺼 해 쳐 물라칸데이!&lt;br /&gt;
파이어폭스의 말: 내사 저 잡것들 참말로 못믿것어~&lt;br /&gt;
IE7의 말: 난 끌어들이지 마.--&gt;
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1615#p1615"&gt;Comments(3)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1615"&gt;Hits(1727)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Gb44C2BATda1Mz_dWAZg_4ezcGE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Gb44C2BATda1Mz_dWAZg_4ezcGE/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/Gb44C2BATda1Mz_dWAZg_4ezcGE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Gb44C2BATda1Mz_dWAZg_4ezcGE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">순수 CSS만으로 만든 iOS 아이콘들</title><link rel="alternate" type="text/html" href="http://firejune.com/1614" /><category term="웹개발" /><category term="자료" /><category term="CSS3" /><category term="Pure" /><category term="iOS" /><category term="CSS" /><category term="그럼 SVG는 머하러 나온거냐?" /><author><name>파이어준</name></author><updated>2010-06-27T07:16:48-07:00</updated><id>http://firejune.com/1614</id><content type="html">Louis Harboe씨는 순수 CSS만을 이용하여 &lt;a href="http://blog.graphicpeel.com/post/740928981/ios-icons-made-in-pure-css"&gt;iOS의 11개 아이콘들&lt;/a&gt;을 만들었습니다.  둥근 모서리, 그림자, 그라디언트, RGBA, 가짜 요소를 응용한 것이라고 합니다. CSS만으로 SVG수준의 리치 스타일링이 가능하다는 것을 보여주는 듯 합니다. 이 데모는 웹킷기반 브라우저에서 제대로 보이며 사파리에 최적화되었습니다.&lt;br /&gt;
&lt;link rel="stylesheet" href="/attach/0627/100627224958996196/496697.css" type="text/css" /&gt;
&lt;div class="youtube icon"&gt;
  &lt;div class="tv"&gt;
    &lt;div class="screen-border"&gt;
      &lt;div class="screen"&gt;
        &lt;div class="screen-gloss"&gt;&lt;/div&gt;
      &lt;/div&gt;&lt;/div&gt;
    &lt;div class="knob-left"&gt;
      &lt;div class="knob-handle"&gt;
        &lt;div class="knob-handle-center"&gt;&lt;/div&gt;
      &lt;/div&gt;&lt;/div&gt;
    &lt;div class="speaker-grill"&gt;
      &lt;div class="slit1"&gt;&lt;/div&gt;
      &lt;div class="slit2"&gt;&lt;/div&gt;
      &lt;div class="slit3"&gt;&lt;/div&gt;
      &lt;div class="slit4"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="knob-right"&gt;
      &lt;div class="knob-handle"&gt;
        &lt;div class="knob-handle-center"&gt;&lt;/div&gt;
      &lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/div&gt;
&lt;div class="notes icon"&gt;
  &lt;div class="header"&gt;&lt;/div&gt;
  &lt;div class="paper"&gt;
    &lt;div class="paper-rip"&gt;&lt;/div&gt;
    &lt;div class="line"&gt;&lt;/div&gt;
    &lt;div class="line"&gt;&lt;/div&gt;
    &lt;div class="line"&gt;&lt;/div&gt;
    &lt;div class="line"&gt;&lt;/div&gt;
    &lt;div class="line"&gt;&lt;/div&gt;
    &lt;div class="line-last"&gt;&lt;/div&gt;
    &lt;div class="margin-lines"&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/div&gt;
&lt;div class="maps icon"&gt;
  &lt;div class="white-streets"&gt;
    &lt;div class="top-street"&gt;&lt;/div&gt;
    &lt;div class="small-street"&gt;
      &lt;div class="small-street street1"&gt;&lt;/div&gt;
      &lt;div class="small-street street2"&gt;&lt;/div&gt;
      &lt;div class="small-street street3"&gt;&lt;/div&gt;
      &lt;div class="small-street street4"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="right-street"&gt;&lt;/div&gt;
    &lt;div class="right-street-below-horz"&gt;&lt;/div&gt;
    &lt;div class="right-street-below"&gt;&lt;/div&gt;
    &lt;div class="outer-loop"&gt;
      &lt;div class="inner-loop"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="upper-pathto-loop-left"&gt;&lt;/div&gt;
    &lt;div class="upper-pathto-loop"&gt;&lt;/div&gt;
    &lt;div class="lower-pathto-loop-left"&gt;&lt;/div&gt;
    &lt;div class="lower-pathto-loop"&gt;&lt;/div&gt;
    &lt;div class="intersection"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="yellow-street-border"&gt;
    &lt;div class="yellow-street"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="orange-street"&gt;&lt;/div&gt;
  &lt;div class="road-sign"&gt;
    &lt;div class="road-sign-top"&gt;&lt;/div&gt;
    &lt;div class="road-sign-bottom"&gt;
      280
    &lt;/div&gt;&lt;/div&gt;
  &lt;div class="pin-top"&gt;&lt;/div&gt;
  &lt;div class="pin-rod"&gt;&lt;/div&gt;
  &lt;div class="pin-hole"&gt;&lt;/div&gt;
  &lt;div class="pin-rod-shadow"&gt;&lt;/div&gt;
  &lt;div class="pin-head-shadow"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="idisk icon"&gt;
  &lt;div class="top"&gt;
    &lt;div class="gloss"&gt;&lt;/div&gt;
    &lt;div class="cloud-base"&gt;&lt;/div&gt;
    &lt;div class="large-puff"&gt;&lt;/div&gt;
    &lt;div class="small-puff"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="front"&gt;
    &lt;div class="LED"&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/div&gt;
&lt;div class="itunes icon"&gt;
  &lt;div class="starburst"&gt;
    &lt;div class="ray-1"&gt;&lt;/div&gt;
    &lt;div class="ray-2"&gt;&lt;/div&gt;
    &lt;div class="ray-3"&gt;&lt;/div&gt;
    &lt;div class="ray-4"&gt;&lt;/div&gt;
    &lt;div class="ray-5"&gt;&lt;/div&gt;
    &lt;div class="ray-6"&gt;&lt;/div&gt;
    &lt;div class="ray-7"&gt;&lt;/div&gt;
    &lt;div class="ray-8"&gt;&lt;/div&gt;
    &lt;div class="ray-9"&gt;&lt;/div&gt;
    &lt;div class="ray-10"&gt;&lt;/div&gt;
    &lt;div class="ray-11"&gt;&lt;/div&gt;
    &lt;div class="ray-12"&gt;&lt;/div&gt;
    &lt;div class="ray-13"&gt;&lt;/div&gt;
    &lt;div class="ray-14"&gt;&lt;/div&gt;
    &lt;div class="ray-15"&gt;&lt;/div&gt;
    &lt;div class="ray-16"&gt;&lt;/div&gt;
    &lt;div class="ray-17"&gt;&lt;/div&gt;
    &lt;div class="ray-18"&gt;&lt;/div&gt;
    &lt;div class="ray-19"&gt;&lt;/div&gt;
    &lt;div class="ray-20"&gt;&lt;/div&gt;
    &lt;div class="ray-21"&gt;&lt;/div&gt;
    &lt;div class="ray-22"&gt;&lt;/div&gt;
    &lt;div class="ray-23"&gt;&lt;/div&gt;
    &lt;div class="ray-24"&gt;&lt;/div&gt;
    &lt;div class="ray-25"&gt;&lt;/div&gt;
    &lt;div class="ray-26"&gt;&lt;/div&gt;
    &lt;div class="ray-27"&gt;&lt;/div&gt;
    &lt;div class="ray-28"&gt;&lt;/div&gt;
    &lt;div class="ray-29"&gt;&lt;/div&gt;
    &lt;div class="ray-30"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="starburst burst-2"&gt;
    &lt;div class="ray-1"&gt;&lt;/div&gt;
    &lt;div class="ray-2"&gt;&lt;/div&gt;
    &lt;div class="ray-3"&gt;&lt;/div&gt;
    &lt;div class="ray-4"&gt;&lt;/div&gt;
    &lt;div class="ray-5"&gt;&lt;/div&gt;
    &lt;div class="ray-6"&gt;&lt;/div&gt;
    &lt;div class="ray-7"&gt;&lt;/div&gt;
    &lt;div class="ray-8"&gt;&lt;/div&gt;
    &lt;div class="ray-9"&gt;&lt;/div&gt;
    &lt;div class="ray-10"&gt;&lt;/div&gt;
    &lt;div class="ray-11"&gt;&lt;/div&gt;
    &lt;div class="ray-12"&gt;&lt;/div&gt;
    &lt;div class="ray-13"&gt;&lt;/div&gt;
    &lt;div class="ray-14"&gt;&lt;/div&gt;
    &lt;div class="ray-15"&gt;&lt;/div&gt;
    &lt;div class="ray-16"&gt;&lt;/div&gt;
    &lt;div class="ray-17"&gt;&lt;/div&gt;
    &lt;div class="ray-18"&gt;&lt;/div&gt;
    &lt;div class="ray-19"&gt;&lt;/div&gt;
    &lt;div class="ray-20"&gt;&lt;/div&gt;
    &lt;div class="ray-21"&gt;&lt;/div&gt;
    &lt;div class="ray-22"&gt;&lt;/div&gt;
    &lt;div class="ray-23"&gt;&lt;/div&gt;
    &lt;div class="ray-24"&gt;&lt;/div&gt;
    &lt;div class="ray-25"&gt;&lt;/div&gt;
    &lt;div class="ray-26"&gt;&lt;/div&gt;
    &lt;div class="ray-27"&gt;&lt;/div&gt;
    &lt;div class="ray-28"&gt;&lt;/div&gt;
    &lt;div class="ray-29"&gt;&lt;/div&gt;
    &lt;div class="ray-30"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gloss"&gt;&lt;/div&gt;
  &lt;div class="circle"&gt;
    &lt;div class="circle-center"&gt;&lt;/div&gt;
    &lt;div class="note-top"&gt;&lt;/div&gt;
    &lt;div class="note-legs"&gt;
      &lt;div class="note-leg-left"&gt;&lt;/div&gt;
      &lt;div class="note-leg-right"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="note-feet"&gt;
      &lt;div class="note-foot-left"&gt;&lt;/div&gt;
      &lt;div class="note-foot-right"&gt;&lt;/div&gt;
    &lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="contacts icon"&gt;
  &lt;div class="cover"&gt;
    &lt;div class="binding"&gt;
      &lt;div class="holes"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="rings"&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
        &lt;div class="ring"&gt;&lt;/div&gt;
      &lt;/div&gt;&lt;/div&gt;
    &lt;div class="cover-overlay"&gt;&lt;/div&gt;
    &lt;div class="head"&gt;&lt;/div&gt;
    &lt;div class="neck"&gt;&lt;/div&gt;
    &lt;div class="shoulder"&gt;&lt;/div&gt;
    &lt;div class="shoulder shoulder-shadow"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="tabs"&gt;
    &lt;div class="tab-first" id="tab1"&gt;&lt;/div&gt;
    &lt;div class="tab-mid" id="tab2"&gt;&lt;/div&gt;
    &lt;div class="tab-mid" id="tab3"&gt;&lt;/div&gt;
    &lt;div class="tab-mid" id="tab4"&gt;&lt;/div&gt;
    &lt;div class="tab-last" id="tab5"&gt;&lt;/div&gt;
    &lt;div id="tab6"&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/div&gt;
&lt;div class="calendar icon"&gt;
  &lt;div class="header"&gt;
    &lt;p class="weekday"&gt;
      Monday
    &lt;/p&gt;&lt;/div&gt;
  &lt;div class="paper"&gt;
    &lt;p class="daynumber"&gt;
      7
    &lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="voicememos icon"&gt;
  &lt;div class="gloss"&gt;&lt;/div&gt;
  &lt;div class="mic"&gt;
    &lt;div class="holes"&gt;
      &lt;div class="hole-row-1"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="hole-row-2"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="hole-row-3"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="hole-row-4"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="hole-row-5"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="hole-row-6"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
      &lt;/div&gt;
      &lt;div class="hole-row-7"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="hole-row-6"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="hole-row-5"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="hole-row-4"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="hole-row-3"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="hole-row-2"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;div class="hole-row-1"&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;
        &lt;div class="hole"&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="mic-body"&gt;
      &lt;div class="front-highlights"&gt;&lt;/div&gt;
      &lt;div class="front-shading"&gt;&lt;/div&gt;
      &lt;div class="top-highlight"&gt;&lt;/div&gt;
      &lt;div class="band"&gt;
        &lt;div class="band-symbol"&gt;z&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="shell"&gt;
      &lt;div class="left-knob-base"&gt;&lt;/div&gt;
      &lt;div class="right-knob-base"&gt;&lt;/div&gt;
      &lt;div class="left-knob-head"&gt;&lt;/div&gt;
      &lt;div class="right-knob-head"&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div class="stem"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="messages icon"&gt;
  &lt;div class="diagonal-lines"&gt;
    &lt;div class="diag-1"&gt;&lt;/div&gt;
    &lt;div class="diag-2"&gt;&lt;/div&gt;
    &lt;div class="diag-3"&gt;&lt;/div&gt;
    &lt;div class="diag-4"&gt;&lt;/div&gt;
    &lt;div class="diag-5"&gt;&lt;/div&gt;
    &lt;div class="diag-6"&gt;&lt;/div&gt;
    &lt;div class="diag-7"&gt;&lt;/div&gt;
    &lt;div class="diag-8"&gt;&lt;/div&gt;
    &lt;div class="diag-9"&gt;&lt;/div&gt;
    &lt;div class="diag-10"&gt;&lt;/div&gt;
    &lt;div class="diag-11"&gt;&lt;/div&gt;
    &lt;div class="diag-12"&gt;&lt;/div&gt;
    &lt;div class="diag-13"&gt;&lt;/div&gt;
    &lt;div class="diag-14"&gt;&lt;/div&gt;
    &lt;div class="diag-15"&gt;&lt;/div&gt;
    &lt;div class="diag-16"&gt;&lt;/div&gt;
    &lt;div class="diag-17"&gt;&lt;/div&gt;
    &lt;div class="diag-18"&gt;&lt;/div&gt;
    &lt;div class="diag-19"&gt;&lt;/div&gt;
    &lt;div class="diag-20"&gt;&lt;/div&gt;
    &lt;div class="diag-21"&gt;&lt;/div&gt;
    &lt;div class="diag-22"&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;div class="gloss"&gt;&lt;/div&gt;
  &lt;div class="oval-speech"&gt;&lt;/div&gt;
  &lt;div class="oval-speech oval-speech-shadow"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="calculator icon"&gt;
  &lt;div class="top-left"&gt;+&lt;/div&gt;
  &lt;div class="top-right"&gt;&amp;minus;&lt;/div&gt;
  &lt;div class="bottom-left"&gt;&amp;times;&lt;/div&gt;
  &lt;div class="bottom-right"&gt;=&lt;/div&gt;
  &lt;div class="vertical-divider"&gt;&lt;/div&gt;
  &lt;div class="horizontal-divider"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class="weather icon"&gt;
  &lt;div class="gloss"&gt;&lt;/div&gt;
  &lt;div class="sun-container"&gt;
    &lt;div class="sun-shadow"&gt;&lt;/div&gt;
    &lt;div class="sun"&gt;
      &lt;div class="sun-highlight"&gt;&lt;/div&gt;
      &lt;div class="sun-glow"&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div class="rays"&gt;
      &lt;div class="ray-1"&gt;&lt;/div&gt;
      &lt;div class="ray-2"&gt;&lt;/div&gt;
      &lt;div class="ray-3"&gt;&lt;/div&gt;
      &lt;div class="ray-4"&gt;&lt;/div&gt;
      &lt;div class="ray-5"&gt;&lt;/div&gt;
      &lt;div class="ray-6"&gt;&lt;/div&gt;
      &lt;div class="ray-7"&gt;&lt;/div&gt;
      &lt;div class="ray-8"&gt;&lt;/div&gt;
      &lt;div class="ray-9"&gt;&lt;/div&gt;
      &lt;div class="ray-10"&gt;&lt;/div&gt;
      &lt;div class="ray-11"&gt;&lt;/div&gt;
      &lt;div class="ray-12"&gt;&lt;/div&gt;
      &lt;div class="ray-13"&gt;&lt;/div&gt;
      &lt;div class="ray-14"&gt;&lt;/div&gt;
      &lt;div class="ray-15"&gt;&lt;/div&gt;
      &lt;div class="ray-16"&gt;&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="temperature"&gt;
    &amp;nbsp;73&amp;deg;
  &lt;/div&gt;
&lt;/div&gt;
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1614#p1614"&gt;Comments(1)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1614"&gt;Hits(1830)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FRkOSXo2I_azeer9W0mrt7xoEB8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FRkOSXo2I_azeer9W0mrt7xoEB8/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/FRkOSXo2I_azeer9W0mrt7xoEB8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FRkOSXo2I_azeer9W0mrt7xoEB8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">스타일 시트를 경량화하는 11가지 팁</title><link rel="alternate" type="text/html" href="http://firejune.com/1613" /><category term="웹개발" /><category term="자료" /><category term="CSS" /><category term="스타일시트" /><category term="팁" /><category term="경량화" /><category term="Micro-Optimization" /><author><name>파이어준</name></author><updated>2010-06-22T23:33:10-07:00</updated><id>http://firejune.com/1613</id><content type="html">Jeff Starr씨는 &lt;a href="http://perishablepress.com/press/2010/06/21/how-to-micro-optimize-your-css/"&gt;스타일 시트를 경량화(Micro-Optimization)하는 11가지 팁&lt;/a&gt;을 소개했습니다. 이것은 코드 전체를 &lt;a href="http://www.cssdrive.com/index.php/main/csscompressor/"&gt;압축(Minify)&lt;/a&gt;하는 것이 아닌, CSS 코드 자체를 효율적으로 작성하거나 배포하는 방법입니다. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Tip #1: 색상 값을 짧게 쓰기&lt;/h3&gt; 색상을 지정하는 속성에 값을 기입할 때 가능하면 가장 짧은 값을 사용합니다.&lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt;article { background-color: rgb(255,255,255); } /* WTF? */
article { background-color: #ffffff; } /* better */
article { background-color: #fff; } /* good */
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Tip #2: 중복되는 속성을 병합하기&lt;/h3&gt; 반복적으로 중복되는 속성들은 통합합니다. 이 작업을 자동으로 처리해 주는 &lt;a href="http://flumpcakes.co.uk/css/optimiser/"&gt;온라인 CSS 최적화&lt;/a&gt; 서비스도 있으니 참고하세요.&lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt;/* before */
#wrap p {
	font-family: Georgia, serif;
	font-weight: normal;
	line-height: 1.33em;
	font-size: 1.22em;
	}
	.
	.
	.
p {
	font-family: Georgia, serif;
	font-weight: normal;
	line-height: 1.33em;
	font-size: 1.33em;
	}

/* after */
p {
	font-family: Georgia, serif;
	font-weight: normal;
	line-height: 1.33em;
	font-size: 1.33em;
	}
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Tip #3: 가능한 한 몰아쓰기&lt;/h3&gt; CSS 속성들 중에는 여러 값을 인식하는 것들이 있습니다. &lt;code&gt;font&lt;/code&gt;나 &lt;code&gt;background&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt; 등이 그렇습니다. 이런  경우 한줄로 몰아씁니다.&lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt;/* before */
p {
	font-family: Georgia, serif;
	font-weight: normal;
	line-height: 1.33em;
	font-size: 1.33em;
	}

/* after */
p {
	font: normal 1.33em/1.33 Georgia, serif;
	}

/* these 4 properties */
background-color: #fff;
background-image: url(i/dope.png);
background-repeat: repeat-x;
background-position: 0 0;
 
/* can be written as */
background: #fff url(i/dope.png) repeat-x 0 0;

/* these 4 properties */
margin-top:    10px;
margin-right:  20px;
margin-bottom: 10px;
margin-left:   20px;

/* can be written as */
margin: 10px 20px 10px 20px;

/* these 3 properties */
border-width: 1px;
border-style: solid;
border-color: red;

/* can be written as */
border: 1px solid red;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Tip #4: 같은 값은 결합하기&lt;/h3&gt;&lt;code&gt;padding&lt;/code&gt; 혹은 &lt;code&gt;margin&lt;/code&gt; 속성의 값이 동일한 경우 통합하여 지정할 수 있습니다.&lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt; /* before */
margin: 10px 20px 10px 20px;
padding: 10px 10px 10px 10px;

/* after */
margin: 10px 20px;
padding: 10px;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Tip #5: 불필요한 "0"은 생략하기&lt;/h3&gt;소수점 이하의 수를 사용하거나 무의마한 "0"은 생략할 수 있습니다.&lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt;/* before */
padding: 0.1em;
margin: 10.0em;

/* after */
padding: .1em;
margin: 10em;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Tip #6: 값이 "0"이면 단위 생략하기&lt;/h3&gt;값의 크기가 0이라면 단위는 생략해도 무방합니다.&lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt;/* before */
padding: 0px;
margin: 0em;

/* before */
padding: 0;
margin: 0;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Tip #7: 마지막 세미콜론 생략하기&lt;/h3&gt;속성 기입이 끝나는 마지막의 세미콜론(;)은 생략해도 무방합니다.&lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt;/* before*/
p {
	font-family: Georgia, serif;
	font-weight: normal;
	line-height: 1.33em;
	font-size: 1.33em;
	}

/* after */
p {
	font-family: Georgia, serif;
	font-weight: normal;
	line-height: 1.33em;
	font-size: 1.33em
	}

/* optimized */
p { font: normal 1.33em/1.33 Georgia, serif }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Tip #8: 배포하기 전 코멘트 제거하기&lt;/h3&gt;작업과정에서 주석을 사용하는 것은 분명 도움이 되고 협업에도 유리합니다. 그러나 사용자에게는 100% 불필요한 데이터이며 무의미한 서버자원과 대역폭을 소비하므로 배포하기 전에는 반드시 코멘트를 제거하도록 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Tip #9: 공백 제거하기&lt;/h3&gt;값을 구분하기 위한 공백을 제외한 나머지 빈 공간은 모두 제거합니다.&lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt;/* before */
body {
	font-family: "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
	background-color: #333;
	text-align: center;
	margin: 0px auto;
	font-size: 62.5%;
	color: #FFF;
	}

/* after */
body{font-family:"Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-align:center;background:#333;margin:0px auto;font-size:62.5%;color:#fff}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Tip #10: 줄바꿈 제거하기&lt;/h3&gt;효율적인 관리를 위해 탭(또는 공백) 그리고 줄바꿈을 삭제합니다. 싱글-라인 포멧으로 작성하는 것이 미친짓으로 보일지 모르겠지만 의외로 실용적인 작성법입니다. 성능 향상을 꾀하면서도 스크롤을 줄일 수 있고 프로퍼티 단위 디버깅이 가능하기 때문입니다.&lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt;/* before */
hr {
	margin: 25px 0 25px 0;
	background: #CF7400;
	text-align: left;
	padding: 15px 0;
	display: block;
	border: 0 none;
	color: #CF7400;
	height: 1px;
	clear: both;
	width: 96%;
	}
acronym, abbr {
	border-bottom: 1px dotted #514031;
	cursor: help;
	}
ins { text-decoration: underline; }
del { text-decoration: line-through; }
sup {
	font-size: 10px;
	line-height: 0;
	color: #cccc99;
	}
em       { font-style: italic; }
small    { font-size: 10px;    }
strong   { font-weight: bold;  }
strong:target, h3:target, h4:target {
	background: #CF7400;
	padding-left: 25px;
	}
code, kbd, samp, tt, var {
	font-family: "Courier New", Courier, monospace, sans-serif;
	color: #cccc99; /* #cc9933 #cccc66 #cccc99 */
	font-size: 11px;
	}
	h3 code { font-size: 13px; }
pre {
	border-left: 1px solid #CF7400;
	padding: 10px 0 12px 10px;
	background: #3B2E22;
	overflow: auto;
	margin: 25px 0;
	width: 525px; /* 95% of 555px = 525px */
	}
	pre:hover {
		border-left: 1px solid #FFFFCC;
		background: #3B2E22;
		}


/* after */
hr { background:#CF7400;margin:25px 0;text-align:left;padding:15px 0;display:block;border:0 none;color:#CF7400;height:1px;clear:both;width:96%; }
acronym,abbr { border-bottom:1px dotted #514031;cursor:help; }
ins { text-decoration:underline; }
del { text-decoration:line-through; }
sup { font-size:10px;line-height:0;color:#cc9; }
em { font-style:italic; }
small { font-size:10px; }
strong { font-weight:bold; }
strong:target,h3:target,h4:target { background:#CF7400;padding-left:25px; }
code,kbd,samp,tt,var { font-family:"Courier New",Courier,monospace,sans-serif;color:#cc9;font-size:11px; }
h3 code { font-size:13px; }
pre { border-left:1px solid #CF7400;padding:10px 0 12px 10px;background:#3B2E22;overflow:auto;margin:25px 0;width:525px; }
pre:hover { border-left:1px solid #FFC;background:#3B2E22; }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Tip #11: CSS 유효성 검사하기&lt;/h3&gt;끝으로, W3C에서 제공하는 &lt;a href="http://jigsaw.w3.org/css-validator/"&gt;CSS 유효성 검사기&lt;/a&gt;를 이용하여 오류가 있는지를 검토하세요. 당신이 놓쳤을 수도 있는 잡다한 오류들을 빠르게 찾아줍니다.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Bonus Tips: 보너스 팁들&lt;/h3&gt;이 게시물을 작성하는 동안 몇 가지 다른 아이디어가 떠올랐습니다. &lt;br /&gt;
&lt;pre class="css"&gt;&lt;code class="css"&gt;a:link, a:visited {} /* before */
a:link,a:visited{} /* after */

/* before */
h1{color:#111}
h2{color:#333}
h3{color:#777}

/* after */
h1{color:#111}h2{color:#333}h3{color:#777}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
위에서 언급한 팁들 중에는 자동으로 처리할 수 있는 것들이 있습니다. 온라인 도구를 사용하거나 서비스 빌드과정에 포함하여 자동화 할 수도 있다는 사실을 잊지 마세요. 그리고 규모가 큰 프로젝트는 배포/개발 버전을 구분해서 관리하는 것이 가장 효율적입니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1613#p1613"&gt;Comments(2)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1613"&gt;Hits(2654)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R_O2K8s9_-lVN7IUwIgML4Tf3qg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R_O2K8s9_-lVN7IUwIgML4Tf3qg/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/R_O2K8s9_-lVN7IUwIgML4Tf3qg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R_O2K8s9_-lVN7IUwIgML4Tf3qg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">HTML5 오픈 컨퍼런스 발표 참여</title><link rel="alternate" type="text/html" href="http://firejune.com/1612" /><category term="웹개발" /><category term="자료" /><category term="HTML5" /><category term="컨퍼런스" /><category term="발표" /><category term="자바스크립트" /><category term="API" /><author><name>파이어준</name></author><updated>2010-06-22T02:01:43-07:00</updated><id>http://firejune.com/1612</id><content type="html">&lt;a href="http://webappscon.com/html5/"&gt;&lt;img src="http://firejune.com/attach/0622/100622134844371418/884176.jpg" width="666" height="254" style="border: 1px solid #aaa;" alt="html5openconference.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
과분하게도 한국 웹 표준 프로젝트에서 주최하는 "&lt;a href="http://webappscon.com/html5/"&gt;HTML5 오픈 컨퍼런스&lt;/a&gt;"에서 HTML5 자바스크립트 API에 대하여 발표하게 되었습니다. 학동 건설회관에서 7월 2일(금) 오후 1시에 시작합니다. 그런데 아쉽게도 예약 접수가 시작된지 24시간이 되기도 전에 650석이 모두 매진 되었다고 합니다. &lt;a href="http://firejune.com/1591"&gt;지난 세미나 발표&lt;/a&gt;때 아쉬운 부분들을 보강해서 재미있게 진행해 볼 생각입니다. 벌써부터 후달리기 시작하네요.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1612#p1612"&gt;Comments(7)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1612"&gt;Hits(1332)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1zyc7KNYI1xvHryT-SDXs1Kk2Vk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1zyc7KNYI1xvHryT-SDXs1Kk2Vk/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/1zyc7KNYI1xvHryT-SDXs1Kk2Vk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1zyc7KNYI1xvHryT-SDXs1Kk2Vk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">HTML5 모바일 웹 애플리케이션 개발 - Sencha Touch</title><link rel="alternate" type="text/html" href="http://firejune.com/1611" /><category term="웹개발" /><category term="자료" /><category term="HTML5" /><category term="Sencha" /><category term="Sencha Touch" /><category term="ExtJS" /><category term="jQTouch" /><category term="Raphaël" /><category term="iOS" /><category term="안드로이드" /><author><name>파이어준</name></author><updated>2010-06-20T21:19:40-07:00</updated><id>http://firejune.com/1611</id><content type="html">&lt;a href="http://www.sencha.com/products/touch/"&gt;&lt;img src="http://firejune.com/attach/0621/100621114812273675/207258.jpg" width="666" height="347" alt="20100616family.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
얼마전 ExtJS는 &lt;a href="http://www.jqtouch.com/"&gt;jQTouch&lt;/a&gt;와 &lt;a href="http://www.jqtouch.com/"&gt;Raphaël&lt;/a&gt; 프로젝트를 결합하고 회사이름을 "Sencha"로 변경했습니다. 이제부터 www.extjs.com은 &lt;a href="http://www.sencha.com/"&gt;www.sencha.com&lt;/a&gt;으로 이동됩니다.&lt;a href="http://www.sencha.com/"&gt;&lt;/a&gt; jQTouch와 Raphaël을 개발한 David Kaneda씨와 Dmitry Baranovskiy씨가 기존 ExtJS팀에 합류하여 Sencha를 구성합니다. 그리고 이들의 협업으로 모바일 디바이스에서 HTML5기반 리치 인터넷 애플리케이션 개발을 지원하기 위한 자바스크립트 프레임웍인 "&lt;a href="http://www.sencha.com/products/touch/"&gt;Sencha Touch&lt;/a&gt;"를 배포했습니다. 향후 몇 년 동안은 리치 그래픽스와 터치 UI는 모바일 웹 애플리케이션 개발에 필수 불가결한 요소가 될 것이라고 전망했기 때문입니다.&lt;br /&gt;
&lt;br /&gt;
Sencha Touch를 이용하면 애플의 iOS와 구글의 안드로이드와 같은 터치 스크린 기반의 모바일 디바이스에서 네이티브 애플리케이션 수준의 웹 애플리케이션을 개발할 수 있다고 합니다. 물론, 웹 표준 기술(HTML5, CSS3, Javascript)만을 이용하며, UI 컨트롤러 및 애니메이션 이펙트, 강력한 터치(혹은 멀티 터치) 이벤트 API 등을 제공합니다. 함께 공개한 데모인 &lt;a href="http://kivamobile.org/"&gt;KivaTouch&lt;/a&gt;, &lt;a href="http://touchsolitaire.mobi/"&gt;TouchSolitaire&lt;/a&gt;, 그리고 &lt;a href="http://geocongress.us/"&gt;GeoCongress&lt;/a&gt;에서 직접 체험해 보세요.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1611#p1611"&gt;Comments(3)&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1611"&gt;Hits(3574)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uTSNll--3FLPHdXizVkTSnd_dLA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uTSNll--3FLPHdXizVkTSnd_dLA/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/uTSNll--3FLPHdXizVkTSnd_dLA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uTSNll--3FLPHdXizVkTSnd_dLA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">자바스크립트로 구현한 픽셀 벤더</title><link rel="alternate" type="text/html" href="http://firejune.com/1610" /><category term="웹개발" /><category term="자료" /><category term="자바스크립트" /><category term="Canvas" /><category term="Mr.doob" /><category term="HTML5" /><category term="변형" /><category term="WebGL" /><category term="픽셀 벤더" /><author><name>파이어준</name></author><updated>2010-06-18T02:43:10-07:00</updated><id>http://firejune.com/1610</id><content type="html">&lt;div id="container" style="position: relative;"&gt;&lt;span style="position: absolute; top: 0; right: 10px; color: #fff;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Ricardo Cabello씨는 몇년 전에 플래시용으로 작업한 &lt;a href="http://mrdoob.com/blog/post/699"&gt;픽셀 벤더를 자바스크립트와 Canvas 요소로 옮기는 실험&lt;/a&gt;을 했습니다. 이것은 출력되는 비트맵의 모든 픽셀에 수식을 적용하는 것입니다. 자바스크립트는 제법 빠른 수학 연산으로 비트맵을 그려내는 것을 &lt;a href="http://mrdoob.com/lab/javascript/effects/plane_deformations/"&gt;확인&lt;/a&gt;할 수 있습니다. 그는 나중에 &lt;a href="http://en.wikipedia.org/wiki/WebGL"&gt;WebGL&lt;/a&gt;이 나오면 더욱 선명하고 빠르게 처리할 수 있을 것으로 기대하고 있습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1610#p1610"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1610"&gt;Hits(1593)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1KOwFk0dUyVfDf5YFXr4sD_A5mg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1KOwFk0dUyVfDf5YFXr4sD_A5mg/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/1KOwFk0dUyVfDf5YFXr4sD_A5mg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1KOwFk0dUyVfDf5YFXr4sD_A5mg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">HTML5 데이터 비주얼라이제이션 - HumbleFinance</title><link rel="alternate" type="text/html" href="http://firejune.com/1609" /><category term="웹개발" /><category term="자료" /><category term="차트" /><category term="HTML5" /><category term="자바스크립트" /><category term="비주얼라이제이션" /><category term="Prototype" /><category term="Flotr" /><category term="Canvas" /><author><name>파이어준</name></author><updated>2010-06-17T19:34:59-07:00</updated><id>http://firejune.com/1609</id><content type="html">&lt;link rel="stylesheet" type="text/css" href="/attach/0618/100618104033916006/531063.css"/&gt;&lt;!--[if IE]&gt;&lt;![endif]--&gt;
 


&lt;div id="finance"&gt; 
  &lt;div id="labels"&gt; 
    &lt;div id="financeTitle"&gt;NASDAQ:GOOG&lt;/div&gt; 
    &lt;div id="time"&gt; 
        &lt;a onclick="HumbleFinance.zoom(5);"&gt;1w&lt;/a&gt; 
        &lt;a onclick="HumbleFinance.zoom(21);"&gt;1m&lt;/a&gt; 
        &lt;a onclick="HumbleFinance.zoom(65);"&gt;3m&lt;/a&gt; 
        &lt;a onclick="HumbleFinance.zoom(127);"&gt;6m&lt;/a&gt; 
        &lt;a onclick="HumbleFinance.zoom(254);"&gt;1y&lt;/a&gt; 
        &lt;a onclick="HumbleFinance.zoom(1265);"&gt;5y&lt;/a&gt; 
    &lt;/div&gt; 
    &lt;div id="dateRange"&gt;&lt;/div&gt; 
  &lt;/div&gt; 
&lt;/div&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.humblesoftware.com/finance/index"&gt;HumbleFinance&lt;/a&gt;는 HTML5 데이터 비주얼라이제이션 도구입니다. 마치 플래시로 만들어진 듯한 모양과 기능을 가진 차트를 제공합니다. 표현 범위의 제한이 없고 서로 다른 자료의 축을 공유하여 비교해야하는 금융 자료를 2D 차트로 표현하기에 적합합니다.(&lt;a href="http://finance.google.com/"&gt;Google Finance&lt;/a&gt; 와 유사한) 그리고 특정한 구간을 선택하여 확대할 수도 있습니다. &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;과 &lt;a href="http://solutoire.com/flotr/"&gt;Flotr&lt;/a&gt; 자바스크립트 라이브러리를 이용하였으며, 자바스크립트 변수에 저장된 데이터와 파라미터를 근거로 그래프를 표현하고 CSS와 HTML을 이용하여 컨트롤러와 플래그 모양을 만들었습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;HTML:&lt;/h3&gt;&lt;pre class="html"&gt;&lt;code class="html"&gt;div id="finance"&amp;gt;
    &amp;lt;div id="labels"&amp;gt;
        &amp;lt;div id="financeTitle"&amp;gt;NASDAQ:GOOG&amp;lt;/div&amp;gt;
        &amp;lt;div id="time"&amp;gt;
            &amp;lt;a onclick="HumbleFinance.zoom(5);"&amp;gt;1w&amp;lt;/a&amp;gt;
            &amp;lt;a onclick="HumbleFinance.zoom(21);"&amp;gt;1m&amp;lt;/a&amp;gt;
            &amp;lt;a onclick="HumbleFinance.zoom(65);"&amp;gt;3m&amp;lt;/a&amp;gt;
            &amp;lt;a onclick="HumbleFinance.zoom(127);"&amp;gt;6m&amp;lt;/a&amp;gt;
            &amp;lt;a onclick="HumbleFinance.zoom(254);"&amp;gt;1y&amp;lt;/a&amp;gt;
            &amp;lt;a onclick="HumbleFinance.zoom(1265);"&amp;gt;5y&amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div id="dateRange"&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h3&gt;Javascript:&lt;/h3&gt;&lt;pre class="javascript"&gt;&lt;code class="javascript"&gt;Event.observe(document, 'dom:loaded', function() {
    HumbleFinance.trackFormatter = function (obj) {
        var x = Math.floor(obj.x);
        var data = jsonData[x];
        var text = data.date + " Price: " + data.close + " Vol: " + data.volume;
        return text;
    };
    
    HumbleFinance.yTickFormatter = function (n) {
        if (n == this.axes.y.max) return false;
        return '$'+n;
    };
    
    HumbleFinance.xTickFormatter = function (n) { 
        if (n == 0) return false;
        var date = jsonData[n].date;
        date = date.split(' ');
        date = date[2];
        return date; 
    }
    
    HumbleFinance.init('finance', priceData, volumeData, summaryData);
    HumbleFinance.setFlags(flagData); 
    
    var xaxis = HumbleFinance.graphs.summary.axes.x;
    var prevSelection = HumbleFinance.graphs.summary.prevSelection;
    var xmin = xaxis.p2d(prevSelection.first.x);
    var xmax = xaxis.p2d(prevSelection.second.x);
    
    $('dateRange').update(jsonData[xmin].date + ' - ' + jsonData[xmax].date);
    
    Event.observe(HumbleFinance.containers.summary, 'flotr:select', function (e) {
        var area = e.memo[0];
        xmin = Math.floor(area.x1);
        xmax = Math.ceil(area.x2);
        var date1 = jsonData[xmin].date;
        var date2 = jsonData[xmax].date;
        $('dateRange').update(jsonData[xmin].date + ' - ' + jsonData[xmax].date);
    });
});&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;a href="http://excanvas.sourceforge.net/"&gt;ExplorerCanvas&lt;/a&gt;를 이용하면 완벽하지는 않지만 IE계열 브라우저에서도 사용할 수 있습니다.
 &lt;br /&gt;&lt;br /&gt;
 &lt;a href="http://firejune.com/1609#p1609"&gt;Comments&lt;/a&gt; | 
 &lt;a href="http://firejune.com/1609"&gt;Hits(1923)&lt;/a&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/t3DuOWHgPSoiY_sVy-cRiWDR8BI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t3DuOWHgPSoiY_sVy-cRiWDR8BI/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/t3DuOWHgPSoiY_sVy-cRiWDR8BI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t3DuOWHgPSoiY_sVy-cRiWDR8BI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry><entry><title type="text">Hex 코드로 색상 알아 맞추기 게임</title><link rel="alternate" type="text/html" href="http://firejune.com/1608" /><category term="웹개발" /><category term="자료" /><category term="Hex" /><category term="CSS" /><category term="게임" /><category term="ㅋㅋㅋ" /><category term="퀴즈" /><category term="색상" /><category term="Ajaxian" /><author><name>파이어준</name></author><updated>2010-06-16T02:21:54-07:00</updated><id>http://firejune.com/1608</id><content type="html">&lt;a href="http://yizzle.com/whatthehex/"&gt;&lt;img src="http://firejune.com/attach/0616/100616175115504316/904606.png" width="661" height="341" alt="whatthehex.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
당신은 CSS의 Hex 코드를 보고 색상을 유추해 낼 수 있나요? Hex 코드만으로 색상을 구별해 내는 퀴즈 게임이 &lt;a href="http://ajaxian.com/archives/guess-the-color-hex-geekery"&gt;Ajaxian&lt;/a&gt;에 소개되었네요. 난이도를 높일수록 보기가 늘어납니다. 완전 골때리네요. ㅋㅋㅋ
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TQzKU5tY_odOR3NG6fidHAELf54/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TQzKU5tY_odOR3NG6fidHAELf54/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/TQzKU5tY_odOR3NG6fidHAELf54/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TQzKU5tY_odOR3NG6fidHAELf54/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
