<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en"><title type="text">國三還是菜鳥一枚</title><link rel="alternate" type="text/html" href="http://blog.ericsk.org" /><subtitle type="text">It's all about ericsk.</subtitle><updated>2009-11-06T02:29:01+00:00</updated><generator uri="http://wordpress.org/">WordPress</generator><id>http://blog.ericsk.org/feed/atom</id><geo:lat>25.02</geo:lat><geo:long>121.38</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/2.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><link rel="self" href="http://feeds.feedburner.com/ericsk" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><title type="html">Google 丟出 Closure Tools</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/ODu8Rvzfo_s/1366" /><category term="程式設計" /><category term="資訊科學" /><category term="closure tools" /><category term="google" /><category term="javascript" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-11-05T18:29:01-08:00</updated><id>http://blog.ericsk.org/?p=1366</id><summary type="html">Google 為了提升 JavaScript-based 的應用程式效能投注了不少心力啊..

今天看到 Google 釋出 Closure Tools 的消息，發現這是 Google 所提供的一組用在 JavaScript 開發的工具，所以馬上就到它的首頁去瞧瞧。
目前 Closure Tools 包含三套工具，以下一一介紹：


Closure Compiler
這套工具顧名思義，它是用來編譯（compile）JavaScript 程式碼的編譯器，除了像是常見的 JavaScript  compressor 提供的功能，它也會分析程式碼，把不需要的部份移除，減少 JavaScript 程式碼的大小及提升效率，如果程式要上線前，不妨試著用這個工具編譯一下吧！

要使用 Closure Compiler 也很容易，只要到 這個網站 上操作就可以了。如果你自認是個 geek，那也可以利用它所提供的 REST API 來作編譯的動作，可以整合到自己的部署工具中。


Closure Library
這套工具就像是許多 JavaScript framework 一般，提供了許多簡化 DOM 操作的函式庫，還有豐富的 UI 元件，詳情可以看看這裡來瞭解 Closure Library 提供了哪些函式庫及 UI 元件。

Closure Template
很多時候我們會利用 JavaScript 來取得遠端的資料（透過 AJAX 相關的技術），接著用來組合出畫面中的某個部份，但是在 JavaScript 中拼寫複雜的 HTML layout [...]</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1366">&lt;p&gt;Google 為了提升 JavaScript-based 的應用程式效能投注了不少心力啊..&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/closure" target="_blank"&gt;&lt;img src="http://code.google.com/intl/zh-TW/closure/images/logo128px.png" alt=""/&gt;&lt;/a&gt;&lt;br /&gt;
今天看到 &lt;a href="http://googlecode.blogspot.com/2009/11/introducing-closure-tools.html"&gt;Google 釋出 Closure Tools&lt;/a&gt; 的消息，發現這是 Google 所提供的一組用在 JavaScript 開發的工具，所以馬上就到&lt;a href="http://code.google.com/closure/" target="_blank" title="Closure Tools - Google Code"&gt;它的首頁&lt;/a&gt;去瞧瞧。&lt;/p&gt;
&lt;p&gt;目前 Closure Tools 包含三套工具，以下一一介紹：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;&lt;a href="http://code.google.com/closure/compiler/" target="_blank"&gt;Closure Compiler&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;這套工具顧名思義，它是用來編譯（compile）JavaScript 程式碼的編譯器，除了像是常見的 JavaScript  compressor 提供的功能，它也會分析程式碼，把不需要的部份移除，減少 JavaScript 程式碼的大小及提升效率，如果程式要上線前，不妨試著用這個工具編譯一下吧！&lt;/p&gt;
&lt;div style="text-align:center"&gt;&lt;img src="http://lh4.ggpht.com/_hNy_9UI1_R8/SvOHHhM2daI/AAAAAAAADM8/EE563HnedRQ/s800/Closure%20Compiler.png" alt="" style="border:1px solid #999;padding:2px"/&gt;&lt;/div&gt;
&lt;p&gt;要使用 Closure Compiler 也很容易，只要到 &lt;a href="http://closure-compiler.appspot.com/" target="_blank"&gt;這個網站&lt;/a&gt; 上操作就可以了。如果你自認是個 geek，那也可以利用它所提供的 &lt;a href="http://code.google.com/closure/compiler/docs/gettingstarted_api.html" target="_blank"&gt;REST API&lt;/a&gt; 來作編譯的動作，可以整合到自己的部署工具中。
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&lt;a href="http://code.google.com/closure/library/" target="_blank"&gt;Closure Library&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;這套工具就像是許多 JavaScript framework 一般，提供了許多簡化 DOM 操作的函式庫，還有豐富的 UI 元件，詳情可以看看&lt;a href="http://closure-library.googlecode.com/svn/trunk/closure/goog/docs/index.html" target="_blank"&gt;這裡&lt;/a&gt;來瞭解 Closure Library 提供了哪些函式庫及 UI 元件。&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;&lt;a href="http://code.google.com/closure/templates/" target="_blank"&gt;Closure Template&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;很多時候我們會利用 JavaScript 來取得遠端的資料（透過 AJAX 相關的技術），接著用來組合出畫面中的某個部份，但是在 JavaScript 中拼寫複雜的 HTML layout 總是令人感到噁心，而且 layout 如果更複雜時就很難維護了。&lt;br /&gt;
這套工具就是提供一個在 JavaScript 中做 template 的機制及函式庫，你可以把 HTML layout 的部份寫成一個 *.soy 檔案，接著再利用 Closure Template 提供的工具把這個 template 檔案編譯成 JavaScript 的程式碼，這樣應該可以讓 JavaScript 開發者省去很多處理版面的負擔吧！&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你平時的工作就是在處理一大堆的 JavaScript，那我建議你一定要看看並且使用這套工具，絕對可以為你的程式碼提升效率、或是降低開發時的阻力！&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=ODu8Rvzfo_s:Xcm3PTsiHxc:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=ODu8Rvzfo_s:Xcm3PTsiHxc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=ODu8Rvzfo_s:Xcm3PTsiHxc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/ODu8Rvzfo_s" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1366</feedburner:origLink></entry><entry><title type="html">iTHome 的人物專訪</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/bQstyJJc8NY/1365" /><category term="生活逸趣" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-10-30T02:08:33-07:00</updated><id>http://blog.ericsk.org/?p=1365</id><summary type="html">聽說這一期的 iTHome 電腦報 (422) 有我的專訪，其實好像被寫得太誇張，讓我感到十分地不好意思&amp;#8230;
不過左下角的人物介紹，應該是「臺灣大學資訊工程所」而非「臺北大學資訊工程所」才對啊 Orz。
</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1365">&lt;p&gt;聽說這一期的 iTHome 電腦報 (422) 有我的專訪，其實好像被寫得太誇張，讓我感到十分地不好意思&amp;#8230;&lt;/p&gt;
&lt;p&gt;不過左下角的人物介紹，應該是「臺灣大學資訊工程所」而非&lt;del&gt;「臺北大學資訊工程所」&lt;/del&gt;才對啊 Orz。&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=bQstyJJc8NY:j3oj7R1h5NA:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=bQstyJJc8NY:j3oj7R1h5NA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=bQstyJJc8NY:j3oj7R1h5NA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/bQstyJJc8NY" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1365</feedburner:origLink></entry><entry><title type="html">Android Éclair 上菜囉～</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/aagBjevmrXE/1363" /><category term="程式設計" /><category term="行動通訊" /><category term="資訊科學" /><category term="Android" /><category term="cupcake" /><category term="donut" /><category term="éclair" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-10-27T19:00:51-07:00</updated><id>http://blog.ericsk.org/?p=1363</id><summary type="html">這 Android 也更新得太快了一點&amp;#8230;LOL

還記得在九月中我在敝社訓練所上 Android 課的那天，突然就出現了 Android 1.6 (donut) 的釋出消息（當然也包括 SDK 的更新），結果才一個多月的時間，Android 2.0 (éclair) 就出現了：

而且連 SDK 也已經釋出 2.0 的版本。不知道現在使用 android 1.5 (cupcake) 的 android 手機有沒有機會「升級」（？）到 éclair 版本呢？
不過顯然地，android developer 又有新的東西要讀了&amp;#8230;XD 可以看看 gasolin 的介紹。
</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1363">&lt;p&gt;這 Android 也更新得太快了一點&amp;#8230;LOL&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.ericsk.org/wp-content/uploads/2009/10/eclair-android.png" alt="eclair-android" title="eclair-android" width="200" height="162" class="alignnone size-full wp-image-1364" /&gt;&lt;br /&gt;
還記得在九月中我在敝社訓練所上 Android 課的那天，突然就出現了 Android 1.6 (donut) 的釋出消息（當然也包括 SDK 的更新），結果才一個多月的時間，Android 2.0 (éclair) 就出現了：&lt;/p&gt;
&lt;p&gt;&lt;object width="500" height="315"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/opZ69P-0Jbc&amp;#038;hl=zh_TW&amp;#038;fs=1&amp;#038;color1=0x006699&amp;#038;color2=0x54abd6&amp;#038;hd=1&amp;#038;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/opZ69P-0Jbc&amp;#038;hl=zh_TW&amp;#038;fs=1&amp;#038;color1=0x006699&amp;#038;color2=0x54abd6&amp;#038;hd=1&amp;#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="315"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;而且連 &lt;a href="http://developer.android.com/sdk/index.html" target="_blank"&gt;SDK 也已經釋出 2.0 的版本&lt;/a&gt;。不知道現在使用 android 1.5 (cupcake) 的 android 手機有沒有機會「升級」（？）到 éclair 版本呢？&lt;/p&gt;
&lt;p&gt;不過顯然地，android developer 又有新的東西要讀了&amp;#8230;XD 可以看看 &lt;a href="http://inet6.blogspot.com/2009/10/eclair-android-20.html" target="_blank"&gt;gasolin 的介紹&lt;/a&gt;。&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=aagBjevmrXE:y_2FMwlZQZA:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=aagBjevmrXE:y_2FMwlZQZA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=aagBjevmrXE:y_2FMwlZQZA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/aagBjevmrXE" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1363</feedburner:origLink></entry><entry><title type="html">首頁極簡主義</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/xDYwA2UCK0M/1361" /><category term="網際網路" /><category term="資訊科學" /><category term="web" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-10-22T08:49:54-07:00</updated><id>http://blog.ericsk.org/?p=1361</id><summary type="html">我還是不太懂為什麼很多網站急著在首頁堆出一堆訊息，但卻不告訴使用者這個網站可以做什麼呢？
Web 2.0 這個名詞起來之外，國內外很多號稱 web 2.0 的網站一個個冒出來，每個網站各有特色，但我發現國內網站的設計好像都怕首頁很空洞塞得滿滿的，因為我不想戰網站，所以就不擷圖示範了，但來看看幾個「全球性」的 web2.0 網站首頁：
blogger.com

flickr.com

facebook.com

twitter.com

我覺得這幾個網站擁有的共同特色就是首頁簡單，就是讓你登入、介紹特色，因為這些都是很鮮明要表現個人內容的網站，訪客大多都是使用搜尋引擎進到內容深處，要找朋友的「內容」，也大多會直接連結到該使用者的頁面。那到底誰會跑去逛首頁呢？恐怕就是新訪客，以及想要介紹這個網站的人，所以在首頁明確地告訴使用者：「來我的網站可以寫文章、放照片、找朋友&amp;#8230;.等」，不是很自然的事嗎？
反觀國內網站，不知道是不是都被某入口網站帶壞了，大家拼了命地在首頁狂塞一堆資訊，新訪客在眼花遼亂、走馬看花之際，真的知道他可以「使用」這個網站嗎？
</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1361">&lt;p&gt;我還是不太懂為什麼很多網站急著在首頁堆出一堆訊息，但卻不告訴使用者這個網站可以做什麼呢？&lt;/p&gt;
&lt;p&gt;Web 2.0 這個名詞起來之外，國內外很多號稱 web 2.0 的網站一個個冒出來，每個網站各有特色，但我發現國內網站的設計好像都怕首頁很空洞塞得滿滿的，因為我不想戰網站，所以就不擷圖示範了，但來看看幾個「全球性」的 web2.0 網站首頁：&lt;/p&gt;
&lt;h4&gt;blogger.com&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/ericsk0313/4035047652/" title="Flickr 上 eric.sk 的 Blogger: 建立您的免費網誌"&gt;&lt;img src="http://farm3.static.flickr.com/2635/4035047652_9b513e7bf9.jpg" width="500" height="349" alt="Blogger: 建立您的免費網誌" style="border:1px solid #999;padding:2px"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;flickr.com&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/ericsk0313/4034294513/" title="Flickr 上 eric.sk 的 歡迎來到 Flickr - 相片分享"&gt;&lt;img src="http://farm3.static.flickr.com/2768/4034294513_d264235320.jpg" width="473" height="500" alt="歡迎來到 Flickr - 相片分享" style="border:1px solid #999;padding:2px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;facebook.com&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/ericsk0313/4034294991/" title="Flickr 上 eric.sk 的 歡迎使用 Facebook！ | Facebook"&gt;&lt;img src="http://farm3.static.flickr.com/2439/4034294991_1be1f16505.jpg" width="500" height="339" alt="歡迎使用 Facebook！ | Facebook" style="border:1px solid #999;padding:2px"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;twitter.com&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/ericsk0313/4035049018/" title="Flickr 上 eric.sk 的 Twitter"&gt;&lt;img src="http://farm3.static.flickr.com/2590/4035049018_f29de95202.jpg" width="500" height="339" alt="Twitter" style="border:1px solid #999;padding:2px"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我覺得這幾個網站擁有的共同特色就是首頁簡單，就是讓你登入、介紹特色，因為這些都是很鮮明要表現個人內容的網站，訪客大多都是使用搜尋引擎進到內容深處，要找朋友的「內容」，也大多會直接連結到該使用者的頁面。那到底誰會跑去逛首頁呢？恐怕就是新訪客，以及想要介紹這個網站的人，所以在首頁明確地告訴使用者：「來我的網站可以寫文章、放照片、找朋友&amp;#8230;.等」，不是很自然的事嗎？&lt;/p&gt;
&lt;p&gt;反觀國內網站，不知道是不是都被某入口網站帶壞了，大家拼了命地在首頁狂塞一堆資訊，新訪客在眼花遼亂、走馬看花之際，真的知道他可以「使用」這個網站嗎？&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=xDYwA2UCK0M:9C04flisziI:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=xDYwA2UCK0M:9C04flisziI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=xDYwA2UCK0M:9C04flisziI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/xDYwA2UCK0M" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1361</feedburner:origLink></entry><entry><title type="html">JavaScript 跟你想得不一樣（二）</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/A7QLx98EXTk/1360" /><category term="程式設計" /><category term="資訊科學" /><category term="javascript" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-10-22T08:23:00-07:00</updated><id>http://blog.ericsk.org/?p=1360</id><summary type="html">與其說跟你想得不一樣，還不如說是容易造成誤解吧。
到底 this 是誰？
JavaScript 的 code 寫多了，你一定會碰到 this 這個關鍵字，是某個 object 下的 method 也好，或是 callback function 也好，關於 this 的用法常常會讓人搞混。
以一句簡單的話來說：在 function 裡，this 所代表的就是呼叫這個 function 的東西。
以下面這段程式碼為例，onButtonClick 是一個處理按鈕被按下時的 callback function：
var button = document.getElementById(&amp;#039;foo&amp;#039;);
var onButtonClick = function(evt) {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;alert(this);
};

if (button.addEventListener) {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;button.addEventListener(&amp;#039;click&amp;#039;, onButtonClick, false);
} else {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;button.attachEvent(&amp;#039;onclick&amp;#039;, onButtonClick);
}

上面這段 code 分別為了 non-IE 及 IE 瀏覽器不同的註冊 event handler 的寫法來操作，你可以發現，當你在 non-IE 的瀏覽器上執行這段程式碼，當按鈕按下時，訊息視窗應該會跳出有 HTMLInputElement 的訊息，表示呼叫這個 callback function 的物件就是 [...]</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1360">&lt;p&gt;與其說跟你想得不一樣，還不如說是容易造成誤解吧。&lt;/p&gt;
&lt;h4&gt;到底 this 是誰？&lt;/h4&gt;
&lt;p&gt;JavaScript 的 code 寫多了，你一定會碰到 &lt;code&gt;this&lt;/code&gt; 這個關鍵字，是某個 object 下的 method 也好，或是 callback function 也好，關於 &lt;code&gt;this&lt;/code&gt; 的用法常常會讓人搞混。&lt;/p&gt;
&lt;p&gt;以一句簡單的話來說：&lt;b&gt;在 function 裡，&lt;code&gt;this&lt;/code&gt; 所代表的就是呼叫這個 function 的東西&lt;/b&gt;。&lt;/p&gt;
&lt;p&gt;以下面這段程式碼為例，&lt;code&gt;onButtonClick&lt;/code&gt; 是一個處理按鈕被按下時的 callback function：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;var button = document.getElementById(&amp;#039;foo&amp;#039;);
var onButtonClick = function(evt) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(this);
};

if (button.addEventListener) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.addEventListener(&amp;#039;click&amp;#039;, onButtonClick, false);
} else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.attachEvent(&amp;#039;onclick&amp;#039;, onButtonClick);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;上面這段 code 分別為了 non-IE 及 IE 瀏覽器不同的註冊 event handler 的寫法來操作，你可以發現，當你在 non-IE 的瀏覽器上執行這段程式碼，當按鈕按下時，訊息視窗應該會跳出有 &lt;b&gt;&lt;code&gt;HTMLInputElement&lt;/code&gt;&lt;/b&gt; 的訊息，表示呼叫這個 callback function 的物件就是 &lt;code&gt;button&lt;/code&gt;，然而，在 IE 底下，你看到的則是 &lt;b&gt;&lt;code&gt;Window&lt;/code&gt;&lt;/b&gt;。雖然有這樣的不同，但至少有一件事是一致的：&lt;b&gt;&lt;code&gt;this&lt;/code&gt; 代表的就是 caller&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;至於一般的 function，「沒指定的話」都是 &lt;code&gt;window&lt;/code&gt;，注意我這裡強調是「沒指定」，所以這也就代表了「可以指定」，以下面這段程式碼為例：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;var foo = function(x) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(x);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(this);
}
foo(&amp;#039;abc&amp;#039;);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;你應該會看到訊息視窗先顯示 &lt;code&gt;abc&lt;/code&gt;，接著就是顯示出 &lt;code&gt;window&lt;/code&gt;。但若是變成下面這樣呢？&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;var foo = function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(arguments[0]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(this.name);
}
var bar = { name: &amp;#039;bar&amp;#039; };
foo.apply(bar, [&amp;#039;abc&amp;#039;]);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;在呼叫 &lt;code&gt;foo&lt;/code&gt; 函式時使用 &lt;code&gt;apply&lt;/code&gt; 方法，就可以&lt;em&gt;更換 caller&lt;/em&gt;（正確地說是切換 context），而因為用了 &lt;code&gt;apply&lt;/code&gt; 方法，函式的參數就要改以陣列傳入。當然，這時候的 &lt;code&gt;this&lt;/code&gt; 就變成了 &lt;code&gt;bar&lt;/code&gt;&amp;#8230;..&lt;/p&gt;
&lt;p&gt;簡單地結論就是&amp;#8230;.要在 function 裡使用 &lt;code&gt;this&lt;/code&gt; 一定要很小心啊啊啊～&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=A7QLx98EXTk:Ovggpur2oC4:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=A7QLx98EXTk:Ovggpur2oC4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=A7QLx98EXTk:Ovggpur2oC4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/A7QLx98EXTk" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1360</feedburner:origLink></entry><entry><title type="html">JavaScript 跟你想得不一樣（一）</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/w5SC48GNd3s/1359" /><category term="生活逸趣" /><category term="javascript" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-10-20T06:38:36-07:00</updated><id>http://blog.ericsk.org/?p=1359</id><summary type="html">寫 JavaScript 的你，會不會常常踩到這些地雷呢？
JavaScript 常常會被人誤解為是簡單的語言，以我自己的經驗，如果有人跟你說 JavaScript 很簡單，那一定是他不熟 JavaScript，會造成這個現象，最主要的原因是大多數的程式開發者都不是學 JavaScript 出身的（我也不是），所以開發者常常會把自己在其它語言的習慣帶過來，於是很多誤會就此而生&amp;#8230;..（JavaScript 是很 nice 的，這其中一定有什麼誤會&amp;#8230;.）
變數 scope 是根據 function 不是 block
想像一下這段程式碼：
var a = 1;
if (true) {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;var a = 2;
}
alert(a);
你覺得 alert 跳出來的訊息視窗會顯示什麼呢？答案是2。如果你太習慣 C/C++/Java, &amp;#8230;.. 這類知名的程式語言，說不定你會回答1。
所以如果是這個例子你就不會答錯了：
var a = 1;
function foo() {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;var a = 2;
}
foo();
alert(a);
沒錯！答案就是1，但如果是這樣呢？
var a = 1;
function foo() {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;alert(a);
}
foo();
別想太多，這段 code 的執行結果當然會跳出1。那如果變成這樣呢？
var a = 1;
function foo() {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;alert(a);
&amp;#160;&amp;#160;&amp;#160;&amp;#160;var a = 2;
}
foo();
感覺要瘋掉了嗎？ XD
不只是 Global [...]</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1359">&lt;p&gt;寫 JavaScript 的你，會不會常常踩到這些地雷呢？&lt;/p&gt;
&lt;p&gt;JavaScript 常常會被人誤解為是簡單的語言，以我自己的經驗，如果有人跟你說 JavaScript 很簡單，那一定是他不熟 JavaScript，會造成這個現象，最主要的原因是大多數的程式開發者都不是學 JavaScript 出身的（我也不是），所以開發者常常會把自己在其它語言的習慣帶過來，於是很多誤會就此而生&amp;#8230;..（JavaScript 是很 nice 的，這其中一定有什麼誤會&amp;#8230;.）&lt;/p&gt;
&lt;h4&gt;變數 scope 是根據 function 不是 block&lt;/h4&gt;
&lt;p&gt;想像一下這段程式碼：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;var a = 1;
if (true) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var a = 2;
}
alert(a);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;你覺得 &lt;code&gt;alert&lt;/code&gt; 跳出來的訊息視窗會顯示什麼呢？答案是&lt;b&gt;2&lt;/b&gt;。如果你太習慣 C/C++/Java, &amp;#8230;.. 這類知名的程式語言，說不定你會回答&lt;b&gt;1&lt;/b&gt;。&lt;/p&gt;
&lt;p&gt;所以如果是這個例子你就不會答錯了：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;var a = 1;
function foo() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var a = 2;
}
foo();
alert(a);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;沒錯！答案就是&lt;b&gt;1&lt;/b&gt;，但如果是這樣呢？&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;var a = 1;
function foo() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(a);
}
foo();&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;別想太多，這段 code 的執行結果當然會跳出&lt;b&gt;1&lt;/b&gt;。那如果變成這樣呢？&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;var a = 1;
function foo() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(a);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var a = 2;
}
foo();&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;感覺要瘋掉了嗎？ XD&lt;/p&gt;
&lt;h4&gt;不只是 Global 很可怕，window 物件也是&lt;/h4&gt;
&lt;p&gt;在瀏覽器上寫 JavaScript 或多或少都會用到 &lt;code&gt;window&lt;/code&gt; 物件下的成員，但很可怕的是你常常不知道你在用它，因為&lt;b&gt;使用 &lt;code&gt;window&lt;/code&gt; 物件下的成員，&lt;code&gt;window&lt;/code&gt; 是可以省略不打的&lt;/b&gt;。比方說很多人愛用 &lt;code&gt;alert&lt;/code&gt; 來顯示訊息或 debug，但其實 &lt;code&gt;alert&lt;/code&gt; 的「全名」應該是叫 &lt;code&gt;window.alert&lt;/code&gt; 才對，喔！當然 &lt;code&gt;location&lt;/code&gt; 也是叫 &lt;code&gt;window.location&lt;/code&gt;，同樣地，你也不要不宣告就直接使用 &lt;code&gt;innerWidth&lt;/code&gt; 這個變數 &amp;#8230;.. 所以說 &lt;code&gt;window&lt;/code&gt; 真的很可怕！！&lt;/p&gt;
&lt;p&gt;但可怕的還不只是這樣，如果有一段 code 是這樣：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;x = 3;
....
alert(window.x);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;也許你（不）知道：&lt;b&gt;在使用一個變數時，若沒用 &lt;code&gt;var&lt;/code&gt; 這個關鍵字，它會被定義在 &lt;code&gt;window&lt;/code&gt; 物件下&lt;/b&gt;，所以上面這段 code 當然沒有問題，&lt;code&gt;x&lt;/code&gt; 就是 &lt;code&gt;window.x&lt;/code&gt;，執行一下也沒錯，就是跳個訊息對話盒顯示&lt;b&gt;3&lt;/b&gt;。&lt;/p&gt;
&lt;p&gt;那如果你很乖地加了 &lt;code&gt;var&lt;/code&gt; 呢？變成這樣：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;var x = 3;
....
alert(window.x);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;嘿嘿，我就說 &lt;code&gt;window&lt;/code&gt; 很可怕吧！只要你在 global area 下，就算用了 &lt;code&gt;var&lt;/code&gt; 也幫你定義到 &lt;code&gt;window&lt;/code&gt; 物件下！這也就是為什麼很多人寫 JavaScript code 會用一個 anonymous function 來避開 global/window 了。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;(function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var x = 3;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(window.x); // undefined
})();&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;所以說，JavaScript 真的跟你想得不一樣！&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=w5SC48GNd3s:2BSYOa4d7l4:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=w5SC48GNd3s:2BSYOa4d7l4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=w5SC48GNd3s:2BSYOa4d7l4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/w5SC48GNd3s" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1359</feedburner:origLink></entry><entry><title type="html">JavaScript 中的 document.createDocumentFragment</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/rBlQe2CADYI/1358" /><category term="程式設計" /><category term="資訊科學" /><category term="dom" /><category term="javascript" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-10-11T23:43:07-07:00</updated><id>http://blog.ericsk.org/?p=1358</id><summary type="html">其實只是一些基本的東西，只是容易被忘記。
今天強者我同學問我一個 JavaScript 的問題，大意是說他有一個迴圈要跑，而在這個迴圈之中會產生 DOM element，每次一產生 DOM element 就會把它加入到頁面中，然而他程式中的迴圈執行次數不少，造成他這段程式碼有很嚴種的效率問題，簡單地說就是在各個瀏覽器上都有很慢的感覺。
所以我先跟他說，你可以先把欲生成的東西以字串方式組合好，然後再一次加入到頁面，程式碼的流程大致如下：（這裡用陣列來串接字串的方式，可以參考我同事寫的文章：在 JavaScript 使用 Array.join 取代大量的字串相加 ）

var html = [];
for (var i in some_array) {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;var node = ..... // 產生 HTML 字串
&amp;#160;&amp;#160;&amp;#160;&amp;#160;html.push(node);
}
targetNode.innerHTML = html.join(&amp;#039;&amp;#039;);

不過當然這個作法有一些問題，比方說光是這樣寫，若是有&amp;#60;script&amp;#62;標籤的話，JavaScript 並不會被 evaluated；或是要把 &amp;#60;option&amp;#62; 塞進 &amp;#60;select&amp;#62; 標籤中，在 IE 就會失效等等。我同學剛好碰到了 &amp;#60;select&amp;#62; 的這個問題，於是我引用 jQuery 中 clean 函式的作法來回答它。

var fragment = document.createDocumentFragment();
for (var i in some_array) {
&amp;#160;&amp;#160;&amp;#160;&amp;#160;var node = document.createElement(&amp;#039;option&amp;#039;);
&amp;#160;&amp;#160;&amp;#160;&amp;#160;node.innerHTML [...]</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1358">&lt;p&gt;其實只是一些基本的東西，只是容易被忘記。&lt;/p&gt;
&lt;p&gt;今天強者我同學問我一個 JavaScript 的問題，大意是說他有一個迴圈要跑，而在這個迴圈之中會產生 DOM element，每次一產生 DOM element 就會把它加入到頁面中，然而他程式中的迴圈執行次數不少，造成他這段程式碼有很嚴種的效率問題，簡單地說就是在各個瀏覽器上都有很慢的感覺。&lt;/p&gt;
&lt;p&gt;所以我先跟他說，你可以先把欲生成的東西以字串方式組合好，然後再&lt;b&gt;一次加入到頁面&lt;/b&gt;，程式碼的流程大致如下：（這裡用陣列來串接字串的方式，可以參考我同事寫的文章：&lt;a href="http://blog.xuite.net/vexed/tech/22697513" target="_blank"&gt;在 JavaScript 使用 Array.join 取代大量的字串相加 &lt;/a&gt;）&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;
var html = [];
for (var i in some_array) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var node = ..... // 產生 HTML 字串
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;html.push(node);
}
targetNode.innerHTML = html.join(&amp;#039;&amp;#039;);
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;不過當然這個作法有一些問題，比方說光是這樣寫，若是有&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;標籤的話，JavaScript 並不會被 evaluated；或是要把 &lt;code&gt;&amp;lt;option&amp;gt;&lt;/code&gt; 塞進 &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; 標籤中，在 IE 就會失效等等。我同學剛好碰到了 &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; 的這個問題，於是我引用 jQuery 中 &lt;code&gt;clean&lt;/code&gt; 函式的作法來回答它。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;
var fragment = document.createDocumentFragment();
for (var i in some_array) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var node = document.createElement(&amp;#039;option&amp;#039;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node.innerHTML = &amp;#039;....&amp;#039;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fragment.appendChild(node);
}
targetNode.appendChild(fragment);
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;在這段程式碼中，使用了 &lt;code&gt;document.createDocumentFragment()&lt;/code&gt; 這個函式產生一個 document fragment，你可以把它想作是一個處理 DOM element 的 buffer，把欲生成的 DOM element 先加入到這個 fragment 中，最後再一次加到頁面的 DOM 結構中，這樣的作法比起在迴圈中一直 &lt;code&gt;appendChild&lt;/code&gt; 來得快上許多，當然更重要的是，問題也被解決了 :)&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=rBlQe2CADYI:YwjF6ByQQ_Q:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=rBlQe2CADYI:YwjF6ByQQ_Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=rBlQe2CADYI:YwjF6ByQQ_Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/rBlQe2CADYI" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1358</feedburner:origLink></entry><entry><title type="html">Plurome: Chrome 上 Plurk 的（非官方）extensions</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/7MXCau06NSI/1357" /><category term="程式設計" /><category term="資訊科學" /><category term="電腦軟體" /><category term="chrome" /><category term="plurk" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-09-20T01:21:29-07:00</updated><id>http://blog.ericsk.org/?p=1357</id><summary type="html">練習寫一個 Chrome extension。
最近 Chrome 瀏覽器的正式版本已經來到 3.0 以上，並且開始支援 Chrome extensions（擴充套件），所以我也趕一下流行先寫了個十分簡單的 Chrome extension &amp;#8212; plurome。
目前這個套件的功能非常簡單，只是在開啟一個頁面時，會在位址列出現一個 plurk 圖案，按下這個圖案後會開啟一個分頁連到 plurk 的畫面，並且把原本網頁的 URL 及標題帶至發噗的視窗，如此而已。
這個專案目前已經 open source，有興趣修改的同好，不妨一起來多多增加它的功能吧 :P
</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1357">&lt;p&gt;練習寫一個 Chrome extension。&lt;/p&gt;
&lt;p&gt;最近 &lt;a href="http://www.google.com.tw/chrome" target="_blank"&gt;Chrome&lt;/a&gt; 瀏覽器的正式版本已經來到 3.0 以上，並且開始支援 Chrome extensions（擴充套件），所以我也趕一下流行先寫了個十分簡單的 Chrome extension &amp;#8212; &lt;a href="http://code.google.com/p/plurome" target="_blank"&gt;plurome&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;目前這個套件的功能非常簡單，只是在開啟一個頁面時，會在位址列出現一個 plurk 圖案，按下這個圖案後會開啟一個分頁連到 plurk 的畫面，並且把原本網頁的 URL 及標題帶至發噗的視窗，如此而已。&lt;/p&gt;
&lt;p&gt;這個專案目前已經 open source，有興趣修改的同好，不妨一起來多多增加它的功能吧 :P&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=7MXCau06NSI:1mdIcy_qagQ:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=7MXCau06NSI:1mdIcy_qagQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=7MXCau06NSI:1mdIcy_qagQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/7MXCau06NSI" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1357</feedburner:origLink></entry><entry><title type="html">當 Snow Leopard 碰上 Android SDK</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/ziWdfF-CbHU/1356" /><category term="程式設計" /><category term="行動通訊" /><category term="資訊科學" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-09-18T03:30:26-07:00</updated><id>http://blog.ericsk.org/?p=1356</id><summary type="html">其實也只是因為 Java 變成 64-bit 的關係&amp;#8230;。
最近電腦已全面換成 Snow Leopard，系統的 Java 也變成 64-bit，而 Android SDK 中的 ddms 這個工具附的 swt.jar 卻是 32-bit 的，而且執行 ddms 會去找 $ANDROID_SDK/tools/lib/x86_64/swt.jar 這個路徑而爛掉，所以解決的方法，就是到這裡，找出適用於 OSX 64-bit 的 SWT binary，下載回來後，把 swt.jar 放在 $ANDROID_SDK/tools/lib/x86_64/ 目錄下即可。
</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1356">&lt;p&gt;其實也只是因為 Java 變成 64-bit 的關係&amp;#8230;。&lt;/p&gt;
&lt;p&gt;最近電腦已全面換成 Snow Leopard，系統的 Java 也變成 64-bit，而 Android SDK 中的 &lt;code&gt;ddms&lt;/code&gt; 這個工具附的 &lt;code&gt;swt.jar&lt;/code&gt; 卻是 32-bit 的，而且執行 ddms 會去找 &lt;code&gt;$ANDROID_SDK/tools/lib/x86_64/swt.jar&lt;/code&gt; 這個路徑而爛掉，所以解決的方法，就是到&lt;a href="http://download.eclipse.org/eclipse/downloads/drops/R-3.5-200906111540/index.php#swt" target="_blank"&gt;這裡&lt;/a&gt;，找出適用於 OSX 64-bit 的 SWT binary，下載回來後，把 &lt;code&gt;swt.jar&lt;/code&gt; 放在 &lt;code&gt;$ANDROID_SDK/tools/lib/x86_64/&lt;/code&gt; 目錄下即可。&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=ziWdfF-CbHU:SkB8w1HnBKw:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=ziWdfF-CbHU:SkB8w1HnBKw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=ziWdfF-CbHU:SkB8w1HnBKw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/ziWdfF-CbHU" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1356</feedburner:origLink></entry><entry><title type="html">[Taipei GTUG] Chrome Extras</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ericsk/~3/lqlT02YQaZM/1355" /><category term="程式設計" /><category term="資訊科學" /><category term="chrome" /><category term="gtug" /><category term="moztw" /><category term="taipei gtug" /><author><name>ericsk</name><uri>http://blog.ericsk.org/</uri></author><updated>2009-09-03T21:27:25-07:00</updated><id>http://blog.ericsk.org/?p=1355</id><summary type="html">沒想到還有 MozTW 的人來亂入，但也讓大家收穫不少。
這週三 Taipei GTUG 辦了一個討論 Chrome extras（包括 extensions 及 themes）的聚會，原本擔心下大雨會沒有什麼觀眾，結果沒想到還是來了30多人，而且有許多第一次聚會沒有看過的新面孔，也許這就是社群壯大(?)的跡象吧！（謎之音：天真天真）（謎之音again: 那第一次聚會後沒來的&amp;#8230;?）

在活動開始時，我們一同欣賞了這部影片的前半段（因為影片全長一小時），然後我稍微跟大家整理一下開發 Chrome extensions 的步驟及方法，看起來寫一個 Chrome extensions 就像寫網頁一樣簡單，你只要會 HTML, CSS（當然支援一些 -webkit-xxxx 的語法） 及 JavaScript 就會寫 Chrome extensions 了！後來也感謝 Richard (Dlackty) 補充說明製作 Chrome themes 的方式。

不過除了討論 Chrome extras 之外，因為大家的好奇心，我也為大家展示了一些 Google Wave 到底是怎樣的東西，當場就做起來示範，感受一下更豐富的多人交談、協同工作的魅力。

另外，MozTW 社群的人也沒放過這次聚會的機會，跑來這個場子介紹 Mozilla Labs 的 Jetpack 及 Personas 兩個 project 來比較與 Chrome extras 的異同。讓參與這次聚會的人收穫不少。

不過，這畢竟還是個 GTUG 的聚會，提醒一下 [...]</summary><content type="html" xml:base="http://blog.ericsk.org/archives/1355">&lt;p&gt;沒想到還有 MozTW 的人來亂入，但也讓大家收穫不少。&lt;/p&gt;
&lt;p&gt;這週三 &lt;a href="http://taipei-gtug.org/" target="_blank"&gt;Taipei GTUG&lt;/a&gt; 辦了一個討論 Chrome extras（包括 extensions 及 themes）的聚會，原本擔心下大雨會沒有什麼觀眾，結果沒想到還是來了30多人，而且有許多第一次聚會沒有看過的新面孔，也許這就是社群壯大(?)的跡象吧！（謎之音：天真天真）（謎之音again: 那第一次聚會後沒來的&amp;#8230;?）&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/fqoOyt9cZ8VZ_-EDLh7SGw?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_E4WvpY4NVZU/Sp6JCvKDOlI/AAAAAAAAAso/mkojLyBZcgo/s400/IMG_1923.JPG" style="border:1px solid #999;padding: 2px"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在活動開始時，我們一同欣賞了&lt;a href="http://www.youtube.com/watch?v=g03bcb70kFQ" target="_blank"&gt;這部影片&lt;/a&gt;的前半段（因為影片全長一小時），然後我稍微跟大家整理一下開發 Chrome extensions 的步驟及方法，看起來寫一個 Chrome extensions 就像寫網頁一樣簡單，你只要會 HTML, CSS（當然支援一些 &lt;code&gt;-webkit-xxxx&lt;/code&gt; 的語法） 及 JavaScript 就會寫 Chrome extensions 了！後來也感謝 &lt;a href="http://www.plurk.com/dlackty" target="_blank"&gt;Richard (Dlackty)&lt;/a&gt; 補充&lt;a href="http://docs.google.com/present/edit?id=0Acgy3rVzY0SMYWpqOXp3bmtqZ2Z3XzMwMGR4cjc1a2hn&amp;#038;hl=zh_TW" target="_blank"&gt;說明製作 Chrome themes 的方式&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/XDQINfFpYHFpjAcluTQMZQ?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_E4WvpY4NVZU/Sp6JZR3DDYI/AAAAAAAAAs4/xXv4P01bHAY/s400/IMG_1936.JPG"  style="border:1px solid #999;padding:2px"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不過除了討論 Chrome extras 之外，因為大家的好奇心，我也為大家展示了一些 &lt;a href="http://wave.google.com/" target="_blank"&gt;Google Wave&lt;/a&gt; 到底是怎樣的東西，當場就做起來示範，感受一下更豐富的多人交談、協同工作的魅力。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/F32EaP1_cSD0lWH1XXxu-w?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_E4WvpY4NVZU/Sp6J0nq6FhI/AAAAAAAAAtA/rAs8BffGglc/s400/IMG_1946.JPG" style="border:1px solid #999;padding:2px"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外，MozTW 社群的人也沒放過這次聚會的機會，跑來這個場子介紹 &lt;a href="http://labs.mozilla.com/" target="_blank"&gt;Mozilla Labs&lt;/a&gt; 的 &lt;a href="https://jetpack.mozillalabs.com/" target="_blank"&gt;Jetpack&lt;/a&gt; 及 &lt;a href="http://www.getpersonas.com/" target="_blank"&gt;Personas&lt;/a&gt; 兩個 project 來比較與 Chrome extras 的異同。讓參與這次聚會的人收穫不少。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/2ulVMbbFiPcDZcDLBZMgkw?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_E4WvpY4NVZU/Sp6J-tIX_AI/AAAAAAAAAtI/eQST2BiwE1k/s400/IMG_1960.JPG"  style="border:1px solid #999;padding:2px"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不過，這畢竟還是個 GTUG 的聚會，提醒一下 :P&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=lqlT02YQaZM:4SF0JRYkKL4:s-8VKXkisxk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?d=s-8VKXkisxk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ericsk?a=lqlT02YQaZM:4SF0JRYkKL4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ericsk?i=lqlT02YQaZM:4SF0JRYkKL4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ericsk/~4/lqlT02YQaZM" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://blog.ericsk.org/archives/1355</feedburner:origLink></entry></feed>
