<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>따라쟁이</title>
	<atom:link href="http://www.yuiworld.kr/suguni/feed" rel="self" type="application/rss+xml" />
	<link>http://www.yuiworld.kr/suguni</link>
	<description>승근이의 LifeLog - We learn many things by imitation!</description>
	<lastBuildDate>Fri, 18 Jun 2010 02:17:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>티셔츠의 기적</title>
		<link>http://www.yuiworld.kr/suguni/2010/%ed%8b%b0%ec%85%94%ec%b8%a0%ec%9d%98-%ea%b8%b0%ec%a0%81</link>
		<comments>http://www.yuiworld.kr/suguni/2010/%ed%8b%b0%ec%85%94%ec%b8%a0%ec%9d%98-%ea%b8%b0%ec%a0%81#comments</comments>
		<pubDate>Fri, 18 Jun 2010 02:17:07 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[생활]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/?p=486</guid>
		<description><![CDATA[티셔츠의 기적, 당장 집에 있는 옷 찾아봐야 겠군여.]]></description>
			<content:encoded><![CDATA[<p><object type='application/x-shockwave-flash' width='502px' height='399px' align='middle' classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0'><param name='movie' value='http://flvs.daum.net/flvPlayer.swf?vid=9RhPHFsheVo$' /><param name='allowScriptAccess' value='always' /><param name='allowFullScreen' value='true' /><param name='bgcolor' value='#000000' /><embed src='http://flvs.daum.net/flvPlayer.swf?vid=9RhPHFsheVo$' width='502px' height='399px' allowScriptAccess='always' type='application/x-shockwave-flash' allowFullScreen='true' bgcolor='#000000' ></embed></object></p>
<p><a href="http://www.foryounforme.com/">티셔츠의 기적</a>, 당장 집에 있는 옷 찾아봐야 겠군여.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2010/%ed%8b%b0%ec%85%94%ec%b8%a0%ec%9d%98-%ea%b8%b0%ec%a0%81/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>투표합시다.</title>
		<link>http://www.yuiworld.kr/suguni/2010/%ed%88%ac%ed%91%9c%ed%95%a9%ec%8b%9c%eb%8b%a4</link>
		<comments>http://www.yuiworld.kr/suguni/2010/%ed%88%ac%ed%91%9c%ed%95%a9%ec%8b%9c%eb%8b%a4#comments</comments>
		<pubDate>Mon, 24 May 2010 05:49:25 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[생활]]></category>
		<category><![CDATA[투표]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/?p=479</guid>
		<description><![CDATA[투표로 심판합시다.]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;">
<a href='http://www.youtube.com/watch?v=zvIZQj-7rGw'  style="font-size:140%"><strong>투표로 심판합시다.</strong></a><br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/zvIZQj-7rGw&#038;hl=ko_KR&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/zvIZQj-7rGw&#038;hl=ko_KR&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2010/%ed%88%ac%ed%91%9c%ed%95%a9%ec%8b%9c%eb%8b%a4/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>브라우저 디스크 캐쉬 크기</title>
		<link>http://www.yuiworld.kr/suguni/2010/%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80-%eb%94%94%ec%8a%a4%ed%81%ac-%ec%ba%90%ec%89%ac-%ed%81%ac%ea%b8%b0</link>
		<comments>http://www.yuiworld.kr/suguni/2010/%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80-%eb%94%94%ec%8a%a4%ed%81%ac-%ec%ba%90%ec%89%ac-%ed%81%ac%ea%b8%b0#comments</comments>
		<pubDate>Sun, 23 May 2010 13:14:16 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[HighPerformanceWebSite]]></category>
		<category><![CDATA[Steve Souder]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/?p=472</guid>
		<description><![CDATA[꽤 오래전이긴 합니다만, 중요한 포스팅이었던 Performance Research, Part 2: Browser Cache Usage – Exposed! 를 보면, 실험 결과 웹 사이트 방문자의 40~60%는 empty cache로 접근한다는 내용이 있습니다. Steve Souder는 Call to improve browser caching란 포스팅에서 그 이유를 4가지로 추측하고 있는데, 그 중 가장 현실성 있는 대답은 &#8220;resources got evicted&#8221;라고 말하고 있습니다. 즉, 브라우저 캐쉬 용량의 [...]]]></description>
			<content:encoded><![CDATA[<p>꽤 오래전이긴 합니다만, 중요한 포스팅이었던 <a href="http://www.yuiblog.com/blog/2007/01/04/performance-research-part-2/">Performance Research, Part 2: Browser Cache Usage – Exposed!</a> 를 보면, 실험 결과 웹 사이트  방문자의 40~60%는 empty cache로 접근한다는 내용이 있습니다. <a href="http://www.stevesouders.com/">Steve Souder</a>는 <a href="http://www.stevesouders.com/blog/2010/04/26/call-to-improve-browser-caching/">Call to improve browser caching</a>란 포스팅에서 그 이유를 4가지로 추측하고 있는데, 그 중 가장 현실성 있는 대답은 &#8220;resources got evicted&#8221;라고 말하고 있습니다. 즉, 브라우저 캐쉬 용량의 제한으로 새로운 리소스가 저장되고 이전 리소스는 삭제되었다라고 판단하고 있습니다.</p>
<p>이를 해결하기 위한 방안으로는 1. 디스크 캐쉬 용량 늘리기, 2. 삭제 알고리즘(LRU 기반 알고리즘) 개선 두가지를 얘기하고 있습니다. 1번의 경우 브라우저가 기본 용량이 큰 상태로 출시될 때만 의미가 있을듯 하고(물론 사용자가 설정을 통해 수정할 수 도 있겠지만, 이런 방식으로는 대세에 전혀 영향을 못 미치겠죠.), 2번의 경우는 리소스의 타입에 따른 가중치를 부여한 LRU 알고리즘을 간단히 얘기하고 있습니다.</p>
<p>저의 경우야 개발을 위해 브라우저를 사용하는 빈도가 높아, 캐쉬를 가급적 작게 잡아 쓰고, Firefox의 경우는 메모리 캐쉬도 끄고 사용할때도 있긴 하지만, 일반적인 상황에서야 수백 GB의 디스크가 기본이라 수백 MB 정도를 브라우저 캐쉬로 사용한다고 해서 디스크 용량이 부족하진 않겠죠. 하지만 혹시 디스크 캐쉬 사이즈를 늘림으로 인해서 발생하는 문제점은 없을까요?</p>
<p>답이나 생각이 있는건 아니고, 그냥 궁금하네요. ^^; 웹 사용 측면만 본다면 전혀 문제될 것이 없을듯 하고, 오히려 성능 개선이 일어나는게 당연한 듯 한데&#8230; ㅎㅎ</p>
<p>참고로, <a href="http://www.stevesouders.com/">Steve Souder</a> 아저씨가 <a href="http://stevesouders.com/cache.php">Browser Disk Cache</a>를 통해 <a href="http://spreadsheets.google.com/viewform?formkey=dGlFb2FUb0NfeUFfRklLeTZmanZCb1E6MQ">Browser Disk Cache Survey</a>를 진행하고 있으니, 한번 참여해 보심이 어떠실지요?</p>
<p>그리고, 4월 초에 <a href="http://ajaxian.com/archives/mozilla-web-caching-summit">Mozilla Web Caching Summit</a>가 열렸었는데, 여기서도 디스크 용량을 늘리는 것에 대한 연구가 필요하다고 결론을 내리고 있네요.</p>
<h4>참고</h4>
<ul>
<li><a href="http://www.stevesouders.com/blog/2010/04/26/call-to-improve-browser-caching/">Call to improve browser caching</a></li>
<li><a href="http://www.yuiblog.com/blog/2007/01/04/performance-research-part-2/">Performance Research, Part 2: Browser Cache Usage – Exposed!</a></li>
<li><a href="http://ajaxian.com/archives/mozilla-web-caching-summit">Mozilla Web Caching Summit</a></li>
<li><a href="http://hacks.mozilla.org/2010/05/revitalizing-caching/">http://hacks.mozilla.org/2010/05/revitalizing-caching/</a> &#8211; 내용 보완</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2010/%eb%b8%8c%eb%9d%bc%ec%9a%b0%ec%a0%80-%eb%94%94%ec%8a%a4%ed%81%ac-%ec%ba%90%ec%89%ac-%ed%81%ac%ea%b8%b0/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buffalo LinkStation과 Time Machine</title>
		<link>http://www.yuiworld.kr/suguni/2010/buffalo-linkstation%ea%b3%bc-time-machine</link>
		<comments>http://www.yuiworld.kr/suguni/2010/buffalo-linkstation%ea%b3%bc-time-machine#comments</comments>
		<pubDate>Fri, 21 May 2010 13:37:13 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[생활]]></category>
		<category><![CDATA[Buffalo LinkStation]]></category>
		<category><![CDATA[NAS]]></category>
		<category><![CDATA[Time Machine]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/?p=460</guid>
		<description><![CDATA[2010. 5. 23 Updated 잘 된다고 생각했었는데, 뭔가 이상하던구요. Incremental backup 이라고는 하지만, 매번 100MB 정도씩 백업이 발생하는 것도 그렇고, 맥북 전원을 껐다 켜면 매번 디스크를 못찾겠다는 것도 그렇고&#8230; 암튼 그래서 새로 지우고 다시 시도 중입니다. 대신 순서와 방법을 좀 바꿨는데 다음과 같습니다. 기본적으로 해야 할 일들은 아래와 동일합니다. Time Machine과 관련된 모든 설정을 초기화 [...]]]></description>
			<content:encoded><![CDATA[<h4>2010. 5. 23 Updated</h4>
<p>잘 된다고 생각했었는데, 뭔가 이상하던구요. Incremental backup 이라고는 하지만, 매번 100MB 정도씩 백업이 발생하는 것도 그렇고, 맥북 전원을 껐다 켜면 매번 디스크를 못찾겠다는 것도 그렇고&#8230; 암튼 그래서 새로 지우고 다시 시도 중입니다. 대신 순서와 방법을 좀 바꿨는데 다음과 같습니다. 기본적으로 해야 할 일들은 아래와 동일합니다.</p>
<ol>
<li>Time Machine과 관련된 모든 설정을 초기화 하고, NAS에 저장된 백업 이미지 및 해당 폴더를 모두 삭제했습니다.</li>
<li>백업용 이미지 파일을 먼저 생성했습니다. 디스크 유틸리티를 사용하지 않고 다음의 명령어로 직접 생성했습니다.  처음 생성시 이미지 크기를 200GB로 설정했고(아래의 크기 변경 과정은 수행하지 않았습니다), 파일명 규칙에서 hostname.ethernetid를 hostname_ethernetid로 변경했습니다.
<pre class="codeblock"><code>hdiutil create -size 200g -fs JHFS+X -volname "Backup" hostname_xxxxxxxxxxxx.sparsebundle</code></pre>
</li>
<li>NAS에서 backup만을 위한 별도 계정을 만들었습니다.</li>
<li>백업용 공유 폴더를 생성하고, backup user만이 접근할 수 있도록 권한을 설정하였습니다.</li>
<li>NAS에서 Time Machine function을 enable하였습니다.</li>
<li>NAS의 백업용 폴더에 이미지 파일 복사, 여기서 잠깐 컴 재부팅</li>
<li>Mac에서 Time Machine on, 디스크 선택(위에서 작성한 폴더 선택하고 backup으로 로그인), <code>/Users</code> 디렉토리를 제외한 모든 디렉토리는 백업 대상에서 제외하도록 옵션 수정, 백업 시작</li>
</ol>
<p>잘 될지 모르겠네요&#8230; 가장 큰 문제는 자동으로 백업이 안되고 매번 디스크를 찾아서 실행해야 했던 부분인데&#8230;</p>
<p>그리고 재밌는건 찾아본 문서에서 이미지 파일의 파일 시스템을 HFS+J 로 하면 된다고 했는데, 저의 경우는 아래 작성한거처럼 대소문자 구분이 안되는 파일시스템이라 백업할 수 없다는 메시지만&#8230; 아마도 한글 때문이라 생각되네요.</p>
<hr />
<p><a href="http://www.yuiworld.kr/suguni/wp/wp-content/uploads/2010/05/LS-QL.jpg"><img src="http://www.yuiworld.kr/suguni/wp/wp-content/uploads/2010/05/LS-QL-150x150.jpg" alt="" title="LS-QL" width="150" height="150" class="alignleft size-thumbnail wp-image-467" /></a></p>
<p>엊그제 <a href="http://buffalo.nas-central.org/wiki/Category:LSQuad">Buffalo LinkStation LS-QL</a>을 집에 들여놓게 되었습니다. 일전에 맥북이 맛탱이 가서 새로 설치한 경험이 있던지라, 맨 먼저 Time Machine으로 백업을 시도 했습니다. 근데, 메뉴얼에 있는데로 했더니 이놈이 제대로 동작하지 않더구요. 어찌 어찌 해서 결국 성공(현재 풀 백업 중) 했고, 아래는 그 과정입니다.</p>
<h4>0. Mac의 Time Machine 설정 끄기</h4>
<p>큰 문제는 없는 듯 하지만, 일단 환경 설정의 Time Machine이 on 되어 있다면 off해두는게 좋을 듯.</p>
<h4>1. 백업용 공유 디렉토리 만들기</h4>
<p><strong>Web Admin tool &gt; Shared Folders &gt; Shared Folders Setup</strong></p>
<p>그냥 만들면 되는데 Shared Folder Support 항목에 Apple이 체크되어 있는지만 확인하면 될 듯.</p>
<h4>2. NAS의 Time Machine 활성화</h4>
<p><strong>Web Admin tool &gt; Time Machine</strong></p>
<p>Time Machine Function을 enable로 설정하시고, Target folder는 앞에서 만든 디렉토리로 선택한 후 Apply 를 클릭합니다.</p>
<h4>3. Time Machine 백업을 위한 번들 이미지 파일 생성</h4>
<p>여기부터가 시키는데로 하면 안되는 부분 &#8211;;</p>
<p>2번에서 Time Machine을 enable 한 후 아래에 있는 Mac Information을 입력하고 Apply를 클릭하면, 백업용 번들 이미지를 생성시켜 주지만 정상 동작하지 않습니다. 그래서 일단 Admin tool에 있는 기능을 사용하지 않고 디스크 유틸리티로 직접 이미지를 생성하였습니다.</p>
<p>Mac의 디스크 유틸리티를 실행한 후, 새로운 이미지 버튼을 클릭하여 아래 화면과 같이 설정하여 새로운 이미지 파일을 만듭니다. 파일명과 포맷에 대해서는 아래 내용 참고하시기 바랍니다. (아래 이미지에서는 파일명이 <strong>.</strong>으로 구분되어 있는데 <strong>_</strong>으로 하는게 좋을 듯 합니다. 대부분의 문서에서 그렇게 되어 있어서.)</p>
<p><a href="http://www.yuiworld.kr/suguni/wp/wp-content/uploads/2010/05/newbundleimage.png"><img src="http://www.yuiworld.kr/suguni/wp/wp-content/uploads/2010/05/newbundleimage.png" alt="" title="newbundleimage" width="448" height="332" class="aligncenter size-full wp-image-461" /></a></p>
<ul>
<li>파일명은 <tt>hostname_ethernetID.sparsebundle</tt> 이어야 합니다. 그리고 반드시 <strong>en0</strong> 인터페이스(유선 네트워크 카드)의 ethernet id를 사용해야 합니다. 위 항목은 시스템 환경설정에서 확인할 수 있습니다. enternet id는 :로 분리된 16진수로 나오는데 그냥 : 빼고 붙여주시면 됩니다. 만약 id가 12:34:56:78:90:ab 이면 1234567890ab 가 됩니다. 또, 디스크 유틸리티로 만들면 확장자를 sparseimage인 거 같기도 했는데, 그냥 sparsebundle로 바꾸시면 됩니다.</li>
<li>포맷은 반드시 <strong>대소문자구분, 저널링</strong>으로 선택해야 합니다. Web admin tool에서 이미지를 만들면 대소문자 구분이 안되는 이미지를 만들어 전체 백업이 되지 않습니다. 이 문제 때문에 이미지를 직접 생성해야 합니다.</li>
</ul>
<h4>4. 이미지 파일을 NAS에 올리고 크기 변경</h4>
<p>3번 단계에서 만든 이미지 파일을 1번 단계에서 만든 Time Machine 용 공유 디렉토리로 복사합니다. 그리고 터미널에서 아래 명령으로 파일 크기를 늘려줍니다. 이 부분은 왜 해야 하는지 잘 모르겠네요. 그냥 시키는데로&#8230; ^^</p>
<pre class="codeblock"><code>hdiutil resize -size 50g hostname.1234567890ab.sparsebundle</code></pre>
<p>참고로, NAS에서 Time Machine을 enable하면 Finder의 왼쪽 공유 목록에 &#8220;NAS이름-TimeMachine&#8221;으로 컴퓨터가 하나 더 나옵니다. 거기에 보면 Time Machine 용으로 공유하는 디렉토리가 나옵니다.</p>
<h4>5. Time Capsule이 아닌 장비의 Time Machine 지원 설정</h4>
<p>이것도 시키는데로. 대략 읽어 보니, Time Capsule이 아닌 장비에서 Time Machine을 사용하려면 아래의 명령을 실행해야 한다고 하는 듯.</p>
<pre class="codeblock"><code>sudo defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1</code></pre>
<h4>6. Mac의 Time Machine 설정</h4>
<p>Mac의 환경 설정에서 Time Machine을 켜고, 디스크 선택을 클릭해서 앞서 만든 NAS상의 Time Machine용 디렉토리를 선택합니다.</p>
<p>여기까지 하면 아마도 백업을 시작할껍니다. ^^</p>
<p>혹시 잘 안되면, <a href="http://buffalo.nas-central.org/wiki/Time_Machine_%26_Time_Capsule_support_on_your_LinkStation">Time Machine &amp; Time Capsule support on your LinkStation</a> 참고하시길. 제가 쓴 글은 이 문서를 기반으로 성공한 것이긴 하지만, 문서 내용과 틀린 부분이 있습니다. 특히 3단계 주의!</p>
<p>다음번에는 iTunes Media 서버 시도하기!!! 요건 더 힘들거 같은 느낌이.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2010/buffalo-linkstation%ea%b3%bc-time-machine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript 동적 로딩</title>
		<link>http://www.yuiworld.kr/suguni/2010/javascript-%eb%8f%99%ec%a0%81-%eb%a1%9c%eb%94%a9</link>
		<comments>http://www.yuiworld.kr/suguni/2010/javascript-%eb%8f%99%ec%a0%81-%eb%a1%9c%eb%94%a9#comments</comments>
		<pubDate>Thu, 20 May 2010 12:30:14 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[dynamic loading]]></category>
		<category><![CDATA[high performance website]]></category>
		<category><![CDATA[javascirpt]]></category>
		<category><![CDATA[동적 로딩]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/?p=446</guid>
		<description><![CDATA[일반적으로 성능 개선을 위해 동적으로 JavaScript를 로딩하도록 구성하는데, var domscript = document.createElement('script'); domscript.src = 'main.js'; document.getElementsByTagName('head')[0].appendChild(domscript); 이 코드만 봐 왔었는데, 아래와 같은 방식이 있네요. var ga = document.createElement('script'); ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; ga.setAttribute('async', 'true'); document.documentElement.firstChild.appendChild(ga); 코드 내용을 보면 아시겠지만 Google Analytics에서 사용하던 코드이고, 2009년 12월 버전입니다. 위처럼 사용하는 [...]]]></description>
			<content:encoded><![CDATA[<p>일반적으로 성능 개선을 위해 동적으로 JavaScript를 로딩하도록 구성하는데,</p>
<pre class="codeblock"><code>var domscript = document.createElement('script');
domscript.src = 'main.js';
document.getElementsByTagName('head')[0].appendChild(domscript);
</code></pre>
<p>이 코드만 봐 왔었는데, 아래와 같은 방식이 있네요.</p>
<pre class="codeblock"><code>var ga = document.createElement('script');
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
ga.setAttribute('async', 'true');
document.documentElement.firstChild.appendChild(ga);
</code></pre>
<p>코드 내용을 보면 아시겠지만 Google Analytics에서 사용하던 코드이고, 2009년 12월 버전입니다. 위처럼 사용하는 이유는 <code>document.getElementsByTagName('head')[0]</code>가 <code>null</code> 일 수 있기 때문. 나라면 그럴리가 없겠지만, Google Analytics의 경우는 모든 상황을 고려해야 할 터이니 이해가 되네요.</p>
<p>그런데 위 코드를 좀 더 개선한 코드가 아래라고 합니다.</p>
<pre class="codeblock"><code>var ga = document.createElement('script');
ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
</code></pre>
<p>JavaScript를 동적으로 로딩하기 위해서는 무조건 script 태그가 존재할테니, <code>document.getElementsByTagName('script')[0]</code>는 null이 될 수 없겠네요. 이 코드는 마찬가지로 Google Analytics의 2010년 2월 버전입니다. 앞 코드의 경우 로딩되는 스크립트 태그가 정확히 어디에 붙을지 모를 수 있는데, 이러한 불확실성을 조금은 제거한거라 생각되네요.</p>
<p>마지막 코드는 jQuery에서 사용하는 방식입니다.</p>
<pre class="codeblock"><code>var head = document.getElementsByTagName ("head")[0] || document.documentElement;
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709 and #4378).
head.insertBefore(script, head.firstChild);
</code></pre>
<p>재밌는 부분은 <code>appendChild</code> 대신 <code>insertBefore</code>를 사용했다는 점입니다. 주석에서 쓰여 있듯이. IE6의 bug(http://dev.jquery.com/ticket/2709, http://dev.jquery.com/ticket/4378) 때문이라는데, 이 부분은 찬찬히 확인해 봐야 할 듯.</p>
<p>본 글은 <a href="http://www.stevesouders.com/blog/">High Performance Web Sites blog</a>의 <a href="http://www.stevesouders.com/blog/2010/05/11/appendchild-vs-insertbefore/">appendChild vs insertBefore</a>을 바탕으로 작성되었습니다.</p>
<hr />
<p>추가적으로 <a href="http://www.stevesouders.com/blog/2010/05/11/appendchild-vs-insertbefore/">appendChild vs insertBefore</a>의 내용을 보면, 아래와 같은 내용이 나옵니다.</p>
<blockquote><p>
It turns out that not all web pages have a HEAD tag, and not all browsers will create one when it’s missing. </p></blockquote>
<p>즉, 어떤 브라우저들은 HEAD 태그가 존재하지 않는 경우 자동으로 생성해준다는 것인데, 사실 대부분의 브라우저가 자동으로 HEAD 태그를 생성하는거 같습니다. 그 다음번 포스팅인 <a href="http://www.stevesouders.com/blog/2010/05/12/autohead-my-first-browserscope-user-test/">AutoHead – my first Browserscope user test</a>을 보면 이를 위해 테스트를 수행했고, 그 결과 페이지가 <a href="http://stevesouders.com/tests/autohead.html">AutoHead Browserscope User Test</a> 입니다. 아주 많은 브라우저들이 자동으로 생성해 준다는 것을 알 수 있네요.</p>
<p>오호 이런것이&#8230; ^^</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2010/javascript-%eb%8f%99%ec%a0%81-%eb%a1%9c%eb%94%a9/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chrome과 Safari에서만 적용되는 CSS</title>
		<link>http://www.yuiworld.kr/suguni/2010/chrome%ea%b3%bc-safari%ec%97%90%ec%84%9c%eb%a7%8c-%ec%a0%81%ec%9a%a9%eb%90%98%eb%8a%94-css</link>
		<comments>http://www.yuiworld.kr/suguni/2010/chrome%ea%b3%bc-safari%ec%97%90%ec%84%9c%eb%a7%8c-%ec%a0%81%ec%9a%a9%eb%90%98%eb%8a%94-css#comments</comments>
		<pubDate>Thu, 20 May 2010 11:51:37 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[Front-end]]></category>
		<category><![CDATA[chrom]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/2010/chrome%ea%b3%bc-safari%ec%97%90%ec%84%9c%eb%a7%8c-%ec%a0%81%ec%9a%a9%eb%90%98%eb%8a%94-css</guid>
		<description><![CDATA[media query에 -webkit-min-device-pixel-ratio:0 요게 들어가 있으면 된다는데&#8230; @media screen and (-webkit-min-device-pixel-ratio:0) { .myClass { background-color: #FF0000; } #myId {color: #0000FF;} p, a, li {text-shadow: 3px 3px 3px rgba(0, 0, 0, 0.4);} } 각 브라우저별 지원 버전 확인해 봐야겠음. 참조: http://www.evotech.net/blog/2010/04/hack-for-webkit-filter-for-chrome-and-safari/]]></description>
			<content:encoded><![CDATA[<p>media query에 <code>-webkit-min-device-pixel-ratio:0</code> 요게 들어가 있으면 된다는데&#8230;</p>
<pre class="codeblock"><code>@media screen and (-webkit-min-device-pixel-ratio:0) {
     .myClass { background-color: #FF0000; }
     #myId {color: #0000FF;}
     p, a, li {text-shadow: 3px 3px 3px rgba(0, 0, 0, 0.4);}
}
</code></pre>
<p>각 브라우저별 지원 버전 확인해 봐야겠음.<br />
참조: http://www.evotech.net/blog/2010/04/hack-for-webkit-filter-for-chrome-and-safari/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2010/chrome%ea%b3%bc-safari%ec%97%90%ec%84%9c%eb%a7%8c-%ec%a0%81%ec%9a%a9%eb%90%98%eb%8a%94-css/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MockFlow</title>
		<link>http://www.yuiworld.kr/suguni/2010/mockflow</link>
		<comments>http://www.yuiworld.kr/suguni/2010/mockflow#comments</comments>
		<pubDate>Thu, 15 Apr 2010 08:02:29 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[생활]]></category>
		<category><![CDATA[mockup]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/2010/mockflow</guid>
		<description><![CDATA[MockFlow를 간단히 써 봤습니다. 장점은 완성도 높은 에디터, 기본적으로 제공되는 다양한 컴포넌트, MockStore를 통해서 얻을 수 있는 다양한 템플릿들이라고 할 수 있을듯 합니다. 특히나, 개별 컴포넌트들의 속성 설정이 훌륭해 보이네요. 단점이라면, 지원되는 액션이 다른 페이지로의 링크 밖에 안된다는 점이 가장 아쉬운 점입니다. 목업툴이 평면적이고, 이해/확인하기 어려운 ppt 문서를 대체하도록 사용되었으면 하는데, MockFlow는 결과물 자체로 봤을때는 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://app.mockflow.com/">MockFlow</a>를 간단히 써 봤습니다.</p>
<p>장점은 완성도 높은 에디터, 기본적으로 제공되는 다양한 컴포넌트, MockStore를 통해서 얻을 수 있는 다양한 템플릿들이라고 할 수 있을듯 합니다. 특히나, 개별 컴포넌트들의 속성 설정이 훌륭해 보이네요. </p>
<p>단점이라면, 지원되는 액션이 다른 페이지로의 링크 밖에 안된다는 점이 가장 아쉬운 점입니다. 목업툴이 평면적이고, 이해/확인하기 어려운 ppt 문서를 대체하도록 사용되었으면 하는데, MockFlow는 결과물 자체로 봤을때는 PowerPoint 보다 그리기 편한 툴 정도로 밖에 안보이네요. 그리고, 세부적인 description이나 note를 작성하기 위한 방법도 따로 없는거 같아 아쉽구요.</p>
<p>채팅 기능이나 협업 기능도 의미는 있겠지만, 이보다는 좀 더 동적인 목업이 가능한 툴이었으면 했는데 아쉽네요.</p>
<p>아. 참고로 Flash로 구현되어 있고 그래서인지 한글이 안되는 문제가 있네요.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2010/mockflow/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Closure</title>
		<link>http://www.yuiworld.kr/suguni/2010/closure</link>
		<comments>http://www.yuiworld.kr/suguni/2010/closure#comments</comments>
		<pubDate>Mon, 15 Mar 2010 04:18:25 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[Programming?]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/?p=430</guid>
		<description><![CDATA[Closure(닫힘)는 수학과 프로그래밍 언어에서 서로 다른 의미로 사용된다. 수학에서의 closure는 특정 집합의 원소들을 가지고 연산한 결과가 동일한 집합에 속하게 되면 해당 집합은 대상 연산에 대해 닫혀 있다라고 표현한다. 예를 들어 자연수 더하기 자연수는 항상 자연수가 되므로 자연수 집합은 더하기 연산에 닫혀있는 집합인 것이다. 하지만 자연수 빼기 자연수는 음수가 나올 수 있으므로 자연수 집합은 빼기 연산에 [...]]]></description>
			<content:encoded><![CDATA[<p>Closure(닫힘)는 수학과 프로그래밍 언어에서 서로 다른 의미로 사용된다.</p>
<p>수학에서의 closure는 특정 집합의 원소들을 가지고 연산한 결과가 동일한 집합에 속하게 되면 해당 집합은 대상 연산에 대해 닫혀 있다라고 표현한다. 예를 들어 자연수 더하기 자연수는 항상 자연수가 되므로 자연수 집합은 더하기 연산에 닫혀있는 집합인 것이다. 하지만 자연수 빼기 자연수는 음수가 나올 수 있으므로 자연수 집합은 빼기 연산에 닫혀있지 않는 집합이다.</p>
<p>참고: <a href="http://en.wikipedia.org/wiki/Closure_%28mathematics%29" target="_blank">Closure (mathematics)</a></p>
<p>프로그래밍 언어에서의 closure는 자유 변수를 가진 프로시저를 나타내는 기법이란 의미로 사용된다(컴퓨터 프로그램의 구조와 해석, p.127).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2010/closure/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>@font-face rule</title>
		<link>http://www.yuiworld.kr/suguni/2009/font-face-rule</link>
		<comments>http://www.yuiworld.kr/suguni/2009/font-face-rule#comments</comments>
		<pubDate>Sat, 24 Oct 2009 15:06:25 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[Front-end]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/?p=422</guid>
		<description><![CDATA[@font-face는 새로운 font-family를 생성하는 CSS rule로, 이를 이용하면 local이 아닌 remote server 상에 있는 폰트로 웹 페이지를 렌더링 할 수 있습니다. 원래는 Internet Explorer 4에서부터 독자적으로 지원했었던 기능이었지만, CSS 3에서 공식적으로 채택되어 현재 Firefox 3.5, Safari 3.1, Opera 10에서도 지원하고 있습니다. 다만 IE에서는 Embedded OpenType (EOT) 포맷만을 지원하고 있고, 최근에 지원하기 시작한 FF, Safari, Opera의 [...]]]></description>
			<content:encoded><![CDATA[<p>@font-face는 새로운 font-family를 생성하는 CSS rule로, 이를 이용하면 local이 아닌 remote server 상에 있는 폰트로 웹 페이지를 렌더링 할 수 있습니다. 원래는 Internet Explorer 4에서부터 독자적으로 지원했었던 기능이었지만, CSS 3에서 공식적으로 채택되어 현재 Firefox 3.5, Safari 3.1, Opera 10에서도 지원하고 있습니다. 다만 IE에서는 Embedded OpenType (EOT) 포맷만을 지원하고 있고, 최근에 지원하기 시작한 FF, Safari, Opera의 경우 TrueType과 OpenType만을 지원하고 있습니다.</p>
<h3>Syntax</h3>
<p>font-face를 정의하는 syntax는 다음과 같고,</p>
<pre class="codeblock"><code>@font-face {
    font-family: &lt;a-font-name&gt;;
    src: &lt;source&gt; [,&lt;source&gt;]*;
    [font-weight: &lt;weight&gt;];
    [font-style: &lt;style&gt;];
    [unicode-range: &lt;U+nnn-nnn&gt; [,&lt;U+nnn-nnn&gt;]*];
}
</code></pre>
<p>실제 사용은 다음과 같이 합니다. @font-face에서 명시한 font-family를 일반적인 폰트 이름처럼 사용하면 됩니다.</p>
<pre class="codeblock"><code>@font-face {
  font-family: Graublau Sans Web;
  src: url(GraublauWeb.otf) format("opentype");
}
body {
  font-family: Graublau Sans Web, Lucida Grande, sans-serif;
}
</code></pre>
<h3>새로 알게된 내용들</h3>
<p><strong>local hint</strong> : src descriptor에는 서버에 있는 폰트 url을 명시하는 url hint 외에도 local hint를 이용해서 로컬에 있는 폰트를 지정할 수 있습니다. 또한 소스를 하나 이상 명시할 수 있습니다. 이들을 사용하는 이유는, 해당 폰트가 설치되어 있으면 설치된 폰트를 사용하고 그렇지 않은 경우에만 다운로드 받도록 하기 위함입니다.</p>
<pre class="codeblock"><code>@font-face {
    font-family: MyHelvetica;
    src: local("Helvetica Neue"),
         local("HelveticaNeue"),
         url(MgOpenModernaRegular.ttf);
}
</code></pre>
<p><strong>format hint</strong> : 여러 가지 유형의 폰트를 지원할 수 있으므로 source의 포맷을 명시하는 format hint 키워드가 있습니다. <a href="http://www.w3.org/TR/css3-fonts/">CSS Fonts Module Level 3(W3C Working Draft 18 June 2009)</a> 문서에서는 &#8220;truetype&#8221;, &#8220;opentype&#8221;, &#8220;truetype-aat&#8221;, &#8220;embedded-opentype&#8221;, &#8220;svg&#8221;를 예제로 들고 있는데, 실제 브라우저에 따라 지원의 차이가 있을 수 있고 또 다른 포맷이 생길수도 있습니다. <del datetime="2009-10-24T15:29:22+00:00">참고로 IE에서는 format hint를 인식하지 못하며 포함된 경우 이를 무시하게 됩니다.</del></p>
<pre class="codeblock"><code>@font-face {
    font-family: Gentium;
    src: url(Gentium.ttf) format("opentype");
}
</code></pre>
<h3>Cross Browsed @font-face</h3>
<p>IE의 경우 eot 파일을, 그 외 브라우저(위에서 언급한 것들)에서는 TrueType 및 OpenType만을 지원하므로 크로스 브라우징이 가능하게끔 코딩을 해야 합니다. 앞서 언급한 src descriptor의 format hint를 이용하여 다음과 같이 코딩할 수 있습니다. 다음 코드에서 어떤 @font-face를 먼저 코딩하는지가 중요합니다.</p>
<pre class="codeblock"><code>@font-face { /* for IE */
  font-family: Gentium;
  src: url('Gentium.eot');
}
 @font-face { /* for non-IE */
  font-family: Gentium;
  src: url('Gentium.ttf') format('opentype');
}
</code></pre>
<p>Ajaxian의 <a href="http://ajaxian.com/archives/font-face-how-to-embed-it-and-how-it-looks-across-browsers">@font-face: How to embed it, and how it looks across browsers</a>에서는 하나의 @font-face에 src descriptor를 두 번 선언해서 사용하고 있습니다. 이런식으로도 가능하다면 위 코드는 다음과 같이 변경할 수 있습니다.</p>
<pre class="codeblock"><code>@font-face {
  font-family: Gentium;
  src: url('Gentium.eot');
  src: url('Gentium.ttf') format('opentype');
}
</code></pre>
<h3>Bulletproof @font-face syntax</h3>
<p style="border:1px solid #e1e1e1;background-color:#f1f1f1;padding:1em;font-weight:bold;"><a href="http://paulirish.com/2009/bulletproof-font-face-implementation-syntax/">Bulletproof @font-face syntax</a>을 읽고 추가한 사항입니다.</p>
<p>위의 Cross Browsed @font-face 단락에서 제시한 방법 모두 겉으로 보기에는 크로스 브라우징에는 문제가 없으나, IE에서 조금 이상한 request가 발생하는 문제(?)가 있습니다. IE에서는 먼저 Gentium.eot 파일을 요청(HTTP request)하고 다음번 src에 대해서는 <strong>Gentium.ttf&#8217;)%20format(&#8216;opentype</strong> 로 요청을 발생시킴니다. IE가 src를 파싱하는 구조때문인것으로 보이는데 이 경우 404 응답(response)이 올 것입니다.</p>
<p>다음 코드는 이러한 문제를 해결하기 위한 것으로 ttf를 요청할 때 반드시 local hint를 먼저 입력하는 방식입니다. 이 방식은 non-IE 브라우저에서는 로컬에 설치된 경우 이를 사용할 수 있다는 장점이 있으며, IE에서는 local hint 자체를 인식하지 못하므로 파싱 오류가 발생할 것이고 어떤 요청도 하지 않게 됩니다. 참고로 local hint가 2번 사용된 것은 OS X의 Safari에서는 전체 폰트 이름과 Postscript 이름이 틀린 경우 Postscript 이름만을 사용하기 때문에 이를 추가해 준 것입니다(두번째 local hint에 있는 이름). </p>
<pre class="codeblock"><code>@font-face {
  font-family: 'Graublau Web';
  src: url('GraublauWeb.eot);
  src: local('Graublau Web Regular'), local('Graublau Web'),
         url('GraublauWeb.otf') format('opentype');
}
<code></pre>
<p>다음과 같은 방식으로도 불필요한 요청(request)이 발생하지 않게 할 수 있다고 하지만 너무 tricky한 코드라 사용하지 않는게 좋을듯 하네요.</p>
<pre class="codeblock"><code>@font-face{
  font-family:'Graublau Web';
  src: url('GraublauWeb.eot'); /* here you go, IE */
}
@font-face{
  font-family:'Graublau Web';
  src: url(//:) format ('no404'), url('GraublauWeb.otf') format('opentype'); /* tricky! */
}
<code></pre>
<h3>의문 사항</h3>
<p><strong>font-weight, font-style</strong>: <code>font-weight</code>와 <code>font-style</code>을 지정할 경우 해당 font-family는 한가지 스타일만을 가질 수 있는 것일까요?</p>
<p><strong>unicode-range 지원</strong> : <a href="http://www.w3.org/TR/css3-fonts/">CSS Fonts Module Level 3(W3C Working Draft 18 June 2009)</a> 문서에서는 존재하지만 <a href="https://developer.mozilla.org/index.php?title=En/CSS/%40font-face">MDC</a>와 <a href="http://msdn.microsoft.com/en-us/library/ms530757%28VS.85,lightweight%29.aspx">MSDN</a>에서는 찾아볼 수 없습니다. 만일 Firefox에서 지원하고, <a href="/">font-family</a> 글에서 언급한 동작방식을 고려한다면 한글과 영문 폰트를 css font-family에 명시되는 순서에 무관하게 사용할 수 있을것 같습니다.</p>
<h3>References</h3>
<p>본 문서에 나온 예제 코드들은 모두 아래의 문서들에서 가져온 것들입니다.</p>
<ul>
<li><a href="http://hacks.mozilla.org/2009/06/beautiful-fonts-with-font-face/">beautiful fonts with @font-face</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms530757%28VS.85,lightweight%29.aspx">MSDN @font-face Rule </a></li>
<li><a href="http://www.w3.org/TR/css3-fonts/">CSS Fonts Module Level 3 (W3C Working Draft 18 June 2009)</a></li>
<li><a href="https://developer.mozilla.org/index.php?title=En/CSS/%40font-face">MDC @font-face</a></li>
<li><a href="http://www.w3.org/Submission/EOT/">Embedded OpenType (EOT) File Format (W3C Member Submission 5 March 2008)</a></li>
<li><a href="http://www.useragentman.com/blog/2009/09/20/font-face-in-depth/">@font-face in Depth</a></li>
<li><a href="http://webfonts.info/wiki/index.php?title=Main_Page">Webfonts.info</a></li>
<li><a href="http://paulirish.com/2009/bulletproof-font-face-implementation-syntax/">Bulletproof @font-face syntax</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2009/font-face-rule/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XMind default style 변경</title>
		<link>http://www.yuiworld.kr/suguni/2009/xmind-default-style-%eb%b3%80%ea%b2%bd</link>
		<comments>http://www.yuiworld.kr/suguni/2009/xmind-default-style-%eb%b3%80%ea%b2%bd#comments</comments>
		<pubDate>Mon, 07 Sep 2009 02:46:23 +0000</pubDate>
		<dc:creator>suguni</dc:creator>
				<category><![CDATA[생활]]></category>
		<category><![CDATA[xmind]]></category>

		<guid isPermaLink="false">http://www.yuiworld.kr/suguni/?p=402</guid>
		<description><![CDATA[MS Windows에서 설정 파일 경로 C:\Program Files\XMind\plugins\org.xmind.ui.resources_3.0.1.200812152237\styles\defaultStyles.xml 참조 Google Groups XMind User Forum &#8211; default settings]]></description>
			<content:encoded><![CDATA[<dl>
<dt>MS Windows에서 설정 파일 경로</dt>
<dd><tt>C:\Program Files\XMind\plugins\org.xmind.ui.resources_3.0.1.200812152237\styles\defaultStyles.xml</tt></dd>
<dt>참조</dt>
<dd><a href="http://groups.google.com/group/xmind/browse_thread/thread/0a5d2e2ab3be1c82?pli=1">Google Groups XMind User Forum &#8211; default settings</a></dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://www.yuiworld.kr/suguni/2009/xmind-default-style-%eb%b3%80%ea%b2%bd/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
