<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-21029905</atom:id><lastBuildDate>Fri, 02 Mar 2012 16:21:38 +0000</lastBuildDate><category>Google Chrome</category><category>Mobile Web</category><category>Tech Talk</category><category>讀書心得</category><category>Travel</category><category>媒體報導</category><category>nodejs</category><category>投資理財</category><category>Others</category><category>網頁前端技術</category><category>網路廣告</category><category>清大科管</category><category>新創網站</category><category>Tutorial</category><category>作品集</category><category>YUI</category><category>Android</category><category>莒光週記</category><category>BuzzShare</category><category>Facebook</category><category>Yahoo</category><category>Google App Engine</category><category>Entrepreneurship</category><category>實用工具</category><title>clayliao.f2e</title><description /><link>http://clayliao.blogspot.com/</link><managingEditor>noreply@blogger.com (clay liao)</managingEditor><generator>Blogger</generator><openSearch:totalResults>262</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/buzzshareinside" /><feedburner:info uri="buzzshareinside" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>buzzshareinside</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-7084138834953883943</guid><pubDate>Thu, 01 Mar 2012 14:09:00 +0000</pubDate><atom:updated>2012-03-02T18:04:21.570+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">nodejs</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] Nodejs 學習筆記 (4) -- express framework</title><description>續前文：&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://clayliao.blogspot.com/2011/08/build-nodejs-environment.html" target="_blank"&gt;[教學] Nodejs 學習筆記 (1) -- 建立開發環境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clayliao.blogspot.com/2011/08/using-npm-manage-nodejs-pkg.html" target="_blank"&gt;[教學] Nodejs 學習筆記 (2) -- 使用 npm 管理套件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clayliao.blogspot.com/2011/08/dom-manipulation-on-nodejs.html" target="_blank"&gt;[教學] Nodejs 學習筆記 (3) -- 操作 DOM 物件&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;






















express - Nodejs MVC Framework&lt;/h3&gt;
MVC 是多數開發者很容易上手的架構，Node.js 上也有許多 Model-View-Control 架構的 Framework，這裡我們介紹最為普及的 &lt;a href="http://expressjs.com/" target="_blank"&gt;express&lt;/a&gt;。如果您需要別的網站來擔保的話， &lt;a href="http://expressjs.com/" target="_blank"&gt;express&lt;/a&gt; 官方網站也列出了幾個使用 express 的&lt;a href="http://expressjs.com/applications.html" target="_blank"&gt;成功案例&lt;/a&gt;，其中還包含小有名氣的新創網站 &lt;a href="http://storify.com/" target="_blank"&gt;Storify&lt;/a&gt;！&lt;br&gt;
&lt;h3&gt;



























安裝 express &lt;/h3&gt;
若您已按照先前的教學準備好了 &lt;a href="http://clayliao.blogspot.com/2011/08/using-npm-manage-nodejs-pkg.html" target="_blank"&gt;npm&lt;/a&gt;，安裝 &lt;a href="http://expressjs.com/" target="_blank"&gt;express&lt;/a&gt; 只需要一行指令（如果要 global scope 則需加上參數 &lt;b&gt;&lt;span style="color: #274e13;"&gt;-g&lt;/span&gt;&lt;/b&gt;）：&lt;br&gt;
&lt;pre style="-webkit-box-shadow: rgba(0, 0, 0, 0.589844) 1px 2px 2px; background-attachment: initial; background-clip: initial; background-color: rgba(0, 0, 0, 0.496094); background-image: initial; background-origin: initial; border-bottom-color: rgb(50, 50, 50); border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(50, 50, 50); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(50, 50, 50); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(50, 50, 50); border-top-left-radius: 5px; border-top-right-radius: 5px; border-top-style: solid; border-top-width: 1px; font-size: 14px; line-height: 21px; margin-bottom: 20px; margin-left: 10px; margin-right: 10px; margin-top: 20px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 25px; padding-left: 20px; padding-right: 20px; padding-top: 25px;"&gt;&lt;code style="font-family: &amp;#39;Helvetica Neue&amp;#39;, &amp;#39;Lucida Grande&amp;#39;, Arial; outline-color: initial; outline-style: none; outline-width: initial;"&gt;$ npm install express&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;


























建立新專案&lt;/h3&gt;
安裝成功 &lt;a href="http://expressjs.com/" target="_blank"&gt;express&lt;/a&gt; 後，建立新專案也很容易，只要使用指令 &lt;b&gt;&lt;span style="color: #274e13;"&gt;express&lt;/span&gt;&lt;/b&gt; 並指定目錄位置，&lt;a href="http://expressjs.com/" target="_blank"&gt;express&lt;/a&gt; 會自動產生一個基本的網站結構（以下的目錄可以自由命名更改）。第二行指令則是安裝相依檔案：&lt;br&gt;
&lt;pre style="-webkit-box-shadow: rgba(0, 0, 0, 0.589844) 1px 2px 2px; background-attachment: initial; background-clip: initial; background-color: rgba(0, 0, 0, 0.496094); background-image: initial; background-origin: initial; border-bottom-color: rgb(50, 50, 50); border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(50, 50, 50); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(50, 50, 50); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(50, 50, 50); border-top-left-radius: 5px; border-top-right-radius: 5px; border-top-style: solid; border-top-width: 1px; font-size: 14px; line-height: 21px; margin-bottom: 20px; margin-left: 10px; margin-right: 10px; margin-top: 20px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 25px; padding-left: 20px; padding-right: 20px; padding-top: 25px;"&gt;&lt;code style="font-family: &amp;#39;Helvetica Neue&amp;#39;, &amp;#39;Lucida Grande&amp;#39;, Arial; outline-color: initial; outline-style: none; outline-width: initial;"&gt;$ express /tmp/foo &amp;amp;&amp;amp; cd /tmp/foo&lt;/code&gt;&lt;/pre&gt;
&lt;pre style="-webkit-box-shadow: rgba(0, 0, 0, 0.589844) 1px 2px 2px; background-attachment: initial; background-clip: initial; background-color: rgba(0, 0, 0, 0.496094); background-image: initial; background-origin: initial; border-bottom-color: rgb(50, 50, 50); border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(50, 50, 50); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(50, 50, 50); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(50, 50, 50); border-top-left-radius: 5px; border-top-right-radius: 5px; border-top-style: solid; border-top-width: 1px; margin-bottom: 20px; margin-left: 10px; margin-right: 10px; margin-top: 20px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 25px; padding-left: 20px; padding-right: 20px; padding-top: 25px;"&gt;&lt;code style="font-size: 14px; line-height: 21px; outline-color: initial; outline-style: none; outline-width: initial;"&gt;&lt;span style="font-family: &amp;#39;Helvetica Neue&amp;#39;, &amp;#39;Lucida Grande&amp;#39;, Arial;"&gt;$ npm install -d&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;

























執行 express 新專案&lt;/h3&gt;
回到剛剛建立的新專案目錄 /tmp/foo，在裡面有一個命名為 &lt;span style="color: blue;"&gt;app.js&lt;/span&gt; 自動產生出來的檔案，這是 &lt;a href="http://expressjs.com/" target="_blank"&gt;express&lt;/a&gt; 專案的起點。我們先讓網站跑起來，待會兒再回頭研究它裡頭的細節。與其他 Node.js 執行的命令相同，使用 &lt;b&gt;&lt;span style="color: #274e13;"&gt;node&lt;/span&gt;&lt;/b&gt; 指令執行檔案 &lt;span style="color: blue;"&gt;app.js&lt;/span&gt;：&lt;br&gt;
&lt;pre style="-webkit-box-shadow: rgba(0, 0, 0, 0.59375) 1px 2px 2px; background-attachment: initial; background-clip: initial; background-color: rgba(0, 0, 0, 0.496094); background-image: initial; background-origin: initial; border-bottom-color: rgb(50, 50, 50); border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-bottom-style: solid; border-bottom-width: 1px; border-image: initial; border-left-color: rgb(50, 50, 50); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(50, 50, 50); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(50, 50, 50); border-top-left-radius: 5px; border-top-right-radius: 5px; border-top-style: solid; border-top-width: 1px; font-size: 14px; line-height: 21px; margin-bottom: 20px; margin-left: 10px; margin-right: 10px; margin-top: 20px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 25px; padding-left: 20px; padding-right: 20px; padding-top: 25px;"&gt;&lt;code style="font-family: &amp;#39;Helvetica Neue&amp;#39;, &amp;#39;Lucida Grande&amp;#39;, Arial; outline-color: initial; outline-style: none; outline-width: initial;"&gt;$ node app.js&lt;/code&gt;&lt;/pre&gt;
接著使用瀏覽器開啟 &lt;a href="http://127.0.0.1:3000/"&gt;http://127.0.0.1:3000&lt;/a&gt; ，如果一切正常的話，可以在瀏覽器裡看到新專案的長相（附註：3000 是 express 預設的 port）。為了一探 express 究竟產生了哪些內容，我們使用瀏覽器內建的開發者工具檢查 HTML 原始碼，並一步步找出 express 中對應的程式碼。&lt;br&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-2XA28U9eHew/T09ZwcDkmJI/AAAAAAAAAHM/LuwHAdld0gA/s1600/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.07.07.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="449" src="http://2.bp.blogspot.com/-2XA28U9eHew/T09ZwcDkmJI/AAAAAAAAAHM/LuwHAdld0gA/s640/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.07.07.png" width="640"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;h3&gt;














express 的運作方式&lt;/h3&gt;
截至目前為止，我們雖然讓 express 新專案成功地跑了起來，但卻不知其所以然。現在就讓我們來看看剛剛的過程中 express 究竟做了哪些事。回到專案目錄後（本例為 &lt;span style="color: #274e13;"&gt;&lt;b&gt;/tmp/foo&lt;/b&gt;&lt;/span&gt;）列出第一層檔案：&lt;br&gt;
&lt;br&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-7Z7yl5Tsb3I/T09Zw4GKKrI/AAAAAAAAAHQ/cD88W4gE6hE/s1600/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.08.24.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/-7Z7yl5Tsb3I/T09Zw4GKKrI/AAAAAAAAAHQ/cD88W4gE6hE/s640/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.08.24.png" width="640"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
使用文字編輯器打開剛剛執行的檔案 &lt;span style="color: blue;"&gt;app.js&lt;/span&gt;。&lt;span style="color: blue;"&gt;app.js&lt;/span&gt; 大致上可以拆成三個部分，首先是&lt;b&gt;載入相依的模組&lt;/b&gt;，並建立 server：&lt;br&gt;
&lt;br&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-FxTisuUUxOM/T09ZxoeetRI/AAAAAAAAAHc/MWjCvlDTkmg/s1600/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.09.52.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="218" src="http://2.bp.blogspot.com/-FxTisuUUxOM/T09ZxoeetRI/AAAAAAAAAHc/MWjCvlDTkmg/s640/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.09.52.png" width="640"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;span style="color: blue;"&gt;app.js&lt;/span&gt; 第二個部分為&lt;b&gt;設定檔&lt;/b&gt;，詳細的設定語法與參數可以&lt;a href="http://expressjs.com/guide.html#configuration" target="_blank"&gt;參考官方文件&lt;/a&gt;。身為初學者，我們先將目光停留在兩個重點：1) Template  檔案放在&lt;b&gt; &lt;span style="color: #274e13;"&gt;/views&lt;/span&gt;&lt;/b&gt; 目錄下，待會兒我們就要繼續追查這個目錄；2)  express 預設使用的 view engine 是一個名為 &lt;a href="http://jade-lang.com/" target="_blank"&gt;jade&lt;/a&gt; 的樣板引擎，如果不習慣 &lt;a href="http://jade-lang.com/" target="_blank"&gt;jade&lt;/a&gt; 的特殊語法，別忘了這是個&amp;quot;設定檔&amp;quot;，表示我們也可以將它改成使用其他樣板引擎。&lt;br&gt;
&lt;br&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-72xynqLZfCU/T09Zy_vqG9I/AAAAAAAAAHk/hZwQwgHdjQM/s1600/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.10.14.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="368" src="http://3.bp.blogspot.com/-72xynqLZfCU/T09Zy_vqG9I/AAAAAAAAAHk/hZwQwgHdjQM/s640/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.10.14.png" width="640"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;span style="color: blue;"&gt;app.js&lt;/span&gt; 最後一個部分是 &lt;b&gt;Routes&lt;/b&gt;，我們可以設定各種網址的 entry 並將它指定到不同的檔案。範例網站只有一頁，因此這裡就只看得到一個規則，將根目錄指到 &lt;span style="color: #274e13;"&gt;views&lt;/span&gt; 目錄下的 &lt;span style="color: #274e13;"&gt;index&lt;/span&gt; 檔案。&lt;br&gt;
&lt;br&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-L4ys1-8R46o/T09Z1pTveII/AAAAAAAAAHs/YuucjeQh-4k/s1600/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.10.22.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="86" src="http://2.bp.blogspot.com/-L4ys1-8R46o/T09Z1pTveII/AAAAAAAAAHs/YuucjeQh-4k/s640/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.10.22.png" width="640"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href="http://clayliao.blogspot.com/2012/03/express-framework-on-nodejs.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-7084138834953883943?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qPd4oPEmpNeA8ionBfH6Q8813bU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qPd4oPEmpNeA8ionBfH6Q8813bU/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/qPd4oPEmpNeA8ionBfH6Q8813bU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qPd4oPEmpNeA8ionBfH6Q8813bU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/_57zEexsx-k" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/_57zEexsx-k/express-framework-on-nodejs.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-2XA28U9eHew/T09ZwcDkmJI/AAAAAAAAAHM/LuwHAdld0gA/s72-c/Screen+shot+2012-03-01+at+%E4%B8%8B%E5%8D%887.07.07.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2012/03/express-framework-on-nodejs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-7424374078333043723</guid><pubDate>Sun, 14 Aug 2011 06:38:00 +0000</pubDate><atom:updated>2011-08-14T14:38:50.544+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">nodejs</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] Nodejs 學習筆記 (3) -- 操作 DOM 物件</title><description>續前文：&lt;br /&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://clayliao.blogspot.com/2011/08/build-nodejs-environment.html"&gt;[教學] Nodejs 學習筆記 (1) -- 建立開發環境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clayliao.blogspot.com/2011/08/using-npm-manage-nodejs-pkg.html"&gt;[教學] Nodejs 學習筆記 (2) -- 使用 npm 管理套件&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h3&gt;











在伺服器端操作 DOM 物件&lt;/h3&gt;
&lt;div&gt;
對於有過前端開發經驗的開發者來說，在瀏覽器裡使用 JavaScript 操作 DOM 物件是非常習慣也容易理解的，但是在 Node.js 的世界中，所有 JavaScript 操作都要轉移到伺服器端執行，DOM 物件的操作也包含在內。可是，究竟如何在沒有瀏覽器的幫忙下操作 DOM 物件呢？&lt;/div&gt;
&lt;h4&gt;











在 Node.js 中使用 YUI 3 &lt;/h4&gt;
&lt;div&gt;
在前兩篇教學（&lt;a href="http://clayliao.blogspot.com/2011/08/build-nodejs-environment.html"&gt;1&lt;/a&gt;,&amp;nbsp;&lt;a href="http://clayliao.blogspot.com/2011/08/using-npm-manage-nodejs-pkg.html"&gt;2&lt;/a&gt;）中，我們已經安裝好了 Node.js 與 YUI 3 的開發環境，現在就直接開始撰寫程式碼。首先開啟新檔案（範例檔名為 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;example_dom.js&lt;/span&gt;&lt;/b&gt;），由於開發環境以經就緒，我們可以在 Node.js 中使用 &lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;require()&lt;/span&gt;&lt;/b&gt; 語法引用 &lt;b&gt;yui3&lt;/b&gt; 模組，並且使用眼熟的&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;YUI().use()&lt;/span&gt;&lt;/b&gt; 撰寫程式碼。熟悉 YUI 語法的開發者完全可以在 Node.js 上使用原本就很熟悉的技巧：&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;a href="http://2.bp.blogspot.com/-inu7ZXTg-PE/TkdVof8O2TI/AAAAAAAAAF4/XWO1J-vqU3c/s1600/nodejs_yui_dom_1.png" imageanchor="1"&gt;&lt;img border="0" height="337" src="http://2.bp.blogspot.com/-inu7ZXTg-PE/TkdVof8O2TI/AAAAAAAAAF4/XWO1J-vqU3c/s640/nodejs_yui_dom_1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
小技巧：使用 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Y.log()&lt;/span&gt;&lt;/b&gt; 可以很清楚地知道執行成果，方便除錯。&lt;/blockquote&gt;
&lt;h4&gt;



建立 DOM 物件&lt;/h4&gt;
&lt;div&gt;
在伺服器端沒有瀏覽器建立的 DOM 物件，我們只好自己建立：
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;code&gt;var document = Y.Browser.document;&lt;/code&gt;
&lt;br /&gt;
&lt;div&gt;
然後就可以使用諸如 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;createElement()&lt;/span&gt;&lt;/b&gt; 、&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;appendChild()&lt;/span&gt;&lt;/b&gt; 等語法操作 DOM 物件了！用起來的感覺跟以往沒什麼兩樣，真的是很快速方便上手啊！&lt;br /&gt;
以下的程式碼建立了一個新的 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/b&gt; 元素，並且添加一些文字內容，最後把它放回 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/b&gt; 裡面，這是很常見的 DOM 操作：&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;a href="http://2.bp.blogspot.com/-XxGrSfC3u4c/TkdVo-_G0GI/AAAAAAAAAF8/XdiSoNz-KZA/s1600/nodejs_yui_dom_2.png" imageanchor="1"&gt;&lt;img border="0" height="632" src="http://2.bp.blogspot.com/-XxGrSfC3u4c/TkdVo-_G0GI/AAAAAAAAAF8/XdiSoNz-KZA/s640/nodejs_yui_dom_2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
執行 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;example_dom.js&lt;/span&gt;&lt;/b&gt; 程式，確認&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Y.log()&lt;/span&gt;&lt;/b&gt;&amp;nbsp;印出來的執行結果符合預期：&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt; node example_dom.js&lt;/code&gt;
&lt;br /&gt;
&lt;div class="separator"&gt;
&lt;a href="http://2.bp.blogspot.com/-37ZtN429gLQ/TkdVpWKMZ-I/AAAAAAAAAGA/BNsLWj3IqSo/s1600/nodejs_yui_dom_3.png" imageanchor="1"&gt;&lt;img border="0" height="197" src="http://2.bp.blogspot.com/-37ZtN429gLQ/TkdVpWKMZ-I/AAAAAAAAAGA/BNsLWj3IqSo/s400/nodejs_yui_dom_3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;



輸出結果至瀏覽器&lt;/h3&gt;
&lt;div&gt;
現在我們已經能夠自在地操作 DOM 物件了，不過可能有人希望不只是在 log 裡看到結果，而是要能顯示在瀏覽器中，畢竟這才是一般我們在開發網站常見的作法。&lt;br /&gt;
在&lt;a href="http://clayliao.blogspot.com/2011/08/build-nodejs-environment.html"&gt;[教學] Nodejs 學習筆記 (1) -- 建立開發環境&lt;/a&gt;中示範了使用 Node.js 建立 http 伺服器的方法，只要把這兩個範例結合在一起，就能從瀏覽器裡看到結果囉：&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;a href="http://2.bp.blogspot.com/-aXrz99A3k44/TkdVuuHzzFI/AAAAAAAAAGE/N57KjeTsCrA/s1600/nodejs_yui_dom_4.png" imageanchor="1"&gt;&lt;img border="0" height="534" src="http://2.bp.blogspot.com/-aXrz99A3k44/TkdVuuHzzFI/AAAAAAAAAGE/N57KjeTsCrA/s640/nodejs_yui_dom_4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
使用瀏覽器連線至：&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;http://localhost:8124&lt;/span&gt;&lt;/b&gt;，出現了剛剛 Node.js 執行的結果。開啟開發者工具進一步確認回傳的內容與剛才在 log 裡看到的確實是一模一樣的：&lt;br /&gt;
&lt;div class="separator"&gt;
&lt;a href="http://2.bp.blogspot.com/-Q7GTrhOGODk/TkdVvEXaw8I/AAAAAAAAAGI/7MPfG_3PUzM/s1600/nodejs_yui_dom_5.png" imageanchor="1"&gt;&lt;img border="0" height="518" src="http://2.bp.blogspot.com/-Q7GTrhOGODk/TkdVvEXaw8I/AAAAAAAAAGI/7MPfG_3PUzM/s640/nodejs_yui_dom_5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-7424374078333043723?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pKEs5LRePnDBCR6LMp1qP0CZavU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pKEs5LRePnDBCR6LMp1qP0CZavU/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/pKEs5LRePnDBCR6LMp1qP0CZavU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pKEs5LRePnDBCR6LMp1qP0CZavU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/M3x7wc3GMpA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/M3x7wc3GMpA/dom-manipulation-on-nodejs.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-inu7ZXTg-PE/TkdVof8O2TI/AAAAAAAAAF4/XWO1J-vqU3c/s72-c/nodejs_yui_dom_1.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/08/dom-manipulation-on-nodejs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-2564702423001667937</guid><pubDate>Sun, 07 Aug 2011 06:23:00 +0000</pubDate><atom:updated>2011-08-14T14:41:52.844+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">nodejs</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] Nodejs 學習筆記 (2) -- 使用 npm 管理套件</title><description>續前文：&lt;a href="http://clayliao.blogspot.com/2011/08/build-nodejs-environment.html"&gt;[教學] Nodejs 學習筆記 (1) -- 建立開發環境&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Yg0rd7jY5PI/Tj4iu7xp-ZI/AAAAAAAAAF0/uYd1viJ0wMk/s1600/npm_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="81" src="http://1.bp.blogspot.com/-Yg0rd7jY5PI/Tj4iu7xp-ZI/AAAAAAAAAF0/uYd1viJ0wMk/s200/npm_logo.png" width="200"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href="http://npmjs.org/"&gt;npm&lt;/a&gt; (Node Package Manager) 是 Node.js 用來管理第三方套件的工具，目前 npm 上可以找到的套件總數約 1,000 個，許多方便的工具都已經有人寫好了，開發任何功能前不妨先找看看是否有現成的套件，避免重新打造輪子。&lt;br&gt;
&lt;h3&gt;
使用 npm 管理套件&lt;/h3&gt;
&lt;div&gt;
安裝 npm 需要自行編譯安裝，不過 npm 也提供了自動化的 script ，只要執行這段指令即可：&lt;/div&gt;
&lt;br&gt;
&lt;code&gt;curl http://npmjs.org/install.sh | sh&lt;/code&gt;&lt;br&gt;
遇到錯誤或是堅持自行編譯安裝的人，可以參考 Github 上的說明( &lt;a href="https://github.com/isaacs/npm"&gt;https://github.com/isaacs/npm&lt;/a&gt;)。&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;
Node.js + YUI 3&lt;/h3&gt;
&lt;div&gt;
把 YUI 3 移植到 Node.js 的工程是由 &lt;a href="https://github.com/davglass"&gt;Dav Glass&lt;/a&gt; 完成的，由原作者親自介紹這個專案再適合不過了：&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;object height="324" width="576"&gt;&lt;param name="movie" value="http://d.yimg.com/m/up/ypp/default/player.swf"&gt;

&lt;param name="flashVars" value="vid=23272201&amp;amp;"&gt;

&lt;param name="allowfullscreen" value="true"&gt;

&lt;param name="wmode" value="transparent"&gt;

&lt;embed width="576" height="324" allowfullscreen="true" src="http://d.yimg.com/m/up/ypp/default/player.swf" type="application/x-shockwave-flash" flashvars="vid=23272201&amp;amp;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;
安裝相依套件&lt;/h4&gt;
&lt;div&gt;
在安裝 &lt;a href="https://github.com/davglass/nodejs-yui3"&gt;nodejs-yui3&lt;/a&gt; 前，必須先安裝以下兩個套件：&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;code&gt;npm install jsdom&lt;/code&gt;&lt;br&gt;
&lt;code&gt;npm install htmlparser&lt;/code&gt;&lt;br&gt;
&lt;h4&gt;
安裝 YUI 3&lt;/h4&gt;
&lt;div&gt;
一切準備就緒後，就可以安裝 nodejs 版的 YUI 3，這個步驟需要一點時間，enter/return 按下去後可以先去上個廁所：&lt;br&gt;
&lt;br&gt;&lt;/div&gt;
&lt;code&gt;npm install yui3&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
出現成功訊息後，我們就可以在 Node.js 上使用大多數的 YUI 3 語法囉！也就是說，以往使用 YUI 3 的經驗與技巧都可以延續到伺服器端的開發。到這裡 Node.js + YUI 3 的環境已經準備就緒，下一篇我們來試著使用 Node.js 與 YUI 3 在伺服器端操作 DOM 物件。&lt;br&gt;
&lt;br&gt;
續：&lt;a href="http://clayliao.blogspot.com/2011/08/dom-manipulation-on-nodejs.html"&gt;[教學] Nodejs 學習筆記 (3) -- 操作 DOM 物件&lt;/a&gt;&lt;br&gt;
&lt;a href="http://clayliao.blogspot.com/2011/08/using-npm-manage-nodejs-pkg.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-2564702423001667937?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/L05uht1UaiNLo_q0nxlmdNZQr_M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L05uht1UaiNLo_q0nxlmdNZQr_M/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/L05uht1UaiNLo_q0nxlmdNZQr_M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L05uht1UaiNLo_q0nxlmdNZQr_M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/UYNFAWR8gDA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/UYNFAWR8gDA/using-npm-manage-nodejs-pkg.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Yg0rd7jY5PI/Tj4iu7xp-ZI/AAAAAAAAAF0/uYd1viJ0wMk/s72-c/npm_logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/08/using-npm-manage-nodejs-pkg.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-763834698305652295</guid><pubDate>Sat, 06 Aug 2011 07:14:00 +0000</pubDate><atom:updated>2011-09-22T15:02:11.353+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">nodejs</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] Nodejs 學習筆記 (1) -- 建立開發環境</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://nodejs.org/logos/nodejs-dark.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://nodejs.org/logos/nodejs-dark.png"&gt;&lt;/a&gt;&lt;/div&gt;
說起近期前端最紅的技術，除了 HTML5 之外就非 &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; 莫屬了。相較於 &lt;a href="http://developer.yahoo.com/yui/3/"&gt;YUI&lt;/a&gt; 或是 &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; 這類在瀏覽器執行的函式庫，&lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; 最大的特色就是可以在伺服器端執行 JavaScript，就像是 php/Java/Ruby/Python 一樣。也就是說，如果這項技術普及的話，前端工程師就可以單純地使用一種語言（JavaScript）完成前後端的 Web Application 開發。關於 Node.js 的介紹與想像可以&lt;a href="http://www.inside.com.tw/2011/03/13/new-tech-nodejs"&gt;參考 inside 的文章&lt;/a&gt;，這裡就不多加著墨了。我們直接開始實作 &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt;。&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;










建立開發環境&lt;/h3&gt;
&lt;div&gt;
&lt;h4&gt;










下載 Node.js&lt;/h4&gt;
&lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; 是開放原始碼的專案，所有的程式碼都可以在 &lt;a href="https://github.com/joyent/node"&gt;Github&lt;/a&gt; 上找到。開發者可以選擇最新版本或是較舊的穩定版本。實際測試發現，雖然兩種版本都可以成功安裝，不過最新版的 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;v0.5.3&lt;/span&gt;&lt;/b&gt; 使用 &lt;a href="http://npmjs.org/"&gt;npm&lt;/a&gt; （下一篇教學將會介紹） 安裝套件時出現錯誤。為了避免走冤枉路，建議安裝 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;v0.4.10&lt;/span&gt;&lt;/b&gt; 穩定版本：&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;a href="http://4.bp.blogspot.com/-ZzQ1RsPUw9c/Tjy1CMWkP_I/AAAAAAAAAFg/oDLwQWNqFLM/s1600/nodejs_download.png" imageanchor="1"&gt;&lt;img border="0" height="278" src="http://4.bp.blogspot.com/-ZzQ1RsPUw9c/Tjy1CMWkP_I/AAAAAAAAAFg/oDLwQWNqFLM/s400/nodejs_download.png" width="400"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Node.js 下載位址：&lt;a href="http://nodejs.org/#download"&gt;http://nodejs.org/#download&lt;/a&gt;&lt;br&gt;
&lt;h4&gt;










安裝 Node.js&lt;/h4&gt;
Node.js 在不同作業系統環境下各有不同的安裝方法，您可以選擇：&lt;br&gt;
1.) 自行編譯安裝（參考文件：&lt;a href="https://github.com/joyent/node/wiki/Installation"&gt;Building and Installing Node.js&lt;/a&gt;）或&lt;br&gt;
2.)  使用套件安裝（參考文件：&lt;a href="https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager"&gt;Installing Node.js via package manager&lt;/a&gt;）。&lt;br&gt;
&lt;br&gt;
如果是 Windows 使用者或是對 Linux 權限不熟悉的開發者，可以參考以下文章：&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://blog.miniasp.com/post/2011/02/03/Getting-Started-with-NodeJS-on-Windows-using-Cygwin.aspx"&gt;如何在 Windows 作業系統安裝 Node.js 執行環境 (Cygwin)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.lyhdev.com/2011/04/linuxnodejs.html"&gt;淺談Linux普通使用者權限安裝軟體，以node.js為例&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h3&gt;










簡單範例實作&lt;/h3&gt;
&lt;div&gt;
Step 1: 開啟檔案 example.js，並撰寫 &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; 程式碼如下範例：&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;a href="http://3.bp.blogspot.com/-OO3YGVYWHXk/TjzWJ1BKAHI/AAAAAAAAAFs/1i_pUrT88Go/s1600/example_nodejs.png" imageanchor="1"&gt;&lt;img border="0" height="376" src="http://3.bp.blogspot.com/-OO3YGVYWHXk/TjzWJ1BKAHI/AAAAAAAAAFs/1i_pUrT88Go/s640/example_nodejs.png" width="640"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Step 2: 存檔後，執行這段程式碼：&lt;br&gt;
&lt;br&gt;
&lt;code&gt;$ node example.js &lt;/code&gt;&lt;br&gt;
Step 3: 使用瀏覽器開啟 &lt;a href="http://127.0.0.1:8124/"&gt;http://127.0.0.1:8124&lt;/a&gt; ，如果看到 Server 回傳的內容 &amp;quot;&lt;b&gt;Hello Nodejs!&lt;/b&gt;&amp;quot; 的話，就表示我們的第一個 Node.js 範例成功了！其中 port number 8124 是可以自訂的，只要不跟伺服器裡的其它 port 衝突即可。&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;a href="http://2.bp.blogspot.com/-s4H6e6T6pkw/TjzVqI52bWI/AAAAAAAAAFk/vZQ-z7_Xrgs/s1600/hello_nodejs.png" imageanchor="1"&gt;&lt;img border="0" height="440" src="http://2.bp.blogspot.com/-s4H6e6T6pkw/TjzVqI52bWI/AAAAAAAAAFk/vZQ-z7_Xrgs/s640/hello_nodejs.png" width="640"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator"&gt;
現在我們已經踏出成功的第一步，成功地在伺服器端執行 JavaScript。如果想要進一步探究技術細節的話，可以參考&lt;a href="http://nodejs.org/docs/v0.4.10/api/"&gt;官方文件&lt;/a&gt;（&lt;a href="http://cnodejs.org/cman/"&gt;中文翻譯&lt;/a&gt;）。既然 JavaScript 重新回到了伺服器端，就有人想到，瀏覽器端的 JavaScript 有很多現成好用的函式庫與框架，如果這些框架也能在 &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; 上執行的話，開發網站豈不是事半功倍？&lt;/div&gt;
&lt;div class="separator"&gt;
是的，後續的教學文章我們就來一步步實作 &lt;a href="http://www.yuiblog.com/blog/2010/04/05/running-yui-3-server-side-with-node-js/"&gt;YUI 3 on Nodejs&lt;/a&gt;，在 &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; 上面使用 YUI 3 的各種功能。&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div class="separator"&gt;
續：&lt;a href="http://clayliao.blogspot.com/2011/08/using-npm-manage-nodejs-pkg.html"&gt;[教學] Nodejs 學習筆記 (2) -- 使用 npm 管理套件&lt;/a&gt;&lt;/div&gt;
&lt;a href="http://clayliao.blogspot.com/2011/08/build-nodejs-environment.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-763834698305652295?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1CiIHf3iS8_osic7L3ysU9mZRhE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1CiIHf3iS8_osic7L3ysU9mZRhE/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/1CiIHf3iS8_osic7L3ysU9mZRhE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1CiIHf3iS8_osic7L3ysU9mZRhE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/ctmkcSymRRg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/ctmkcSymRRg/build-nodejs-environment.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-ZzQ1RsPUw9c/Tjy1CMWkP_I/AAAAAAAAAFg/oDLwQWNqFLM/s72-c/nodejs_download.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/08/build-nodejs-environment.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-7506571461484238753</guid><pubDate>Mon, 18 Jul 2011 16:45:00 +0000</pubDate><atom:updated>2011-07-19T09:47:07.330+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">Tech Talk</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>前端測試 @ 杭州 D2 前端技術論壇</title><description>&lt;div class="separator"&gt;
由&lt;a href="http://www.taobao.com/"&gt;淘寶網&lt;/a&gt;舉辦，已經邁向第六屆的 &lt;a href="http://www.d2forum.org/"&gt;D2 前端技術論壇&lt;/a&gt;是大陸最具規模的網路前端技術研討會，地點在距離杭州西湖不遠的&lt;a href="http://www.zj-hotel.com.cn/"&gt;之江飯店&lt;/a&gt;。今年很榮幸有機會獲邀到 D2 論壇分享&lt;a href="http://www.slideshare.net/taobaoued/ss-8584252"&gt;前端自動化測試&lt;/a&gt;相關的主題，這也是我第一次與這麼多大陸優秀前端工程師們近距離互動，心理上是非常期待的。&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;/div&gt;
&lt;h3&gt;







聯合演講 -- 前端測試&lt;/h3&gt;
&lt;div class="separator"&gt;
&amp;quot;前端測試&amp;quot;的演講者一共有三位，除了我之外還有兩位阿里巴巴旗下的前端工程師。值得一題的是，阿里巴巴與旗下網站的員工都會取個武俠小說人物的名字當做自己的&amp;quot;花名&amp;quot;，這次合作的講者有&lt;a href="http://hangzhou.koubei.com/"&gt;口碑網&lt;/a&gt;的廖健（花名&lt;b&gt;正邪&lt;/b&gt;）與&lt;a href="http://www.taobao.com/"&gt;淘寶網&lt;/a&gt;的陳成（花名&lt;b&gt;云谦&lt;/b&gt;），兩位都是技術底蘊深厚的前端工程師。&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;a href="http://farm7.static.flickr.com/6121/5941388181_7b8c00a3a8_z.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://farm7.static.flickr.com/6121/5941388181_7b8c00a3a8_z.jpg" width="560"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;a href="http://farm7.static.flickr.com/6146/5941949526_654ae3582b_z.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://farm7.static.flickr.com/6146/5941949526_654ae3582b_z.jpg" width="560"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator"&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div class="separator"&gt;
我的演講題目是使用 YUI Test + Selenium + Hudson 打造自動化的 Continuous Integration 測試系統，有興趣的人可以參考以下投影片：&lt;/div&gt;
&lt;div id="__ss_8584252" style="width: 510px;"&gt;
&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/taobaoued/ss-8584252" target="_blank" title="【前端测试】打造自动化的持续集成测试系统"&gt;【前端测试】打造自动化的持续集成测试系统&lt;/a&gt;&lt;/strong&gt; &lt;iframe frameborder="0" height="426" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/8584252" width="510"&gt;&lt;/iframe&gt; &lt;br&gt;
&lt;div style="padding: 5px 0 12px;"&gt;
View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/taobaoued" target="_blank"&gt;taobao.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;a href="http://weibo.com/clayliao"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://clayliao.blogspot.com/2011/07/yuitest-in-d2forum.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-7506571461484238753?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UNxzfD_6dhvXeSfM4UTFDQqmrm8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UNxzfD_6dhvXeSfM4UTFDQqmrm8/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/UNxzfD_6dhvXeSfM4UTFDQqmrm8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UNxzfD_6dhvXeSfM4UTFDQqmrm8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/TqXZz-yC_iI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/TqXZz-yC_iI/yuitest-in-d2forum.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm7.static.flickr.com/6121/5941388181_7b8c00a3a8_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/07/yuitest-in-d2forum.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-8723859648857551421</guid><pubDate>Fri, 10 Jun 2011 12:54:00 +0000</pubDate><atom:updated>2011-06-13T10:54:49.597+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">Tech Talk</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>CSS 菜鳥救星 @ 德明財經科技大學</title><description>記得剛進公司不久時滿腔熱血地做了六堂的 &amp;nbsp;CSS 入門課程並開班授課，主要目的是為了 &lt;s&gt;幫 PM洗腦&lt;/s&gt; 灌輸非 Engineer 同事基本的技術概念。事後也證明了，這些課程讓 Team members 都可以用相同的術語溝通，減少了許多日後的溝通成本。&lt;br /&gt;
&lt;br /&gt;
以下投影片是本週與&lt;a href="http://www.takming.edu.tw/"&gt;德明財經科技大學&lt;/a&gt;資管系大一學生分享 CSS&amp;nbsp;撰寫經驗的內容，摘錄自上述入門課程，並整理成可閱讀的版本。希望能降低 CSS 新手的學習門檻！&lt;br /&gt;
&lt;div id="__ss_8261800" style="width: 510px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/clayliao/css101-for-beginner" title="CSS 菜鳥救星"&gt;CSS 菜鳥救星&lt;/a&gt;&lt;/strong&gt; &lt;iframe frameborder="0" height="426" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/8261800" width="510"&gt;&lt;/iframe&gt; &lt;br /&gt;
&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/clayliao"&gt;Ying-Hsiang Liao&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-8723859648857551421?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UO2ynVOHZnk-7IGXL18F4Gf525k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UO2ynVOHZnk-7IGXL18F4Gf525k/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/UO2ynVOHZnk-7IGXL18F4Gf525k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UO2ynVOHZnk-7IGXL18F4Gf525k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/GfztVopIsDs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/GfztVopIsDs/css-101-tutorial.html</link><author>noreply@blogger.com (clay liao)</author><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/06/css-101-tutorial.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-6927741570353716576</guid><pubDate>Tue, 07 Jun 2011 15:09:00 +0000</pubDate><atom:updated>2011-06-07T23:10:24.619+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><category domain="http://www.blogger.com/atom/ns#">實用工具</category><title>[教學] 前端自動化測試 (下) -- YUI Test + Selenium + Hudson</title><description>&lt;div class="separator"&gt;續上文 &lt;a href="http://clayliao.blogspot.com/2011/06/how-to-use-yui-test-and-selenium-for.html"&gt;[教學] 前端自動化測試 (上) -- YUI Test + Selenium&lt;/a&gt;，我們已經學會使用 YUI Test + Selenium 做測試。不過這個流程還需要人力手動開啟測試網頁看結果，通常一個中上規模的系統不僅包含數百甚至數千個 Test Case，而且還得重複在不同的瀏覽器/作業系統組合中重複測試... 像這種乏味且重複的事情，不如交給機器來做來得可靠！接下來我們將使用 Hudson 完成 &lt;a href="http://josephj.com/entry.php?id=251"&gt;Continuous Integration&lt;/a&gt; 系統的最後一塊拼圖。&lt;/div&gt;&lt;h3&gt;安裝 Hudson&lt;/h3&gt;&lt;div class="separator"&gt;&lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt; 提供 Native Package 與 hudson.war &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Installing+Hudson"&gt;兩種安裝方式&lt;/a&gt;，這裡採用後者。首先確定您的建置環境安裝了 &lt;a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html"&gt;JDK&lt;/a&gt; 與 &lt;a href="http://tomcat.apache.org/download-70.cgi"&gt;Tomcat&lt;/a&gt; (或其他 Java Server 軟體)。下載 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;hudson.war&lt;/span&gt;&lt;/b&gt; 後，將它放在 Tomcat 所在的 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;webapps&lt;/span&gt;&lt;/b&gt; 目錄下，啟動 Tomcat 即可完成安裝：&lt;/div&gt;&lt;code&gt;./{Tomcat 目錄}/bin/startup.sh&lt;/code&gt;&lt;br&gt;
&lt;div class="separator"&gt;開啟瀏覽器，連線至 &lt;a href="http://localhost:8080/hudson"&gt;http://localhost:8080/hudson&lt;/a&gt;，看到以下畫面表示 Hudson 安裝成功：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://2.bp.blogspot.com/-JOsq8rnkjXc/Te4uu5pXLwI/AAAAAAAAAEk/6yS5M5HYo80/s1600/testing_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-JOsq8rnkjXc/Te4uu5pXLwI/AAAAAAAAAEk/6yS5M5HYo80/s640/testing_01.png" width="600"&gt;&lt;/a&gt;&lt;/div&gt;&lt;h3&gt;Create New Jobs&lt;/h3&gt;&lt;div&gt;首先自由命名一個新專案：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://4.bp.blogspot.com/-AQzTdmgWoSc/Te4uwU_9T1I/AAAAAAAAAEs/mWCXuf_D4Lg/s1600/testing_03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-AQzTdmgWoSc/Te4uwU_9T1I/AAAAAAAAAEs/mWCXuf_D4Lg/s640/testing_03.png" width="600"&gt;&lt;/a&gt;&lt;/div&gt;&lt;h3&gt;安裝 Hudson Seleniumhq Plugin&lt;/h3&gt;&lt;div class="separator"&gt;Hudson 有現成的外掛整合 Selenium（關於 Selenium 與 YUI Test &lt;a href="http://clayliao.blogspot.com/2011/06/how-to-use-yui-test-and-selenium-for.html"&gt;詳見前文&lt;/a&gt;），在管理介面找到 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;[管理 Hudson]&lt;/span&gt;&lt;/b&gt; --&amp;gt; &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;[管理插件]&lt;/span&gt;&lt;/b&gt; --&amp;gt; 安裝 &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Seleniumhq+Plugin"&gt;Hudson Seleniumhq plugin&lt;/a&gt;。安裝成功後，&lt;span class="Apple-style-span" style="color: red;"&gt;重新啟動 Tomcat 以載入新的設定&lt;/span&gt;。接下來依照&lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Seleniumhq+Plugin"&gt;官方教學步驟&lt;/a&gt;完成 Seleniumhq Plugin 設定。&lt;/div&gt;&lt;div class="separator"&gt;特別注意的是，該文件是以 Windows 系統為範例，若在 OSX/Linux/Unix 環境下，則需選擇 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Build&lt;/span&gt;&lt;/b&gt; --&amp;gt; &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Execute Shell&lt;/span&gt;&lt;/b&gt; ，範例指令如下： &lt;/div&gt;&lt;code&gt;java -jar ~/Library/yuitest/java/build/yuitest-selenium-driver.jar http://127.0.0.1/examples/basic-usage-example.htm --resultsdir .&lt;/code&gt;&lt;br&gt;
&lt;div class="separator"&gt;&lt;a href="http://4.bp.blogspot.com/-FH__7vYc2dI/Te4uvoVKkVI/AAAAAAAAAEo/zrcFN4ptqvY/s1600/testing_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-FH__7vYc2dI/Te4uvoVKkVI/AAAAAAAAAEo/zrcFN4ptqvY/s640/testing_02.png" width="600"&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-FH__7vYc2dI/Te4uvoVKkVI/AAAAAAAAAEo/zrcFN4ptqvY/s1600/testing_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://4.bp.blogspot.com/-FH__7vYc2dI/Te4uvoVKkVI/AAAAAAAAAEo/zrcFN4ptqvY/s1600/testing_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://clayliao.blogspot.com/2011/06/auto-testing-by-yuitest-selenium-hudson.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-6927741570353716576?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/h5zxtffvXLeguU09mVGmIUk6Pjo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h5zxtffvXLeguU09mVGmIUk6Pjo/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/h5zxtffvXLeguU09mVGmIUk6Pjo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h5zxtffvXLeguU09mVGmIUk6Pjo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/yJi0Ypc0HzM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/yJi0Ypc0HzM/auto-testing-by-yuitest-selenium-hudson.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-JOsq8rnkjXc/Te4uu5pXLwI/AAAAAAAAAEk/6yS5M5HYo80/s72-c/testing_01.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/06/auto-testing-by-yuitest-selenium-hudson.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-9206742876933543567</guid><pubDate>Sun, 05 Jun 2011 04:08:00 +0000</pubDate><atom:updated>2011-06-09T21:37:33.256+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><category domain="http://www.blogger.com/atom/ns#">實用工具</category><title>[教學] 前端自動化測試 (上) -- YUI Test + Selenium</title><description>&lt;h3&gt;Why YUITest&lt;/h3&gt;&lt;div class="separator"&gt;在 Web 前端測試中，常見的 JavaScript Unit Test 工具有 &lt;a href="http://www.jsunit.net/"&gt;JSUnit&lt;/a&gt;、 &lt;a href="http://docs.jquery.com/Qunit"&gt;QUnit&lt;/a&gt; 等，本文介紹的不只是 Unit Test ，而是&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;自動化的 Unit Test&lt;/span&gt;&lt;/b&gt;！整個流程使用到的工具包含 &lt;a href="http://www.yuiblog.com/blog/2010/11/09/introducing-the-new-yui-test/"&gt;YUITest&lt;/a&gt; 與 &lt;a href="http://seleniumhq.org/docs/05_selenium_rc.html"&gt;Selenium RC&lt;/a&gt;。有別於其他 JavaScript 測試工具，&lt;a href="http://www.yuiblog.com/blog/2010/11/09/introducing-the-new-yui-test/"&gt;YUITest&lt;/a&gt; 具有以下特色：&lt;/div&gt;&lt;ol&gt;&lt;li&gt;模擬真實瀏覽器環境下的 DOM Event 行為。&lt;/li&gt;
&lt;li&gt;支援非同步 (Asynchronous) 與 Ajax 測試。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bullseye.com/coverage.html"&gt;Code Coverage 分析&lt;/a&gt;，確保所有程式邏輯都包含在測試中。&lt;/li&gt;
&lt;li&gt;獨立運作，可搭配使用其他 JavaScript Library (e.g. &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;, &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt;, &lt;a href="http://www.sencha.com/"&gt;Ext JS&lt;/a&gt;... ) 使用。&lt;/li&gt;
&lt;li&gt;整合 &lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt; 以及 Selenium 成為完整的 &lt;a href="http://josephj.com/entry.php?id=251"&gt;Continuous Integration, CI&lt;/a&gt;  系統。&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;準備測試網頁&lt;/h3&gt;&lt;div class="separator"&gt;以下的 YUITest 測試網頁原始碼可以在&lt;a href="https://github.com/nzakas/yuitest/tree/master/examples"&gt;這裡&lt;/a&gt;下載。如果使用瀏覽器開啟的話，會看到 YUITest 的測試結果。可是手動開啟網頁測試實在太沒效率，因此我們使用 Selenium 自動化測試產生報表，如此一來就能將珍貴的時間放在更有價值的開發上！&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://4.bp.blogspot.com/-wZ2GWHJjBAc/TepdKW_0JhI/AAAAAAAAAEg/JzI8XP1XUNs/s1600/YUITest+demo+3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="476" src="http://4.bp.blogspot.com/-wZ2GWHJjBAc/TepdKW_0JhI/AAAAAAAAAEg/JzI8XP1XUNs/s640/YUITest+demo+3.png" width="600"&gt;&lt;/a&gt;&lt;/div&gt;&lt;h3&gt;安裝並啟動 Selenium RC&lt;/h3&gt;&lt;div class="separator"&gt;&lt;a href="http://seleniumhq.org/download/"&gt;下載 Selenium RC&lt;/a&gt; 後，到所在的目錄（任意目錄皆可），執行以下 Command 啟動 Selenium RC Server：&lt;/div&gt;&lt;div class="separator"&gt;&lt;code&gt;java -jar selenium-server-standalone.jar&lt;/code&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://2.bp.blogspot.com/-Pg5V3o9JF9A/TepcBc-UUPI/AAAAAAAAAEE/kXTg5RimI6U/s1600/run%2Bselenuim-server.png" imageanchor="1"&gt;&lt;img border="0" height="352" src="http://2.bp.blogspot.com/-Pg5V3o9JF9A/TepcBc-UUPI/AAAAAAAAAEE/kXTg5RimI6U/s640/run%2Bselenuim-server.png" width="600"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;/div&gt;&lt;h3&gt;執行 YUITest 測試&lt;/h3&gt;&lt;div class="separator"&gt;確認 Selenium RC Server 啟動後，接著執行 YUITest ，測試標的是剛才準備好的測試網頁：&lt;/div&gt;&lt;div class="separator"&gt;&lt;code&gt;java -jar yuitest-selenium-driver.jar --resultsdir ~/results http://127.0.0.1/examples/basic-usage-example.htm&lt;/code&gt;&lt;/div&gt;&lt;blockquote&gt;附註：YUITest Selenium Driver 需要 Java Client Driver，&lt;a href="http://seleniumhq.org/download/"&gt;下載&lt;/a&gt;後放到 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;{JRE}/lib/ext&lt;/span&gt;&lt;/b&gt; 下或是用其他的方法引用該 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;selenium-java-{version}.jar&lt;/span&gt;&lt;/b&gt; 檔。(e.g. Mac 預設的 Java 目錄為&lt;span class="Apple-style-span" style="color: #274e13;"&gt; &lt;b&gt;/Library/Java/Home&lt;/b&gt;&lt;/span&gt; )&lt;/blockquote&gt;&lt;div class="separator"&gt;測試結果告訴我們，YUITest 一共執行了七個測試，其中一個失敗了。詳細的報表在指定的目錄（本例為 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;~/results&lt;/span&gt;&lt;/b&gt; ）下可以找到。接下來只要針對這個錯誤 Debug 即可，不必等待 QA 回報 Bug ，也不需要如大海撈針般尋找問題根源，大幅縮減開發時間！（Engineer 心中 OS: 終於可以準時下班了 T_T）&lt;/div&gt;&lt;a href="http://clayliao.blogspot.com/2011/06/how-to-use-yui-test-and-selenium-for.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-9206742876933543567?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JaeLjOA9dEPliuRfK2UVFY_DMbI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JaeLjOA9dEPliuRfK2UVFY_DMbI/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/JaeLjOA9dEPliuRfK2UVFY_DMbI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JaeLjOA9dEPliuRfK2UVFY_DMbI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/cth9J4qnJL8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/cth9J4qnJL8/how-to-use-yui-test-and-selenium-for.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-wZ2GWHJjBAc/TepdKW_0JhI/AAAAAAAAAEg/JzI8XP1XUNs/s72-c/YUITest+demo+3.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/06/how-to-use-yui-test-and-selenium-for.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-8798872854109145505</guid><pubDate>Sat, 28 May 2011 03:50:00 +0000</pubDate><atom:updated>2011-05-30T23:38:49.032+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Mobile Web</category><category domain="http://www.blogger.com/atom/ns#">Tech Talk</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><category domain="http://www.blogger.com/atom/ns#">Yahoo</category><title>第一次 Mobile Web 就上手 @ 海大資工</title><description>繼去年(2010)在&lt;a href="http://clayliao.blogspot.com/2010/05/yui.html"&gt;海洋大學資工系介紹 YUI &lt;/a&gt;後，很榮幸地，今年再度獲邀講手機上的網路應用。由於 Mobile Web/App 並不是工作上的專業，於是利用自己的閒暇時間整理相關資料，並實際動手做了幾個展示用的 Mobile Web 網站與 iPhone/Android App。&lt;br /&gt;
&lt;br /&gt;
這門課的聽眾大多是大二的同學，且擁有智慧型手機的人數估計低於一半。所以內容設計上儘量避免程式碼，以實例 Demo 為主。&lt;br /&gt;
&lt;div id="__ss_8110736" style="width: 510px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/clayliao/mobile-app-8110736" title="第一次 Mobile App 就上手"&gt;第一次 Mobile App 就上手&lt;/a&gt;&lt;/strong&gt; &lt;iframe frameborder="0" height="426" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/8110736" width="510"&gt;&lt;/iframe&gt; &lt;br /&gt;
&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/clayliao"&gt;Ying-Hsiang Liao&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;更多相關文章:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://clayliao.blogspot.com/2010/05/yui.html"&gt;YUI 演講 @ 海大資工&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-8798872854109145505?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GB9amWFvuLZEtk4jm49JrEu2h84/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GB9amWFvuLZEtk4jm49JrEu2h84/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/GB9amWFvuLZEtk4jm49JrEu2h84/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GB9amWFvuLZEtk4jm49JrEu2h84/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/U-N_QcKJaKQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/U-N_QcKJaKQ/my-first-mobile-app-in-ntou.html</link><author>noreply@blogger.com (clay liao)</author><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/05/my-first-mobile-app-in-ntou.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-6819506106842907162</guid><pubDate>Sun, 15 May 2011 13:01:00 +0000</pubDate><atom:updated>2011-08-05T21:53:05.508+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Yahoo</category><title>參訪 Google 矽谷總部</title><description>&lt;div class="separator"&gt;Google 的總部就在距離 Yahoo! 十分鐘車程的 &lt;b&gt;Mountain View&lt;/b&gt;，身為一名 &lt;s&gt;觀光客&lt;/s&gt; 工程師，當然要到這個著名的景點參訪囉！不過遊客們可得注意，要進 Google 參觀得有內部的員工陪同，否則光是在建築物外拍照，都會有警衛出面制止的喔。&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5303/5604590747_a1c53cb6c1_z.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5303/5604590747_a1c53cb6c1_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;到達 Google 已經是午餐時間（這麼巧？），正好嚐嚐這裡有名的免費午餐。加州灣區的科技公司非常競爭，為了吸引好人才，員工福利的規格都異常地高。不過儘管如此，免費午餐還是很稀罕的，即便是 Apple 的員工餐廳也要付錢呢！&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5065/5604577955_a7e61cee31_z.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5065/5604577955_a7e61cee31_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5229/5604577277_a1f9f063c8_z.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img src="http://farm6.static.flickr.com/5229/5604577277_a1f9f063c8_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;Google Campus 佔地廣闊，如果要在各個建築物移動的話，可以使用免費的 G-bike（台語唸起來有點...）。吃飽喝足，每個人找到自己的 G-bike 後，接下來就要參觀 Google Campus 啦！&lt;/div&gt;&lt;div class="separator"&gt;Google 的辦公室非常有趣，很多角落都藏著驚喜。例如這台聽說是 NASA 送的飛行載具：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5024/5604584447_cee828cf72_z.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5024/5604584447_cee828cf72_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;然後這個是電影「博物館驚魂夜」裡的恐龍骨骼模型：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5105/5605171434_9e66bb0571_z.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5105/5605171434_9e66bb0571_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;原理跟跑步機一樣，傳說中的「無法前進的游泳池」：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5024/5605165218_10103d522f_z.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5024/5605165218_10103d522f_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;/div&gt;&lt;a href="http://clayliao.blogspot.com/2011/05/google-campus.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-6819506106842907162?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CuRQ61LYzJ8AkVyhWdhHSTQ0dOI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CuRQ61LYzJ8AkVyhWdhHSTQ0dOI/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/CuRQ61LYzJ8AkVyhWdhHSTQ0dOI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CuRQ61LYzJ8AkVyhWdhHSTQ0dOI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/h0GpOhtAdWw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/h0GpOhtAdWw/google-campus.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm6.static.flickr.com/5303/5604590747_a1c53cb6c1_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/05/google-campus.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-107314602949707502</guid><pubDate>Sat, 07 May 2011 02:25:00 +0000</pubDate><atom:updated>2011-05-15T20:18:21.776+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Yahoo</category><title>體驗工作 in Yahoo! 矽谷總部</title><description>&lt;div class="separator"&gt;續&lt;a href="http://clayliao.blogspot.com/2011/04/yahoo-f2e-summit-speaker-chinese.html"&gt;上篇&lt;/a&gt;， &lt;a href="http://div%20class%3D%22separator%22/"&gt;F2E Summit&lt;/a&gt; 結束後，我們一行人繼續留在 Yahoo! 工作將近兩週，除了與平常只能通過 E-mail 溝通的美國同事們博感情，也順便體驗在矽谷工作的感覺。&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;Yahoo! 在 Bay Area 共有兩個園區，兩者距離大約 15 分鐘車程，中間有接駁車固定往返兩地。這次 &lt;a href="http://clayliao.blogspot.com/2011/04/yahoo-f2e-summit-speaker-chinese.html"&gt;F2E Summit&lt;/a&gt; 的主要活動場地則是位於加州 Sunnyvale 的 Yahoo! Campus。 &lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;從舊金山開車，沿著矽谷著名的 101 高速公路往南約 40 分鐘，下交流道後沿著 Mathilda Avenue 直走，迎面而來的是醒目的 &lt;b&gt;Yahoo!&lt;/b&gt; 招牌：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5265/5610050064_d59c74f2d3_z.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5265/5610050064_d59c74f2d3_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;
&lt;div class="separator"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;Yahoo! Campus 一共有 7 棟建築，中央是一大片修剪整齊的草地，很有大學校園的感覺：&lt;/span&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5227/5610057214_9d707f5714_z.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5227/5610057214_9d707f5714_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;這裡就是今年 &lt;a href="http://clayliao.blogspot.com/2011/04/yahoo-f2e-summit-speaker-chinese.html"&gt;F2E Summit&lt;/a&gt; 的會場，裡面除了演講廳外，還有免費健身房與最大的員工餐廳 &lt;b&gt;URL&amp;#39;s&lt;/b&gt;：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5303/5610058068_171e8f0400_z.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5303/5610058068_171e8f0400_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;趁假日沒有人的時候拍下空曠的 &lt;b&gt;URL&amp;#39;s&lt;/b&gt; 餐廳，平常用餐時間這裡可是非常熱鬧的：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5310/5609474525_af14a22797_z.jpg" imageanchor="1"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5310/5609474525_af14a22797_z.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5265/5610076866_0a23ba0f17_z.jpg" imageanchor="1"&gt;&lt;br&gt;
&lt;/a&gt;&lt;a href="http://farm6.static.flickr.com/5265/5610076866_0a23ba0f17_z.jpg" imageanchor="1"&gt;&lt;img border="0" height="640" src="http://farm6.static.flickr.com/5265/5610076866_0a23ba0f17_z.jpg" width="476"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;戶外籃球場，中午有同事在樂活打籃球：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5270/5610087108_8706b268fb_z.jpg" imageanchor="1"&gt;&lt;img border="0" height="640" src="http://farm6.static.flickr.com/5270/5610087108_8706b268fb_z.jpg" width="476"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;除了籃球場與健身房外，這裡還有兩座&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;沙灘排球場&lt;/span&gt;&lt;/b&gt;！會不會過太爽啦！&lt;a href="http://farm6.static.flickr.com/5229/5610086344_453316061a_z.jpg" imageanchor="1"&gt;&lt;br&gt;
&lt;/a&gt;&lt;a href="http://farm6.static.flickr.com/5229/5610086344_453316061a_z.jpg" imageanchor="1"&gt;&lt;img border="0" height="640" src="http://farm6.static.flickr.com/5229/5610086344_453316061a_z.jpg" width="476"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;訪客入口處很醒目的紫牛：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5303/5609510607_950dbee86b_z.jpg" imageanchor="1"&gt;&lt;img border="0" height="478" src="http://farm6.static.flickr.com/5303/5609510607_950dbee86b_z.jpg" style="cursor: move;" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;碰巧在 &lt;b&gt;URL&amp;#39;s&lt;/b&gt; 遇到星巴克的 CEO Howard Schultz 來演講，現場除了提供免費星巴克咖啡與餐點吃到飽外，還大手筆地送了每人一本親筆簽名的新書 &lt;a href="http://www.amazon.com/Onward-Starbucks-Fought-without-Losing/dp/1605292885"&gt;Onward: How Starbucks Fought for Its Life without Losing Its Soul&lt;/a&gt; (中譯：&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010500936"&gt;勇往直前：我如何拯救星巴克&lt;/a&gt;)&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://farm6.static.flickr.com/5182/5612676879_304df01def.jpg" imageanchor="1"&gt;&lt;img border="0" height="500" src="http://farm6.static.flickr.com/5182/5612676879_304df01def.jpg" style="cursor: move;" width="374"&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://clayliao.blogspot.com/2011/05/yahoo-campus.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-107314602949707502?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/O4rwxqtiEvOMFZtk-mr2eYVlFoM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O4rwxqtiEvOMFZtk-mr2eYVlFoM/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/O4rwxqtiEvOMFZtk-mr2eYVlFoM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O4rwxqtiEvOMFZtk-mr2eYVlFoM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/1ADrFD610zg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/1ADrFD610zg/yahoo-campus.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm6.static.flickr.com/5265/5610050064_d59c74f2d3_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/05/yahoo-campus.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-2402789917474143156</guid><pubDate>Tue, 19 Apr 2011 13:58:00 +0000</pubDate><atom:updated>2011-06-13T21:07:25.455+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tech Talk</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><category domain="http://www.blogger.com/atom/ns#">Yahoo</category><title>Yahoo! F2E Summit - 中文手寫輸入法</title><description>&lt;div class="separator"&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://4.bp.blogspot.com/-ABYENC_BPRw/TaxHTbOK8NI/AAAAAAAAADc/hEiSP9gQT3s/s1600/5611464289_a02fd4aab1_b.jpg" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ABYENC_BPRw/TaxHTbOK8NI/AAAAAAAAADc/hEiSP9gQT3s/s640/5611464289_a02fd4aab1_b.jpg" width="550"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;&lt;b&gt;F2E Summit&lt;/b&gt; 是 Yahoo! 前端工程師的年度盛會之一（另一個則是 YUI Conference），今年很幸運地投稿獲得青睞，因此可以以講者的身分出差到美國 Yahoo! 總部&lt;s&gt; 旅遊 &lt;/s&gt;參加 F2E Summit。&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;F2E Summit 的 Session 大多是硬底子的技術研討，短短兩天內就可以快速了解各國工程師正在研究的新技術。今年的重點則是不意外的 &lt;b&gt;HTML5&lt;/b&gt;、&lt;b&gt;Web Performance&lt;/b&gt;、&lt;b&gt;Mobile web&lt;/b&gt; 以及 &lt;b&gt;nodejs&lt;/b&gt;。我的 Session 介紹的是雅虎奇摩去年 (2010) 中旬在台灣與香港同步推出的 Yahoo! 手寫輸入法，這個功能主要是提供給不善打字的輕度使用者使用，例如老年人、電腦初學者甚至輕微殘疾的人士等，讓網頁搜尋更加普及。&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://1.bp.blogspot.com/-bkIu-d0rLZE/TaxHSlbQVXI/AAAAAAAAADY/PcAFK_cS_Vs/s1600/5590860817_01c66f61f7_b.jpg" imageanchor="1"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-bkIu-d0rLZE/TaxHSlbQVXI/AAAAAAAAADY/PcAFK_cS_Vs/s640/5590860817_01c66f61f7_b.jpg" width="400"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;現場的外國同事對於中文輸入一竅不通，但對於象形文字『龜』還是有反應的 :)&lt;/div&gt;&lt;br&gt;
&lt;div class="separator"&gt;&lt;a href="http://4.bp.blogspot.com/-Ew3p0LF1QlY/TaxHUT8jKYI/AAAAAAAAADg/aUGD2ts4nOw/s1600/5611467725_e02cbf14a4_b.jpg" imageanchor="1"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Ew3p0LF1QlY/TaxHUT8jKYI/AAAAAAAAADg/aUGD2ts4nOw/s640/5611467725_e02cbf14a4_b.jpg" width="550"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;活動結束後，同行的台北雅虎同事與 F2E Summit 的主辦人 &lt;a href="http://www.nczonline.net/blog/about/"&gt;Nicholas C. Zakas&lt;/a&gt; 合照：&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://3.bp.blogspot.com/-laeYjnLoG-0/Ta2MfSwsMEI/AAAAAAAAADs/Q3mogNH7fpU/s1600/5573559578_955c6f080c_o.jpg" imageanchor="1"&gt;&lt;img border="0" height="428" src="http://3.bp.blogspot.com/-laeYjnLoG-0/Ta2MfSwsMEI/AAAAAAAAADs/Q3mogNH7fpU/s640/5573559578_955c6f080c_o.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;以下是刪去了敏感資訊的公開版本投影片，：&lt;/div&gt;&lt;div id="__ss_8156612" style="width: 510px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/clayliao/chinese-handwriting-in-yahoo-f2e-summit-2011" title="Chinese Handwriting in Yahoo! F2E Summit 2011"&gt;Chinese Handwriting in Yahoo! F2E Summit 2011&lt;/a&gt;&lt;/strong&gt; &lt;iframe frameborder="0" height="426" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/8156612" width="510"&gt;&lt;/iframe&gt; &lt;br&gt;
&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/clayliao"&gt;Ying-Hsiang Liao&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;a href="http://clayliao.blogspot.com/2011/04/yahoo-f2e-summit-speaker-chinese.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-2402789917474143156?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ohfx7on79DqyROVd31Rk5YHevEg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ohfx7on79DqyROVd31Rk5YHevEg/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/ohfx7on79DqyROVd31Rk5YHevEg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ohfx7on79DqyROVd31Rk5YHevEg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/VM7DZ18JpDc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/VM7DZ18JpDc/yahoo-f2e-summit-speaker-chinese.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-ABYENC_BPRw/TaxHTbOK8NI/AAAAAAAAADc/hEiSP9gQT3s/s72-c/5611464289_a02fd4aab1_b.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/04/yahoo-f2e-summit-speaker-chinese.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-8408479911774389797</guid><pubDate>Fri, 25 Mar 2011 02:47:00 +0000</pubDate><atom:updated>2011-06-07T20:25:14.567+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">作品集</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><category domain="http://www.blogger.com/atom/ns#">Yahoo</category><title>快速上手 Opera Widget - Twitter Instant Search</title><description>&lt;div class="separator"&gt;&lt;a href="https://lh4.googleusercontent.com/-azx3CfvlFrk/TYv_hpfSkJI/AAAAAAAAADU/0RYMXd1MEQY/s1600/5552908426_0f7a5f2175_b.jpg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="427" src="https://lh4.googleusercontent.com/-azx3CfvlFrk/TYv_hpfSkJI/AAAAAAAAADU/0RYMXd1MEQY/s640/5552908426_0f7a5f2175_b.jpg" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="http://www.flickr.com/photos/adamp3/5552908426/"&gt;圖片來源&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator"&gt;幾天前 &lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt; 的 &lt;a href="http://www.techbang.com.tw/users/opera"&gt;Zi-Bin&lt;/a&gt; 等人應邀前來公司演講，一個下午的 Session 裡介紹了 HTML5、&lt;a href="http://widgets.opera.com/"&gt;Opera Widgets&lt;/a&gt; 以及 &lt;a href="http://mobilestore.opera.com/tw,en,usd/mobiledevice.html"&gt;Opera App Store&lt;/a&gt;。&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;在現場聽演講的同時，我也順手寫了一個簡單的 Widget，測試 &lt;a href="http://widgets.opera.com/"&gt;Opera Widget&lt;/a&gt; 是否能&lt;b&gt;跨網域存取 &lt;span class="Apple-style-span" style="color: #274e13;"&gt;Json&lt;/span&gt; 資料&lt;/b&gt;。結論是為了安全考量，&lt;a href="http://widgets.opera.com/"&gt;Opera Widget&lt;/a&gt; 預設是不開放跨網域存取資料的。如果開發者有需要的話，必須手動在 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;config.xml&lt;/span&gt;&lt;/b&gt; 中加上屬性 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;network=&amp;quot;public&amp;quot;&lt;/span&gt;&lt;/b&gt;。&lt;/div&gt;&lt;div class="separator" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br&gt;
&lt;/div&gt;&lt;div class="separator" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;回家後花點時間把這個小工具穿上 CSS 外衣，完成了第一個 &lt;a href="http://widgets.opera.com/"&gt;Opera Widget&lt;/a&gt;： &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Twitter Instant Search&lt;/span&gt;&lt;/b&gt; :) &lt;/div&gt;&lt;div class="separator" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="https://lh3.googleusercontent.com/-24jm4l82ZB8/TYvuIfI6vyI/AAAAAAAAADM/TjJT2qvg5os/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-03-25+%25E4%25B8%258A%25E5%258D%25889.20.54.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://lh3.googleusercontent.com/-24jm4l82ZB8/TYvuIfI6vyI/AAAAAAAAADM/TjJT2qvg5os/s400/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-03-25+%25E4%25B8%258A%25E5%258D%25889.20.54.png" style="cursor: move;" width="348"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;br&gt;
&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Twitter Instant Search &lt;/span&gt;&lt;/b&gt;使用的技術包含：&lt;br&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;YUI 3&lt;/b&gt; &lt;a href="http://developer.yahoo.com/yui/3/autocomplete/"&gt;AutoComplete&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Twitter Search API&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Opera Widget&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;a href="http://clayliao.blogspot.com/2011/03/my-first-opera-widget-twitter-instant.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-8408479911774389797?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pbCcQHbflkrIp0PFVUPEd9fH-6A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pbCcQHbflkrIp0PFVUPEd9fH-6A/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/pbCcQHbflkrIp0PFVUPEd9fH-6A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pbCcQHbflkrIp0PFVUPEd9fH-6A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/bov30zxLoOY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/bov30zxLoOY/my-first-opera-widget-twitter-instant.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh4.googleusercontent.com/-azx3CfvlFrk/TYv_hpfSkJI/AAAAAAAAADU/0RYMXd1MEQY/s72-c/5552908426_0f7a5f2175_b.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/03/my-first-opera-widget-twitter-instant.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-2421810428477490442</guid><pubDate>Tue, 15 Mar 2011 06:51:00 +0000</pubDate><atom:updated>2011-03-15T23:38:59.824+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">Mobile Web</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] 使用 PhoneGap 跨平台開發手機應用程式</title><description>近年來手機應用程式開發愈來愈熱門，為了能夠減少開發者的學習曲線，並延續 Web 的開發經驗，一些幫開發者將 HTML / CSS / JavaScript 包裝成原生應用程式的工具便應運而生。上次介紹過了知名的 &lt;a href="http://clayliao.blogspot.com/2010/11/titanium-mobile-tutorial.html"&gt;Titanium&lt;/a&gt; （&lt;a href="http://clayliao.blogspot.com/2010/11/titanium-mobile-tutorial.html"&gt;[教學] 使用 Titanium 同時開發 iPhone/Android 應用程式&lt;/a&gt;），今天我們來介紹另一套 Open Source 的 &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt;。&lt;br&gt;
&lt;h4&gt;1. 下載 &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt;&lt;/h4&gt;到 &lt;a href="http://www.phonegap.com/"&gt;PhoneGap 官方網站&lt;/a&gt;下載最新版本的程式碼並解壓縮。&lt;br&gt;
&lt;h4&gt;2. 安裝開發套件&lt;/h4&gt;&lt;div class="separator"&gt;解開壓縮檔後可以看到 &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt; 支援的各種 Mobile OS 平台，除了最熱門的 &lt;b&gt;iOS&lt;/b&gt;, &lt;b&gt;Android&lt;/b&gt; 外，還有 &lt;b&gt;BlackBerry&lt;/b&gt;, &lt;b&gt;Symbian&lt;/b&gt; 與 &lt;b&gt;WebOS&lt;/b&gt; 等。這裡以 iPhone App 作為範例，所以我們開啟&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt; iOS&lt;/span&gt;&lt;/b&gt; 資料夾：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="https://lh3.googleusercontent.com/-6AClwIb0NQo/TX44KrtiFuI/AAAAAAAAACw/D17SUSsPgcU/s1600/PhoneGap_02.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-6AClwIb0NQo/TX44KrtiFuI/AAAAAAAAACw/D17SUSsPgcU/s1600/PhoneGap_02.png"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;打開 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;iOS&lt;/span&gt;&lt;/b&gt; 資料夾後，安裝 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;PhoneGapLibinstaller.pkg&lt;/span&gt;&lt;/b&gt; ：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="https://lh3.googleusercontent.com/-6AClwIb0NQo/TX44KrtiFuI/AAAAAAAAACw/D17SUSsPgcU/s1600/PhoneGap_02.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="https://lh3.googleusercontent.com/-FzfH9DA51J8/TX44LI1AVlI/AAAAAAAAAC0/OVkCBXRzV4k/s1600/PhoneGap_03.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh3.googleusercontent.com/-FzfH9DA51J8/TX44LI1AVlI/AAAAAAAAAC0/OVkCBXRzV4k/s640/PhoneGap_03.png" width="550"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;/div&gt;&lt;h4&gt;3. Hello PhoneGap! &lt;/h4&gt;&lt;div class="separator"&gt;經過一連串的授權聲明確認完成安裝後，打開 &lt;b&gt;Xcode&lt;/b&gt; 編輯器，側邊導覽列的 &lt;b&gt;User Templates&lt;/b&gt; 下方新增了一個 &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt; 選項：&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="https://lh6.googleusercontent.com/-EpAIiOxNs5c/TX44KMjP2gI/AAAAAAAAACs/qH9EOaZBvpQ/s1600/PhoneGap_01.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-EpAIiOxNs5c/TX44KMjP2gI/AAAAAAAAACs/qH9EOaZBvpQ/s640/PhoneGap_01.png" width="500"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;選擇 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;PhoneGap-based Application &lt;/span&gt;&lt;/b&gt;開始第一個 &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt; 專案。一個標準的 PhoneGap project 如下圖，其中專案目錄與必要的檔案都是自動產生的。首先看到 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;www&lt;/span&gt;&lt;/b&gt; 資料夾下的 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;index.html&lt;/span&gt;&lt;/b&gt; ，這裡是我們的專案起點。&lt;/div&gt;&lt;br&gt;
&lt;div class="separator"&gt;前面提到，使用 &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt; 可以幫我們把 Web App 包裝成 Native App，因此開發者不需要學習 Objective-C 或 Java 就可以開發跨平台的原生應用程式。也就是說，在 &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt; 裡，我們只要在 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;www&lt;/span&gt;&lt;/b&gt; 目錄下工作，寫原生應用程式就彷彿在寫普通網站一樣！&lt;/div&gt;&lt;br&gt;
&lt;div class="separator"&gt;回到 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;index.html&lt;/span&gt;&lt;/b&gt; 檔案，此時 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;lt;body&amp;gt;...&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/b&gt; 裡面還沒有任何內容。我們來試著在 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;lt;body&amp;gt;...&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/b&gt; 中間隨便加點東西，例如：&lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&amp;lt;h1&amp;gt;Hello PhoneGap!&amp;lt;/h1&amp;gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator"&gt;&lt;a href="https://lh3.googleusercontent.com/-m-5pbSvaBFI/TX44L0wxCNI/AAAAAAAAAC4/OEld9UGlk9w/s1600/PhoneGap_04.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="446" src="https://lh3.googleusercontent.com/-m-5pbSvaBFI/TX44L0wxCNI/AAAAAAAAAC4/OEld9UGlk9w/s640/PhoneGap_04.png" width="640"&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4&gt; 4. 使用模擬器執行 PhoneGap 專案&lt;/h4&gt;完成修改 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;index.html&lt;/span&gt;&lt;/b&gt; 後，使用 Xcode 內建的 iphone 模擬器執行 PhoneGap 專案。在左上角的下拉選單中選擇 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Simulator - 4.0&lt;/span&gt;&lt;/b&gt;，點擊&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt; [Build and Run] &lt;/span&gt;&lt;/b&gt;按鈕。此時 PhoneGap 會開始包裝應用程式，幾秒後就能看到模擬器的執行結果：&lt;br&gt;
&lt;br&gt;
&lt;div class="separator"&gt;&lt;a href="https://lh6.googleusercontent.com/-v5UU7MGsz5M/TX44MlJVhJI/AAAAAAAAAC8/H2C1xtEVxI0/s1600/PhoneGap_05.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-v5UU7MGsz5M/TX44MlJVhJI/AAAAAAAAAC8/H2C1xtEVxI0/s1600/PhoneGap_05.png" width="550"&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="https://lh6.googleusercontent.com/-v5UU7MGsz5M/TX44MlJVhJI/AAAAAAAAAC8/H2C1xtEVxI0/s1600/PhoneGap_05.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://lh6.googleusercontent.com/-v5UU7MGsz5M/TX44MlJVhJI/AAAAAAAAAC8/H2C1xtEVxI0/s1600/PhoneGap_05.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://lh6.googleusercontent.com/-v5UU7MGsz5M/TX44MlJVhJI/AAAAAAAAAC8/H2C1xtEVxI0/s1600/PhoneGap_05.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://lh6.googleusercontent.com/-v5UU7MGsz5M/TX44MlJVhJI/AAAAAAAAAC8/H2C1xtEVxI0/s1600/PhoneGap_05.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br&gt;
&lt;div class="separator"&gt;&lt;a href="https://lh3.googleusercontent.com/-wHtGarg0N7M/TX44NbK32GI/AAAAAAAAADA/P1fiSW2dHSA/s1600/PhoneGap_06.png" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://lh3.googleusercontent.com/-wHtGarg0N7M/TX44NbK32GI/AAAAAAAAADA/P1fiSW2dHSA/s400/PhoneGap_06.png" width="215"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator"&gt;大功告成！&lt;/div&gt;&lt;a href="http://clayliao.blogspot.com/2011/03/phonegapintroduction.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-2421810428477490442?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5a4XvnQNG7b5lhWAEFatJynLXk8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5a4XvnQNG7b5lhWAEFatJynLXk8/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/5a4XvnQNG7b5lhWAEFatJynLXk8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5a4XvnQNG7b5lhWAEFatJynLXk8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/ItEyUPqHiPo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/ItEyUPqHiPo/phonegapintroduction.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh3.googleusercontent.com/-6AClwIb0NQo/TX44KrtiFuI/AAAAAAAAACw/D17SUSsPgcU/s72-c/PhoneGap_02.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/03/phonegapintroduction.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-5286230444994358642</guid><pubDate>Sun, 06 Mar 2011 10:02:00 +0000</pubDate><atom:updated>2011-08-04T11:56:47.914+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] 使用 YQL 跨網域讀取網站內容</title><description>許多 Mashup 網站經常需要跨網域存取（多個）外部網站資料，如果該資料來源網站沒有提供 JavaScript API 的話，由於 JavaScript 原生的安全性限制，這些動作都必須繞道 Server 端的 Proxy。這個雞肋的步驟很容易澆熄開發者的熱情，特別是對前端工程師 (Front-end Engineer, F2E) 來說更是如此。&lt;br&gt;
&lt;br&gt;
您的煩惱 YQL 聽到了！Yahoo! 查詢語言 （&lt;a href="http://developer.yahoo.com/yql/"&gt;Yahoo! Query Language, YQL&lt;/a&gt;）解決了這個惱人的問題。YQL 將整個網路的公開內容視為一個巨大的資料庫，每個網頁就是一個概念上的 &amp;quot;&lt;b&gt;Table&lt;/b&gt;&amp;quot;。YQL 的概念可以用以下這段 SQL 語法說明：&lt;br&gt;
&lt;blockquote&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-size: large;"&gt;select * from internet&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;h4&gt;

開始使用 YQL&lt;/h4&gt;
YQL 提供了完整的&lt;a href="http://developer.yahoo.com/yql/"&gt;官方文件&lt;/a&gt;，但學習 YQL 可以從更簡單的 YQL &lt;a href="http://developer.yahoo.com/yql/console/"&gt;Console&lt;/a&gt; 開始。&lt;br&gt;
&lt;br&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;a href="http://farm6.static.flickr.com/5296/5501330689_a2e8deb607_b.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://farm6.static.flickr.com/5296/5501330689_a2e8deb607_b.jpg" width="550"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
三個步驟開始 YQL &lt;a href="http://developer.yahoo.com/yql/console/"&gt;Console&lt;/a&gt;：&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;左上方的空白欄位輸入 YQL 語法。YQL 的語法長得很像 SQL ，非常很容易讀寫。初學者可以參考右方列出的的語法範例。以下是一段簡單的 YQL 範例，列出 Flickr 的前10筆搜尋結果：&lt;br&gt;
&lt;code&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;select&lt;/span&gt; * &lt;span class="Apple-style-span" style="color: #38761d;"&gt;from&lt;/span&gt; flickr.photos.search &lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br&gt;
where&lt;/span&gt; text=&amp;quot;Cat&amp;quot; &lt;span class="Apple-style-span" style="color: #38761d;"&gt;limit&lt;/span&gt; 10&lt;/span&gt;&lt;/code&gt;&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;YQL 提供 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;XML&lt;/span&gt;&lt;/b&gt;/&lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;JSON&lt;/span&gt;&lt;/b&gt; 兩種回傳格式，如果是 JSON 還可以加上 &lt;b&gt;callback function&lt;/b&gt;。選擇回傳的格式後，按下黃色的 &amp;quot;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;TEST&lt;/b&gt;&lt;/span&gt;&amp;quot; 按鈕開始抓資料。YQL 的最長回應時間為 30 秒，通常不會太慢，不過實際速度得視目標網站的回應時間而定。&lt;/li&gt;
&lt;li&gt;回傳的結果(&lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;XML&lt;/span&gt;&lt;/b&gt;/&lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;JSON&lt;/span&gt;&lt;/b&gt;)顯示於下方的欄位。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;

使用 YQL 預設的 DataTable&lt;/h4&gt;
&lt;div&gt;
了解了 YQL 語法後，可先別急著動手寫語法。YQL 內建了 1000 個以上的 DataTable ，包含 amazon, ebay, netflix, flickr, github, imdb 甚至 Google 部分的 API 等，這個列表可以在 YQL &lt;a href="http://developer.yahoo.com/yql/console/"&gt;Console&lt;/a&gt; 的右下方找到，節省開發者的時間：&lt;br&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;a href="http://farm6.static.flickr.com/5013/5501963516_863b1a823a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://farm6.static.flickr.com/5013/5501963516_863b1a823a.jpg"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href="http://clayliao.blogspot.com/2011/03/yqlintroduxtion.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-5286230444994358642?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BkQUah2bSWbzEMq3WGdnQ3tY0dI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BkQUah2bSWbzEMq3WGdnQ3tY0dI/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/BkQUah2bSWbzEMq3WGdnQ3tY0dI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BkQUah2bSWbzEMq3WGdnQ3tY0dI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/bflIb7CyPSI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/bflIb7CyPSI/yqlintroduxtion.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm6.static.flickr.com/5296/5501330689_a2e8deb607_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/03/yqlintroduxtion.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-9129937954821421027</guid><pubDate>Sun, 13 Feb 2011 07:22:00 +0000</pubDate><atom:updated>2011-02-13T15:25:05.051+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Facebook</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[Facebook] BigPipe 效能優化技術的疑問與解答</title><description>&lt;h4&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;不久前任職於 Facebook 的 &lt;a href="http://www.facebook.com/cjiang"&gt;Changhao Jiang&lt;/a&gt; 提出了 FB 網頁前端效能調校的文章 &lt;a href="http://www.facebook.com/note.php?note_id=389414033919&amp;amp;id=9445547199"&gt;BigPipe: Pipelining web pages for high performance&lt;/a&gt;。由於網頁的效能調校已經好一陣子沒有出現新的概念與方法，因此該文引起了許多阿宅工程師的注意與討論。以下是我讀完該文後第一時間的疑問與解答。&lt;/span&gt;&lt;/h4&gt;&lt;h4&gt;Q1. 如何讓 Server 與 Browser 同時處理網頁&lt;/h4&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;一般來說，瀏覽器都是在接收到 Server 回傳結果後才開始後續處理，但 BigPipe 則是希望每回傳一個 Pagelet 區塊，瀏覽器就要馬上接手處理該部分的 HTML, CSS 與 JavaScript。為了要達到這樣的效果，其實 Server 端也需要配合採用 &lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;flush&lt;/span&gt;&lt;/b&gt; 的方式回傳結果。這點可以觀察 Facebook 首頁回傳的 &lt;b&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Transfer-Encoding: chunked&lt;/span&gt;&lt;/b&gt; 得到印證（如下圖）。（更多 flush 觀念與實作請參考&lt;a href="http://www.cnblogs.com/BearsTaR/archive/2010/05/19/flush_chunk_encoding.html"&gt;這裡&lt;/a&gt;, &lt;a href="http://blog.wu-boy.com/2008/07/28/303"&gt;這裡&lt;/a&gt; 與 &lt;a href="http://hatsukiakio.blogspot.com/2009/08/phpflushobflush.html"&gt;這裡&lt;/a&gt;）&lt;/div&gt;&lt;img border="0" height="246" src="http://farm6.static.flickr.com/5180/5430706517_b7494df4a5.jpg" width="400"&gt;&lt;br&gt;
&lt;h4&gt;Q2. BigPipe 跟 Ajax 有什麼不同？ 為何不用 Ajax 實作？&lt;/h4&gt;使用 flush 而非 Ajax 的原因主要在於減少對 Server 的 Request 數目。以下圖為例，Facebook 首頁切分為 10 個 Pagelet，如果使用 Ajax 實作的話，瀏覽器必須至少對 Server 送出 10+1 個 Request（或更多）。使用 flush 的方式就可以有效降低 Server 的負擔並減少等待 Server 回應的時間以加快速度。&lt;br&gt;
&lt;br&gt;
&lt;div class="separator" style="clear: both;"&gt;&lt;a href="http://farm6.static.flickr.com/5300/5430722721_746a2de7cf.jpg" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://farm6.static.flickr.com/5300/5430722721_746a2de7cf.jpg" width="400"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="http://www.facebook.com/note.php?note_id=389414033919&amp;amp;id=9445547199"&gt;圖片來源&lt;/a&gt;&lt;/div&gt;&lt;h4&gt;Q3. BigPipe 真的可以有效提昇網頁的效能嗎？&lt;/h4&gt;文章中也提出了使用 BigPipe 的效能改進，&amp;quot;看起來&amp;quot; Facebook 的首頁效能有了顯著的提昇。不過值得注意的是，這是以使用者看到重要區塊的時間（例如：人氣/最新動態）為基準比較。也就是說， &lt;span class="Apple-style-span" style="color: red;"&gt;BigPipe 在意的是讓使用者 &amp;quot;感覺&amp;quot; 變快，但實際上，整個網頁完成的時間卻是比以前慢的。&lt;/span&gt;&lt;br&gt;
&lt;a href="http://clayliao.blogspot.com/2011/02/facebook-bigpipe-performance-tuning.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-9129937954821421027?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/f9G00_8Zb13wf4wBAFQGY6MUK_8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f9G00_8Zb13wf4wBAFQGY6MUK_8/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/f9G00_8Zb13wf4wBAFQGY6MUK_8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f9G00_8Zb13wf4wBAFQGY6MUK_8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/mHlSkgQvUHM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/mHlSkgQvUHM/facebook-bigpipe-performance-tuning.html</link><author>noreply@blogger.com (clay liao)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm6.static.flickr.com/5180/5430706517_b7494df4a5_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/02/facebook-bigpipe-performance-tuning.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-5154181643225688086</guid><pubDate>Thu, 20 Jan 2011 15:13:00 +0000</pubDate><atom:updated>2011-01-27T21:35:44.843+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><category domain="http://www.blogger.com/atom/ns#">實用工具</category><title>Google 版的 JSLint - Closure Linter</title><description>為了提昇 JavaScript 程式碼的品質與統一撰寫風格，許多開發者通常會使用 &lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt; 來檢查程式碼。&lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt; 是 &lt;a href="http://www.crockford.com/"&gt;Douglas Crockford&lt;/a&gt; 發表的 JavaScript 程式碼檢查工具，除了檢查基本的語法外，它還會建議開發者使用比較好的寫法，例如減少使用&lt;span class="Apple-style-span" style="color: #274e13;"&gt;全域變數&lt;/span&gt;與避免危險的函式（e.g., &lt;span class="Apple-style-span" style="color: #274e13;"&gt;eval()&lt;/span&gt;）。一般來說，能通過 &lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt; 驗證的程式碼品質都算是水準之上。&lt;br&gt;
&lt;br&gt;
除了 &lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt; 之外，Google 日前推出的 &lt;a href="http://code.google.com/intl/zh-TW/closure/"&gt;Closure Tools&lt;/a&gt; 裡其實也低調地包含了一個 JavaScript 檢查工具： &lt;a href="http://code.google.com/p/closure-linter/"&gt;Closure Linter&lt;/a&gt; 。這裡我們就來試著安裝並測試它的效果。&lt;br&gt;
&lt;h4&gt;安裝 Closure Linter&lt;/h4&gt;&lt;a href="http://code.google.com/p/closure-linter/"&gt;Closure Linter&lt;/a&gt; 使用 Python 的 &lt;span class="Apple-style-span" style="color: #274e13;"&gt;easy_install&lt;/span&gt; 安裝，如果你的開發環境已經有具備前述的兩項條件，只需要一行指令即可安裝 &lt;a href="http://code.google.com/p/closure-linter/"&gt;Closure Linter&lt;/a&gt; ，以 Mac 為例（&lt;a href="http://code.google.com/intl/zh-TW/closure/utilities/docs/linter_howto.html"&gt;其他OS安裝步驟&lt;/a&gt; ）：&lt;br&gt;
&lt;blockquote&gt;$ sudo &lt;span class="Apple-style-span" style="color: blue;"&gt;easy_install &lt;/span&gt;http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz&lt;/blockquote&gt;&lt;h4&gt;使用 Closure Linter 檢查程式碼&lt;/h4&gt;為了測試 &lt;a href="http://code.google.com/p/closure-linter/"&gt;Closure Linter&lt;/a&gt; 是否有效，首先得準備一份寫得很糟的 JavaScript 程式碼，並存檔為 &lt;span class="Apple-style-span" style="color: #274e13;"&gt;testlint.js&lt;/span&gt; (檔名隨意)：&lt;br&gt;
&lt;br&gt;
經 JSLint 判斷，這段程式碼可以改進的地方有： 1.變數結尾沒有分號, 2.使用比較不效率的方式建立陣列, 3.函式中有多餘的空格字元, 4.line 5 使用 tab 而非空格縮排。&lt;br&gt;
&lt;br&gt;
&lt;img src="http://farm6.static.flickr.com/5086/5370332922_6c1ca16644.jpg"&gt;&lt;br&gt;
&lt;h4&gt;Run Closure Linter&lt;/h4&gt;&lt;div&gt;接著使用 &lt;span class="Apple-style-span" style="color: #274e13;"&gt;gjslint ＋ 檔名&lt;/span&gt; 開始檢查 JavaScript。很快地， &lt;a href="http://code.google.com/p/closure-linter/"&gt;Closure Linter&lt;/a&gt; 提出了四個 errors：&lt;/div&gt;&lt;blockquote&gt;$ &lt;span class="Apple-style-span" style="color: blue;"&gt;gjslint&lt;/span&gt; testlint.js&lt;/blockquote&gt;&lt;img src="http://farm6.static.flickr.com/5210/5369725801_de8f231b65.jpg"&gt;&lt;br&gt;
&lt;br&gt;
與 &lt;a href="http://www.jslint.com/"&gt;JSLint&lt;/a&gt; 相比， &lt;a href="http://code.google.com/p/closure-linter/"&gt;Closure Linter&lt;/a&gt; 並沒有提醒開發者注意&lt;span class="Apple-style-span" style="color: #274e13;"&gt;全域變數&lt;/span&gt;，也沒有建議使用 &lt;span class="Apple-style-span" style="color: #274e13;"&gt;[]&lt;/span&gt; 來建立陣列。&lt;br&gt;
&lt;a href="http://clayliao.blogspot.com/2011/01/another-jslint-google-closure-linter.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-5154181643225688086?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1riTbIweQC9UyqJpl79WaeG4GBU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1riTbIweQC9UyqJpl79WaeG4GBU/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/1riTbIweQC9UyqJpl79WaeG4GBU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1riTbIweQC9UyqJpl79WaeG4GBU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/SFVaamNLzh8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/SFVaamNLzh8/another-jslint-google-closure-linter.html</link><author>noreply@blogger.com (clay0529)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm6.static.flickr.com/5086/5370332922_6c1ca16644_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2011/01/another-jslint-google-closure-linter.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-7876255144433405493</guid><pubDate>Thu, 23 Dec 2010 13:25:00 +0000</pubDate><atom:updated>2011-06-05T10:06:36.764+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] YUI 3 學習筆記 (8) ─ Widgets</title><description>許多 JavaScript Library 都提供了視覺化介面，例如月曆、標籤效果等等。在 &lt;a href="http://developer.yahoo.com/yui/3/" target="_blank"&gt;YUI&lt;/a&gt; 裡，我們把這些視覺化元件稱為 &lt;b&gt;&lt;span style="color: red;"&gt;Widget&lt;/span&gt;&lt;/b&gt;。 以下將以開發者常常需要實做的 &amp;quot;&lt;b&gt;標籤效果&amp;quot; &lt;/b&gt;為例，使用 YUI 的 TabView Widget 快速製作出跨瀏覽器的標籤效果。&lt;br&gt;
&lt;h4&gt;1. 載入YUI 3 核心檔案&lt;/h4&gt;首先載入YUI 3 的核心檔案。在HTML的&lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/b&gt;標籤之間加入這一行： &lt;code&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;a href="http://yui.yahooapis.com/3.2.0/build/yui/yui-min.js%22"&gt;http://yui.yahooapis.com/3.2.0/build/yui/yui-min.js&amp;quot;&lt;/a&gt;&amp;gt;&amp;lt;/script&amp;gt; &lt;/code&gt;  &lt;br&gt;
&lt;h4&gt;2. 準備 HTML Markup&lt;/h4&gt;&lt;a href="http://developer.yahoo.com/yui/3/" target="_blank"&gt;YUI&lt;/a&gt; 的 &lt;b&gt;TabView&lt;/b&gt; Widget 支援各種資料來源，這裡我們考慮到瀏覽器的漸進式支援 (Progress Enhancement)，所以將標籤頁的內容寫在 HTML 裡面。準備一個 &lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;div id=”&lt;/span&gt;&lt;span style="color: red;"&gt;demo&lt;/span&gt;&lt;span style="color: green;"&gt;”&amp;gt; … &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/b&gt; 作為最外層的容器，以下所有的內容都要放在這個 id 命名為 demo 的 &lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/b&gt; 標籤裡。為了方便說明，範例使用 YUI 預設的樣式，所以我們再給這個標籤加上 &lt;b&gt;&lt;span style="color: red;"&gt;&lt;span style="color: green;"&gt;class=&amp;quot;&lt;/span&gt;yui3-skin-sam&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;quot;&lt;/span&gt;&lt;/b&gt; 屬性:&lt;br&gt;
&lt;img src="http://farm6.static.flickr.com/5203/5285500910_13e061a4ef_z.jpg"&gt;&lt;br&gt;
&lt;img src="http://farm6.static.flickr.com/5246/5285500932_45d18aab4a_z.jpg"&gt; &lt;br&gt;
使用瀏覽器開啟這個檔案，所有的標籤如預期地垂直排列，而且目前還看不到任何變化:&lt;br&gt;
&lt;img src="http://farm6.static.flickr.com/5247/5284890101_ae8da71f4e.jpg"&gt; &lt;br&gt;
&lt;h4&gt;3. 使用 YUI Widget: TabView&lt;/h4&gt;接著我們要使用  TabView 這個 Widget 讓頁面產生標籤換頁的效果。實際的做法非常容易，只要在 &lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/b&gt; 結束標籤之前加上以下幾行 JavaScript 程式碼就可以了。簡單來說，這段程式碼作了幾件事情:&lt;br&gt;
&lt;ol&gt;&lt;li&gt;動態載入 YUI &amp;quot;tabview” 模組 &lt;/li&gt;
&lt;li&gt;&lt;b&gt;new&lt;/b&gt; 一個 &lt;b&gt;Y.TabView&lt;/b&gt; 物件，並在初始化的時候指定資料來源，範例的&lt;b&gt;&lt;span style="color: red;"&gt; #demo&lt;/span&gt;&lt;/b&gt; 對應到剛剛準備好的 &lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;div id=”&lt;/span&gt;&lt;span style="color: red;"&gt;demo&lt;/span&gt;&lt;span style="color: green;"&gt;”&amp;gt; … &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/b&gt; &lt;/li&gt;
&lt;li&gt;render TabView Widget &lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://farm6.static.flickr.com/5201/5285500948_56e1c0cb3b_z.jpg"&gt;&lt;br&gt;
&lt;h4&gt;&lt;/h4&gt;&lt;a href="http://clayliao.blogspot.com/2010/12/yui-3-tutorial-8-widget.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-7876255144433405493?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DH6JL6rPNPSbOzzk8AhVwIcAUMk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DH6JL6rPNPSbOzzk8AhVwIcAUMk/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/DH6JL6rPNPSbOzzk8AhVwIcAUMk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DH6JL6rPNPSbOzzk8AhVwIcAUMk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/9tRWirBxPuY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/9tRWirBxPuY/yui-3-tutorial-8-widget.html</link><author>noreply@blogger.com (clay0529)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm6.static.flickr.com/5203/5285500910_13e061a4ef_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2010/12/yui-3-tutorial-8-widget.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-720261368537291353</guid><pubDate>Tue, 23 Nov 2010 14:27:00 +0000</pubDate><atom:updated>2011-06-05T10:06:36.765+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] YUI 3 學習筆記 (7) ─ 拖放效果</title><description>近年來，在網頁上使用拖拉(放)元素的介面設計已經非常普遍了，YUI 也提供很方便的模組實作這樣的效果。在 YUI 裡，拖拉的功能稱為 &lt;a href="http://developer.yahoo.com/yui/3/dd/" target="_blank"&gt;DD&lt;/a&gt; (&lt;a href="http://developer.yahoo.com/yui/3/dd/" target="_blank"&gt;Drag &amp;amp; Drop&lt;/a&gt; 的簡稱)。這篇教學我們要使用很短的程式碼完成酷炫的拖拉功能，讓一個原本靜態的元素變得更為活潑!&lt;br /&gt;
&lt;h4&gt;1. 載入YUI 3 核心檔案&lt;/h4&gt;首先載入YUI 3 的核心檔案。在HTML的&lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/b&gt;標籤之間加入這一行：&lt;br /&gt;
&lt;code&gt;&amp;lt;script type="text/javascript" src="&lt;a href="http://yui.yahooapis.com/3.2.0/build/yui/yui-min.js%22"&gt;http://yui.yahooapis.com/3.2.0/build/yui/yui-min.js"&lt;/a&gt;&amp;gt;&amp;lt;/script&amp;gt; &lt;/code&gt;  &lt;br /&gt;
&lt;h4&gt;2. 準備一個正方形的 &amp;lt;div&amp;gt; 元素&lt;/h4&gt;&lt;img src="http://farm2.static.flickr.com/1189/5123581542_f64456d0c3.jpg" /&gt; &lt;br /&gt;
&lt;img src="http://farm5.static.flickr.com/4051/5122979103_ece8637473.jpg" /&gt; &lt;br /&gt;
當然您也可以自由發揮設計這個 &lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/b&gt; 元素的外觀。到目前為止，這個元素還無法與使用者互動，完全就是一個普通且靜態的 &lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/b&gt; 元素。&lt;br /&gt;
&lt;h4&gt;3. 載入 YUI 3 的 DD 模組&lt;/h4&gt;與其他的 &lt;a href="http://developer.yahoo.com/yui/3/" target="_blank"&gt;YUI 3&lt;/a&gt; 模組相同，當我們使用 &lt;a href="http://developer.yahoo.com/yui/3/dd/" target="_blank"&gt;DD&lt;/a&gt; 模組的時候，YUI 會自動找到並載入相依的 JS 檔案。這個範例中我們需要撰寫的程式碼非常簡短，只要新建一個 &lt;b&gt;&lt;span style="color: green;"&gt;Y.DD&lt;/span&gt;&lt;/b&gt; 物件並指定元素ID&lt;b&gt;&lt;span style="color: green;"&gt; node: ‘&lt;span style="color: red;"&gt;#demo&lt;/span&gt;’&lt;/span&gt;&lt;/b&gt; 就完成了:&lt;br /&gt;
&lt;img src="http://farm2.static.flickr.com/1422/5122979007_4bc01457b9.jpg" /&gt; &lt;br /&gt;
&lt;blockquote&gt;Note: &lt;b&gt;&lt;span style="color: red;"&gt;#demo&lt;/span&gt;&lt;/b&gt; 來自步驟2 的 &lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;div id=”&lt;span style="color: red;"&gt;demo&lt;/span&gt;”&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;h4&gt;4. 測試拖拉功能&lt;/h4&gt;使用瀏覽器重新讀取檔案，試著用滑鼠&lt;b&gt;"拖曳"&lt;/b&gt;測試用的正方形元素，此時原本靜態的 &lt;b&gt;&lt;span style="color: green;"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/b&gt; 元素已經可以四處拖拉，變得有趣多了! 這裡只介紹了 &lt;b&gt;Drag&lt;/b&gt; ，對完整 &lt;b&gt;Drag &amp;amp; Drop&lt;/b&gt; 有興趣的人可以到這裡&lt;a href="http://developer.yahoo.com/yui/3/examples/dd/index.html" target="_blank"&gt;參考更多 YUI DD 範例&lt;/a&gt;。&lt;br /&gt;
&lt;img src="http://farm5.static.flickr.com/4110/5200956337_aef1d8ce52.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-720261368537291353?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SzqJG-MwgQHJjnsqXKNKQ_tMIio/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SzqJG-MwgQHJjnsqXKNKQ_tMIio/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/SzqJG-MwgQHJjnsqXKNKQ_tMIio/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SzqJG-MwgQHJjnsqXKNKQ_tMIio/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/TWJYjnXD9Ks" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/TWJYjnXD9Ks/yui-3-tutorial-7-draganddrop.html</link><author>noreply@blogger.com (clay0529)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm2.static.flickr.com/1189/5123581542_f64456d0c3_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2010/11/yui-3-tutorial-7-draganddrop.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-8775698174584873984</guid><pubDate>Wed, 03 Nov 2010 15:07:00 +0000</pubDate><atom:updated>2011-06-05T10:34:11.709+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">Mobile Web</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] 使用 Titanium 同時開發 iPhone/Android 應用程式</title><description>隨著智慧型手機愈來愈普及，各種有趣的應用程式也紛紛在手機桌面上攻城掠地。可對開發者來說，開發手機應用程式卻也不是件容易的事，除了投資買台Mac外(for iPhone/iPad)，還得熟悉新的開發架構與程式語言，例如開發 iPhone App 需要學習&lt;strike&gt;有點冷門的&lt;/strike&gt; &lt;strong&gt;Object-C&lt;/strong&gt;、Android App 則要用到 &lt;strong&gt;Java&lt;/strong&gt; 等。&lt;br&gt;
為了解決這個問題，有些大大就開始思考如何讓開發者在不需學習新語言的情況下開發跨平台的 Apps，幾個 Wrapper 開發工具便應運而生。這些開發工具可以幫忙把 Mobile Web App 打包成 iPhone/Android 原生應用程式(Native App)，也就是說，開發者可以延續過去的 Web 開發經驗，統一使用&lt;strong&gt;&lt;span style="color: red;"&gt; &lt;/span&gt;&lt;span style="color: green;"&gt;JavaScript&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: green;"&gt; &lt;/span&gt;撰寫應用程式，而不需要重新學習其他語言與開發平台。目前比較知名的開發 Wrapper 有 &lt;a href="http://www.phonegap.com/" target="_blank"&gt;PhoneGap&lt;/a&gt; 與 &lt;a href="http://www.appcelerator.com/products/titanium-mobile-application-development/" target="_blank"&gt;Titanium&lt;/a&gt;。這裡我們試著用後者進行開發。&lt;br&gt;
&lt;br&gt;
&lt;h3&gt;安裝 Titanium&lt;/h3&gt;1. 首先下載最新版本的 &lt;a href="http://www.appcelerator.com/products/titanium-mobile-application-development/" target="_blank"&gt;Titanium&lt;/a&gt; 、 &lt;a href="http://developer.android.com/sdk/index.html" target="_blank"&gt;Android SDK&lt;/a&gt; 與 &lt;a href="http://developer.apple.com/devcenter/ios/index.action" target="_blank"&gt;iPhone SDK&lt;/a&gt; (Optional，例如 Windows 開發環境無法使用 iPhone SDK)。     &lt;br&gt;
2. 依照&lt;a href="http://developer.appcelerator.com/doc/mobile/get_started" target="_blank"&gt;官方PDF文件&lt;/a&gt;設定 Java 環境與環境變數，注意每種作業系統的設定方式略有出入，以下以 Windows XP 作範例。&lt;br&gt;
&lt;blockquote&gt;Note: Windows 使用者需要特別注意，到 Android SDK 所在目錄執行 &lt;strong&gt;SDK Manager.exe &lt;/strong&gt;這支程式並至少安裝:       &lt;br&gt;
  1. SDK Platform Android 1.6, API 4, revision 3       &lt;br&gt;
  2. Google APIs by Google Inc., Android API 4, revision 2 &lt;/blockquote&gt;&lt;img src="http://farm2.static.flickr.com/1172/5140049898_bf4c5ef806.jpg"&gt; &lt;br&gt;
&lt;br&gt;
&lt;h3&gt;建立新專案&lt;/h3&gt;前面我們提到 &lt;a href="http://www.appcelerator.com/products/titanium-mobile-application-development/" target="_blank"&gt;Titanium&lt;/a&gt; 可以幫助開發者將 Mobile Web App 包裝成行動裝置的原生應用程式(Native App)，首先在 &lt;strong&gt;&lt;span style="color: green;"&gt;Project type&lt;/span&gt;&lt;/strong&gt; 選項中選擇 &lt;strong&gt;&lt;span style="color: red;"&gt;Mobile&lt;/span&gt;&lt;/strong&gt; ，接著依照以下範例填入所有欄位，接著按下&lt;strong&gt;&lt;span style="color: green;"&gt; [Create Project]&lt;/span&gt;&lt;/strong&gt; 按鈕建立新專案。&lt;br&gt;
&lt;br&gt;
&lt;img src="http://farm2.static.flickr.com/1387/5140049756_cd815680d0.jpg"&gt; &lt;br&gt;
&lt;blockquote&gt;Note: 如果專案建立失敗，請重新檢查 Android/iPhone SDK 的位置是否正確。&lt;/blockquote&gt;&lt;h3&gt;啟動模擬器&lt;/h3&gt;新專案成功建立後，切換到上方的 &lt;strong&gt;&lt;span style="color: green;"&gt;Test &amp;amp; Package&lt;/span&gt;&lt;/strong&gt; 視圖 –&amp;gt; 選擇 &lt;strong&gt;&lt;span style="color: green;"&gt;Run Emulator&lt;/span&gt;&lt;/strong&gt; 標籤，點選下方的下拉選單，這裡會列出剛剛安裝的所有 Platforms &amp;amp; APIs，選擇 &lt;strong&gt;&lt;span style="color: green;"&gt;APIs 1.6&lt;/span&gt;&lt;/strong&gt; 後按下 &lt;span style="color: green;"&gt;&lt;strong&gt;[Launch] &lt;/strong&gt;&lt;/span&gt;按鈕啟動模擬器。&lt;br&gt;
&lt;blockquote&gt;Note: 啟動的過程需要一點時間，請耐心等待。啟動過程的錯誤訊息(如果有的話)會印在中間的 Console 中，例如沒有在環境變數中設定&lt;strong&gt;JAVA_HOME&lt;/strong&gt;就會導致 Android 模擬器啟動失敗。&lt;/blockquote&gt;&lt;img src="http://farm2.static.flickr.com/1095/5140049598_f929b893b2.jpg"&gt;&lt;br&gt;
&lt;br&gt;
如果使用 Mac 開發則可選擇啟動 Android 或 iPhone 模擬器：&lt;br&gt;
&lt;img src="http://farm2.static.flickr.com/1076/5154111811_6f400f6968.jpg"&gt;&lt;br&gt;
&lt;a href="http://clayliao.blogspot.com/2010/11/titanium-mobile-tutorial.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-8775698174584873984?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rjETFOjAG0xdLeSh6xkIxvpWq1w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rjETFOjAG0xdLeSh6xkIxvpWq1w/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/rjETFOjAG0xdLeSh6xkIxvpWq1w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rjETFOjAG0xdLeSh6xkIxvpWq1w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/i4eam4JUT40" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/i4eam4JUT40/titanium-mobile-tutorial.html</link><author>noreply@blogger.com (clay0529)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm2.static.flickr.com/1172/5140049898_bf4c5ef806_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2010/11/titanium-mobile-tutorial.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-2797975653530420649</guid><pubDate>Sat, 02 Oct 2010 04:19:00 +0000</pubDate><atom:updated>2011-06-05T10:06:36.766+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] YUI 3 學習筆記 (6) ─ SimpleYUI</title><description>為了追求效能最佳化，使用 YUI 必須了解各項模組，無形中也加提高了學習門檻。為了造福廣大 YUI 初學者，YUI 在新版的 3.2.0 增加了類似 jQuery 一次下載概念的 &lt;b&gt;SimpleYUI&lt;/b&gt;。&lt;b&gt;SimpleYUI &lt;/b&gt;將常用的 JavaScript 功能打包在一起，不清楚模組細節的人可以直接使用各項 YUI 方便的API；略懂部分 UI 模組(例如標籤分頁)的人也可以用習慣的&lt;span style="color: red"&gt;&lt;b&gt;Y.use()&lt;/b&gt;&lt;/span&gt; 動態載入這些模組，加快開發速度且無須重新學習。   &lt;br /&gt;  &lt;h4&gt;1. 載入SimpleYUI檔案&lt;/h4&gt; 首先載入&lt;span style="color: red"&gt;&lt;b&gt;SimpleYUI&lt;/b&gt;&lt;/span&gt;檔案。在HTML的&lt;span style="color: #004000"&gt;&lt;b&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/b&gt;&lt;/span&gt;標籤之間加入這一行：   &lt;br /&gt;&lt;code&gt;&amp;lt;script src=&amp;quot;http://yui.yahooapis.com/3.2.0/build/simpleyui/simpleyui-min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;/code&gt;  &lt;br /&gt;  &lt;br /&gt;前幾篇教學中，為了追求最佳化的效能，一開始我們只有載入 &lt;b&gt;YUI &lt;/b&gt;的核心檔案(6-8 K)，往後才依照需求載入對應的模組，用不到的 js 既不載入也不執行。而 &lt;b&gt;SimpleYUI&lt;/b&gt; 的設計理念則與 &lt;b&gt;jQuery&lt;/b&gt; 相近，都是一次載入基本款的全部檔案(約35K)，目的是方便初學者學習或使用在中小型專案上。   &lt;br /&gt;  &lt;h4&gt;2. 使用SimpleYUI&lt;/h4&gt; &lt;b&gt;SimpleYUI&lt;/b&gt; 包含所有常用的功能，並且預先把 &lt;b&gt;&lt;span style="color: red"&gt;YUI()&lt;/span&gt;&lt;/b&gt; 指定給了全域變數 &lt;b&gt;&lt;span style="color: red"&gt;Y&lt;/span&gt;&lt;/b&gt;。基本上可以將它視為升級版 的JS，接下來我們就可以直覺使用YUI，而不需要思考對應的 YUI 模組。   &lt;br /&gt;&lt;img src="http://farm5.static.flickr.com/4109/5043541148_c36c6bd2ea_z.jpg" /&gt;   &lt;br /&gt;  &lt;blockquote&gt;&lt;b&gt;&lt;span style="font-size: x-small"&gt;Note: &lt;/span&gt;&lt;/b&gt;習慣使用&lt;b&gt;&lt;span style="color: red"&gt; YUI.use('*', handleFunction);&lt;/span&gt;&lt;/b&gt; 的開發者要特別注意 JS 順序，例如將 JS 程式放在&lt;b&gt;&lt;span style="color: #004000"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/b&gt;結束標籤前或是加上&lt;b&gt;&lt;span style="color: #004000"&gt;ondomready&lt;/span&gt;&lt;/b&gt;事件，確保需要的HTML標籤已經載入：&lt;/blockquote&gt;  &lt;blockquote&gt;&lt;img src="http://farm5.static.flickr.com/4131/5042916909_8f2e1a5906.jpg" /&gt;     &lt;br /&gt;&lt;/blockquote&gt;  &lt;h4&gt;Reference:&lt;/h4&gt;  &lt;ol&gt;   &lt;li&gt;YUI 3.2.0: &lt;a href="http://www.yuiblog.com/blog/2010/09/07/yui-3-2-0/" target="_blank"&gt;http://www.yuiblog.com/blog/2010/09/07/yui-3-2-0/&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;SimpleYUI: &lt;a title="http://www.yuiblog.com/blog/2010/09/03/coming-inyui-3-2-0-simpleyui/" href="http://www.yuiblog.com/blog/2010/09/03/coming-inyui-3-2-0-simpleyui/"&gt;http://www.yuiblog.com/blog/2010/09/03/coming-inyui-3-2-0-simpleyui/&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-2797975653530420649?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XUgGozshis6U_Yg-mVYHTDnk5bE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XUgGozshis6U_Yg-mVYHTDnk5bE/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/XUgGozshis6U_Yg-mVYHTDnk5bE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XUgGozshis6U_Yg-mVYHTDnk5bE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/L5XsP0Ni40w" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/L5XsP0Ni40w/yui-3-tutorial-6-simpleyui.html</link><author>noreply@blogger.com (clay0529)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm5.static.flickr.com/4109/5043541148_c36c6bd2ea_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2010/10/yui-3-tutorial-6-simpleyui.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-1103752670535628845</guid><pubDate>Mon, 06 Sep 2010 16:05:00 +0000</pubDate><atom:updated>2011-03-06T13:47:07.160+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><category domain="http://www.blogger.com/atom/ns#">Yahoo</category><title>Yahoo新版首頁效能調校 -- Nicholas經驗分享</title><description>&lt;p&gt;對網頁前端工程師來說，《&lt;a href="http://oreilly.com/catalog/9780596529307" target="_blank"&gt;High Performance Web Sites&lt;/a&gt;》書中的14點原則幾乎成為這幾年來網頁前端效能調校的Best Practice。但近幾年網頁前端明顯朝向&lt;strike&gt;肥大&lt;/strike&gt;豐富化、客製化的趨勢，原有的14點原則似乎有點不敷使用(這大概也是作者出第二集《&lt;a href="http://oreilly.com/catalog/9780596522315?green=14072956987" target="_blank"&gt;Even Faster Web Sites&lt;/a&gt;》的原因吧!)。&lt;/p&gt;  &lt;p&gt;Nicholas 在調校新版的&lt;a href="http://yahoo.com/" target="_blank"&gt;Yahoo! 首頁&lt;/a&gt;就遇到了相同的問題，由於新版的Yahoo! 首頁允許使用者加入各種客製化模組，例如可以將自己的 Gmail 或 Facebook 加入Yahoo! 首頁，並且在不離開網頁的情況下讀取信件或在塗鴉牆留言等。使用者可能加入無限種組合的客製化模組，此時如果將所有圖檔整合成一張 Sprite Image，或是將所有 JavaScript minimized成一個檔案，雖然可以減少 Request 的數量，但卻會造成客戶端(瀏覽器)下載太多不必要的檔案，反而拖累了網頁開啟的速度。&lt;/p&gt;  &lt;p&gt;面對高度客製化的網頁前端效能調校，魚與熊掌不可兼得的兩難下，或許我們可以參考大師的作法：&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_4581155"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Performance on the Yahoo! Homepage" href="http://www.slideshare.net/nzakas/performance-yahoohomepage"&gt;Performance on the Yahoo! Homepage&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4581155" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=performance-yahoo-homepage-100622220111-phpapp02&amp;amp;stripped_title=performance-yahoohomepage"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed name="__sse4581155" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=performance-yahoo-homepage-100622220111-phpapp02&amp;amp;stripped_title=performance-yahoohomepage" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/nzakas"&gt;Nicholas Zakas&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;h3&gt;Reference&lt;/h3&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a title="http://www.stevesouders.com/" href="http://www.stevesouders.com/"&gt;http://www.stevesouders.com/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html" target="_blank"&gt;Best Practices for Speeding Up Your Web Site&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://code.google.com/intl/zh-TW/speed/" target="_blank"&gt;Let's make the web faster&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;&lt;script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;amp;c2=7400849&amp;amp;c3=1&amp;amp;c4=&amp;amp;c5=&amp;amp;c6="&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-1103752670535628845?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Gp677tsBKdDOCOLBKZmMKJE6i3M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Gp677tsBKdDOCOLBKZmMKJE6i3M/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/Gp677tsBKdDOCOLBKZmMKJE6i3M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Gp677tsBKdDOCOLBKZmMKJE6i3M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/M3gul84B6zo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/M3gul84B6zo/performance-on-yahoo-homepage.html</link><author>noreply@blogger.com (clay0529)</author><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2010/09/performance-on-yahoo-homepage.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-8465635612846789316</guid><pubDate>Sun, 22 Aug 2010 13:41:00 +0000</pubDate><atom:updated>2011-06-05T10:06:36.767+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] YUI 3 學習筆記 (5) ─ AJAX 下篇</title><description>&lt;p&gt;在上一篇 &lt;a href="http://clay0529.blogspot.com/2010/08/yui-3-tutorial-4-ajax.html" target="_blank"&gt;YUI3學習筆記(4) -- Ajax 上篇&lt;/a&gt; 中，我們已經使用 YUI 3 提供的 IO 模組完成了跨瀏覽器的 Ajax 效果。但客戶與使用者可能不曉得這個網頁有酷炫的 Ajax 功能，因為他們印象中的 Ajax 應該要有類似下面這樣的圖示才對啊!&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.lunchreader.com/img/ajax-loader.gif"&gt; &lt;/p&gt;&lt;h3&gt;學習目標&lt;/h3&gt;&lt;p&gt;客戶永遠是對的，我們就來替&lt;a href="http://clay0529.blogspot.com/2010/08/yui-3-tutorial-4-ajax.html" target="_blank"&gt;上篇的範例&lt;/a&gt;加上&amp;quot;讀取中...&amp;quot;的圖示吧!&lt;/p&gt;&lt;h3&gt;YUI 3 的 Ajax 事件&lt;/h3&gt;&lt;p&gt;為了精準控制 Ajax 與後端程式連絡的過程，YUI 3 提供了以下的事件供開發者使用，事件依照發生的前後順序排列如下：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;io:start&lt;/span&gt; --&amp;gt; &lt;span&gt;io:complete&lt;/span&gt; --&amp;gt; &lt;span&gt;io:success&lt;/span&gt; --&amp;gt; &lt;span&gt;io:failure&lt;/span&gt; --&amp;gt; &lt;span&gt;io:end&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;這次我們在 HTML 中加入新的 &lt;span&gt;id=&amp;quot;loading&amp;quot;&lt;/span&gt; 的 &lt;span&gt;&amp;lt;img&amp;gt;&lt;/span&gt; 標籤，並且將它的 &lt;span&gt;CSS&lt;/span&gt; 樣式設定為&lt;span&gt; display: none; &lt;/span&gt;，預設不顯示，讓使用者一開始看不見這個圖示。&lt;/p&gt;&lt;p&gt;接著繼續新增兩個 function 負責圖片的顯示與隱藏：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;io:start&lt;/span&gt;&lt;/strong&gt;：當 Ajax 開始的時候，將原本隱藏的 loading 圖片顯示出來。   &lt;br&gt;
&lt;span&gt;&lt;strong&gt;io:complete&lt;/strong&gt;&lt;/span&gt;：當 Ajax 結束後，再度將 loading 圖片隱藏。&lt;/p&gt;&lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4075/4916106456_b4340c4550.jpg"&gt;&lt;/p&gt;&lt;p&gt;到這裡已經完成了 &amp;quot;讀取中...&amp;quot; 的圖示。如果server 回傳的速度太快，導致看不見圖示的話，可以在 &lt;span&gt;showLoading()&lt;/span&gt; 函式加上一個 &lt;span&gt;alert()&lt;/span&gt; 彈出視窗暫時中斷 Ajax 流程，這樣就能看清楚每一階段的效果了：&lt;/p&gt;&lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4120/4916106578_e74c5c39bd.jpg"&gt;&lt;/p&gt;&lt;a href="http://clayliao.blogspot.com/2010/08/yui-3-tutorial-5-ajax.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-8465635612846789316?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KyqoqyrbNl3Y6_0CqQrHIHCmmVU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KyqoqyrbNl3Y6_0CqQrHIHCmmVU/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/KyqoqyrbNl3Y6_0CqQrHIHCmmVU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KyqoqyrbNl3Y6_0CqQrHIHCmmVU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/Y3hewOoJ-qI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/Y3hewOoJ-qI/yui-3-tutorial-5-ajax.html</link><author>noreply@blogger.com (clay0529)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm5.static.flickr.com/4075/4916106456_b4340c4550_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2010/08/yui-3-tutorial-5-ajax.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-7709690923569780412</guid><pubDate>Thu, 19 Aug 2010 16:01:00 +0000</pubDate><atom:updated>2011-06-05T10:06:36.769+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] YUI 3 學習筆記 (4) ─ AJAX 上篇</title><description>&lt;p&gt;自從幾年前 &amp;quot;Web 2.0&amp;quot; 開始流行後，似乎每個網頁都要秀點 Ajax 才表示自己跟得上時代。由於&lt;strike&gt; IE &lt;/strike&gt;瀏覽器的支援度參差不齊，純粹使用 JavaScript 寫 Ajax 必須要自己處理跨瀏覽器的問題，寫起來就不那麼輕鬆寫意。為了解決這個問題， &lt;a href="http://developer.yahoo.com/yui/3/" target="_blank"&gt;YUI 3&lt;/a&gt; 提供了名為 &lt;strong&gt;&lt;span&gt;&amp;quot;io&amp;quot;&lt;/span&gt;&lt;/strong&gt; 的模組方便開發者快速寫出跨瀏覽器的 Ajax。&lt;/p&gt;  &lt;h3&gt;學習目標&lt;/h3&gt;  &lt;p&gt;假設&lt;strike&gt;討厭的&lt;/strike&gt;客戶又提出需求：&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;聽說 Ajax 不用重新整理網頁就可以更新某一部分的內容，這樣好像比較酷炫。我們希望當使用者按下按鈕後，只要更新某一區塊的文字內容。記得不要重新整理網頁喔! 要用 Ajax !&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;記住，客戶永遠是對的，用 Ajax 就是比較酷炫。現在我們使用 &lt;a href="http://developer.yahoo.com/yui/3/" target="_blank"&gt;YUI 3&lt;/a&gt; 來實作 Ajax 功能。&lt;/p&gt;  &lt;h4&gt;1. 載入YUI 3 核心檔案 &lt;/h4&gt;  &lt;p&gt;首先載入YUI 3 的核心檔案。在HTML的&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;標籤之間加入這一行：&lt;/p&gt;  &lt;code&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&lt;a href="http://yui.yahooapis.com/3.1.1/build/yui/yui-min.js%22"&gt;http://yui.yahooapis.com/3.1.1/build/yui/yui-min.js&amp;quot;&lt;/a&gt;&amp;gt;&amp;lt;/script&amp;gt; &lt;/code&gt;  &lt;h4&gt;2. 準備範例後端程式 demo.php&lt;/h4&gt;  &lt;p&gt;為了避免跨網域的問題，我們先準備一個簡單的 &lt;strong&gt;&lt;span&gt;demo.php &lt;/span&gt;&lt;/strong&gt;檔案。這個檔案唯一的功能就是回傳&lt;strong&gt;&amp;quot;Hello! YUI3&amp;quot;&lt;/strong&gt;字串：&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4120/4907737892_86bffc6007_m.jpg"&gt; &lt;/p&gt;  &lt;h4&gt;3. 準備範例 HTML&lt;/h4&gt;  &lt;p&gt;接下來準備簡單的 HTML 檔案，裡面包含一個 div 標籤與一個 button 按鈕：&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4080/4907146783_1018fbbe30.jpg"&gt; &lt;/p&gt;  &lt;h4&gt;4. 載入 YUI 3 的 Ajax 模組：IO&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://developer.yahoo.com/yui/3/"&gt;YUI 3&lt;/a&gt; 為了提高效率，只在需要的時候才載入相對應的模組。這裡我們要使用的是&lt;strong&gt;&lt;span class="Apple-style-span"&gt;&amp;quot;io&amp;quot;&lt;/span&gt;&lt;/strong&gt; Ajax 模組，只要用 &lt;strong&gt;&lt;span class="Apple-style-span"&gt;YUI().use(&amp;#39;io&amp;#39;, ... );&lt;/span&gt;&lt;/strong&gt; 即可載入所有相依的JS檔案。使用 io 模組非常容易，只需要注意以下幾個重點：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;uri&lt;/strong&gt;: 給定後端程式所在位置，這樣前端的 YUI 程式才知道要 call 哪個檔案。範例中使用的是準備好的 &lt;span class="Apple-style-span"&gt;demo.php&lt;/span&gt;。 &lt;br&gt;&lt;strong&gt;function showMsg()&lt;/strong&gt;: 成功取得後端資料後會呼叫這個 &lt;span class="Apple-style-span"&gt;function&lt;/span&gt;。目前我們先將回傳的字串以彈出視窗 &lt;span class="Apple-style-span"&gt;alert()&lt;/span&gt; 印出來。 &lt;br&gt;&lt;strong&gt;Y.on(&amp;#39;io:success&amp;#39;, ...)&lt;/strong&gt;: 註冊事件。io 提供了各種事件，開發者非常彈性地處理各種 AJAX 狀態。詳細的 io 事件&lt;a href="http://developer.yahoo.com/yui/3/api/io.html#event_io:complete" target="_blank"&gt;詳見 API 文件&lt;/a&gt;。 &lt;br&gt;&lt;strong&gt;Y.io()&lt;/strong&gt;: 開始執行 AJAX。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4078/4907146809_0b364e1b0f.jpg"&gt; &lt;/p&gt;  &lt;p&gt;實際執行上面的程式碼，可以看到我們已經正確地拿到後端 &lt;span class="Apple-style-span"&gt;demo.php&lt;/span&gt; 回傳的字串了。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4081/4907738160_a90261d1e3.jpg"&gt; &lt;/p&gt; &lt;a href="http://clayliao.blogspot.com/2010/08/yui-3-tutorial-4-ajax.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-7709690923569780412?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lwOZiCOZu3g17ytQip36KYF_LUc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lwOZiCOZu3g17ytQip36KYF_LUc/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/lwOZiCOZu3g17ytQip36KYF_LUc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lwOZiCOZu3g17ytQip36KYF_LUc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/ALzHZ7LYjTA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/ALzHZ7LYjTA/yui-3-tutorial-4-ajax.html</link><author>noreply@blogger.com (clay0529)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm5.static.flickr.com/4120/4907737892_86bffc6007_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2010/08/yui-3-tutorial-4-ajax.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-21029905.post-8014195097630590506</guid><pubDate>Wed, 18 Aug 2010 14:38:00 +0000</pubDate><atom:updated>2011-06-05T10:06:36.770+08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">YUI</category><category domain="http://www.blogger.com/atom/ns#">網頁前端技術</category><title>[教學] YUI 3 學習筆記 (3) ─ 動畫特效</title><description>&lt;p&gt;在前兩篇文章中，我們已經學會如何使用 &lt;a href="http://developer.yahoo.com/yui/3/" target="_blank"&gt;YUI 3&lt;/a&gt; 來&lt;a href="http://clay0529.blogspot.com/2010/03/yui-3-tutorial-1.html" target="_blank"&gt;操作網頁的 DOM 物件&lt;/a&gt;與&lt;a href="http://clay0529.blogspot.com/2010/03/yui-3-tutorial-2.html" target="_blank"&gt;事件處理&lt;/a&gt;。除了這些基本的JavaScript操作外，&lt;a href="http://developer.yahoo.com/yui/3/" target="_blank"&gt;YUI 3&lt;/a&gt; 還提供&lt;strong&gt;動畫&lt;/strong&gt;功能，只要簡單幾行程式碼就能讓網頁呈現驚人的效果。&lt;/p&gt;  &lt;h3&gt;學習目標&lt;/h3&gt;  &lt;p&gt;假設有一份客戶需求：&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;當使用者按下按鈕後，將一個紅色區塊漸漸地變成一個200px * 200px的方塊，內容文字變成白色... 喔，對了，背景順便換成半透明的好了，這樣看起來比較順眼。&lt;/p&gt;&lt;/blockquote&gt;  &lt;p&gt;純粹使用 JavaScript 要做到這樣的效果並不容易，所以我們使用 YUI 3 來完成它。&lt;/p&gt;&lt;h4&gt;1. 載入YUI 3 核心檔案&lt;/h4&gt;  &lt;p&gt;首先載入YUI 3 的核心檔案。在HTML的&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;標籤之間加入這一行： &lt;/p&gt; &lt;code&gt; &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://yui.yahooapis.com/3.1.1/build/yui/yui-min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;/code&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h4&gt;2. 準備範例 HTML&lt;/h4&gt;&lt;div&gt;先準備一份簡單的 HTML 檔案，裡面主要包含一個 div 標籤與一個 button 按鈕：&lt;/div&gt;  &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4077/4904017941_58d3b0ba8d.jpg"&gt; &lt;/p&gt;  &lt;h4&gt;3. 載入YUI 3 的動畫模組：Animation&lt;/h4&gt;  &lt;p&gt;前面我們介紹過 &lt;a href="http://developer.yahoo.com/yui/3/" target="_blank"&gt;YUI 3&lt;/a&gt; 為了提高效率，只在需要的時候才載入相對應的模組。這裡我們要使用的是&lt;strong&gt;&amp;quot;anim&amp;quot;&lt;/strong&gt;動畫模組，只要用 &lt;span&gt;&lt;strong&gt;YUI().use(&amp;#39;anim&amp;#39;, ... );&lt;/strong&gt;&lt;/span&gt; 即可載入一連串相依的JS檔案：&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4139/4904017971_5c4aec2e05.jpg"&gt; &lt;/p&gt;  &lt;h4&gt;4. 使用 Animation 模組製作動畫效果&lt;/h4&gt;  &lt;p&gt;使用 &lt;a href="http://developer.yahoo.com/yui/3/" target="_blank"&gt;YUI 3&lt;/a&gt; 製作效果非常容易，基本上只需要做到三件事：&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;指定DOM物件 &lt;/li&gt;    &lt;li&gt;告訴它最後要變成什麼樣式 &lt;/li&gt;    &lt;li&gt;選擇特效 &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;很簡單吧! 但光說不練是沒有用的，接下來我們來一步步完成客戶剛剛提出的需求。&lt;/p&gt;  &lt;h4&gt;5. 替 DOM 物件加上動畫效果&lt;/h4&gt;  &lt;p&gt;載入 anim 模組後，首先 new 一個 &lt;span&gt;Y.Anim&lt;/span&gt; 物件，然後加上各項細部設定：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;node&lt;/span&gt;&lt;/strong&gt;：要加上動畫特效的目標，範例選擇&lt;span&gt; id=&amp;#39;demo&amp;#39;&lt;/span&gt; 的&lt;span&gt;&amp;lt;div&amp;gt;標籤&lt;/span&gt;，當然你也可以使用class選擇目標標籤。&lt;br&gt;&lt;strong&gt;&lt;span&gt;to&lt;/span&gt;&lt;/strong&gt;：結束時的效果。範例將透明度設定為0.5(半透明)、白色的前景顏色與長寬各200px。&lt;br&gt;&lt;strong&gt;&lt;span&gt;anim.set(...)&lt;/span&gt;&lt;/strong&gt;：給動畫加上時間設定與效果，更多效果請&lt;a href="http://developer.yahoo.com/yui/3/api/Easing.html" target="_blank"&gt;參考 API 文件&lt;/a&gt;。&lt;br&gt;&lt;strong&gt;&lt;span&gt;anim.run()&lt;/span&gt;&lt;/strong&gt;：trigger 動畫效果。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm5.static.flickr.com/4080/4906231414_271deb9ccc.jpg"&gt; &lt;/p&gt;  &lt;p&gt;在瀏覽器上試著跑跑看，紅色框是不是按著我們的想像逐漸變換顏色與大小了呢? 不過現再我們只完成了一半。回頭看看客戶的需求，這個特效必須讓使用者自己啟動，於是我們還得加上事件處理。&lt;/p&gt; &lt;a href="http://clayliao.blogspot.com/2010/08/yui-3-tutorial-3-anim.html#more"&gt;閱讀更多 »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21029905-8014195097630590506?l=clayliao.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Uv7q_ngWDE1T02zgZygX3WoehVc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Uv7q_ngWDE1T02zgZygX3WoehVc/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/Uv7q_ngWDE1T02zgZygX3WoehVc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Uv7q_ngWDE1T02zgZygX3WoehVc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/buzzshareinside/~4/2mj_dZ2KQUU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/buzzshareinside/~3/2mj_dZ2KQUU/yui-3-tutorial-3-anim.html</link><author>noreply@blogger.com (clay0529)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm5.static.flickr.com/4077/4904017941_58d3b0ba8d_t.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://clayliao.blogspot.com/2010/08/yui-3-tutorial-3-anim.html</feedburner:origLink></item></channel></rss>

