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

<channel>
	<title>至如ericsk者，國四無雙 &#187; 資訊科學</title>
	<atom:link href="http://blog.ericsk.org/archives/category/computer-science/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.ericsk.org</link>
	<description>It&#039;s all about ericsk.</description>
	<lastBuildDate>Wed, 18 Aug 2010 09:51:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>JavaScript 存取 Google 試算表的資料</title>
		<link>http://blog.ericsk.org/archives/1417</link>
		<comments>http://blog.ericsk.org/archives/1417#comments</comments>
		<pubDate>Mon, 16 Aug 2010 07:08:27 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google spreadsheet]]></category>
		<category><![CDATA[google visualization api]]></category>
		<category><![CDATA[query language]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1417</guid>
		<description><![CDATA[你知道嗎？Google 試算表也可以做為一個簡單的資料庫，支援簡單的查詢語法，或者更簡單以各種格式讀取它的資料。 以 Google Visualization API 取得資料 在 Google Visualization API 中定義了一套 Query Language，用來規範一種資料查詢、輸出的協定，使得 Visualization API 中的各種圖表元件，在讀取資料這塊有個固定的格式，只要任何「資料來源」按照這套 Query Language 來實作，都可以輕易地利用 Visualization API 畫出各種圖表。而在 Google 的服務中，Google 試算表（Spreadsheet）已經實作了這個協定，所以你也可以把資料放在 Google Spreadsheet 中，再使用 JavaScript 利用 Visualization API（其它語言當然也可以）來取得資料。 假設我在 Google 文件中建立了一個試算表，並且輸入了像這樣的表格資料： A B C 1 eric 100 2 kevin 300 3 peter 50 接著我將這個試算表的權限設定為「Public on the web」（如下圖所示），於是你可以得到一個公開存取的 URL，裡面就有這份試算表的 key，將它記錄下來，稍後便會利用這個 key [...]]]></description>
			<content:encoded><![CDATA[<p>你知道嗎？Google 試算表也可以做為一個簡單的資料庫，支援簡單的查詢語法，或者更簡單以各種格式讀取它的資料。</p>
<h4>以 Google Visualization API 取得資料</h4>
<p>在 <a href="http://code.google.com/apis/visualization/interactive_charts.html" target="_blank">Google Visualization API</a> 中定義了一套 <a href="http://code.google.com／apis/visualization/documentation/querylanguage.html">Query Language</a>，用來規範一種資料查詢、輸出的協定，使得 Visualization API 中的各種圖表元件，在讀取資料這塊有個固定的格式，只要任何「資料來源」按照這套 Query Language 來實作，都可以輕易地利用 Visualization API 畫出各種圖表。而在 Google 的服務中，Google 試算表（Spreadsheet）已經實作了這個協定，所以你也可以<strong>把資料放在 Google Spreadsheet 中，再使用 JavaScript 利用 Visualization API（其它語言當然也可以）來取得資料</strong>。</p>
<p>假設我在 Google 文件中建立了一個試算表，並且輸入了像這樣的表格資料：</p>
<table border="1" width="200" cellspacing="5" cellpadding="5">
<thead>
<tr>
<th>A</th>
<th>B</th>
<th>C</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>eric</td>
<td>100</td>
</tr>
<tr>
<td>2</td>
<td>kevin</td>
<td>300</td>
</tr>
<tr>
<td>3</td>
<td>peter</td>
<td>50</td>
</tr>
</tbody>
</table>
<p>接著我將這個試算表的權限設定為「<em>Public on the web</em>」（如下圖所示），於是你可以得到一個公開存取的 URL，裡面就有這份試算表的 <code>key</code>，將它記錄下來，稍後便會利用這個 key 來存取資料。</p>
<div style="text-align:center"><img src="http://lh4.ggpht.com/_hNy_9UI1_R8/TGUhpcPpa5I/AAAAAAAARQ0/GujDRhCvXcM/s800/ChromiumScreenSnapz001.png" alt="" style="border:1px solid #999;padding:2px"></div>
<p>接著，你便可以在某個網頁裡這樣讀取這份資料：</p>
<blockquote><p><pre><code>[HTML 部份]
&lt;!-- 載入 Google AJAX API Loader --&gt;
&lt;script src=&quot;http://www.google.com/jsapi&quot;&gt;&lt;/script&gt;

...
[JavaScript 部份]
// 載入 Visualization API
var URL = &#039;http://spreadsheets.google.com/tq?key=&lt;你試算表的 key&gt;&#039;;
google.load(&#039;visualization&#039;, &#039;1&#039;);
var query = new google.visualization.Query(URL);
// 使用 query language 查詢資料
query.setQuery(&#039;select B, C where C &gt; 50&#039;);
query.send(function(resp){
&nbsp;&nbsp;if (!resp.isError()) {
&nbsp;&nbsp;&nbsp;&nbsp;var dataTable = resp.getDataTable();
&nbsp;&nbsp;&nbsp;&nbsp;var jsonData = JSON.parse(dataTable.toJSON());
&nbsp;&nbsp;&nbsp;&nbsp;....
&nbsp;&nbsp;}
});
</code></pre></p></blockquote>
<p>透過這樣的方式，你就可以利用 Query Language 來篩選要讀取的資料，在這個例子中則是會回傳兩筆資料（因為 C column 的值大於 50 的只有兩筆），而回傳之後也可以轉成 JSON 格式的資料來使用（上面的 <code>JSON</code> 物件並不是所有瀏覽器都有內建，如果要確保所有瀏覽器都能用，請使用 <a href="http://www.json.org/json2.js" target="_blank">json2.js</a>），十分方便，而資料的攞放的欄位也有一點點特別，像是這樣：</p>
<blockquote><p><pre><code>....
// 讀取資料每一個 row 的資料
var len = jsonData.rows.length;
for (var i = 0; i &lt; len; ++i) {
&nbsp;&nbsp;var row = jsonData.rows[i];
&nbsp;&nbsp;// row.c[0].v 這是 B column 的值
&nbsp;&nbsp;// row.c[1].v 這是 C column 的值
}</code></pre></p></blockquote>
<p>因為我們在上述的查詢語法中，只有 select 出 B 及 C 兩個 columns，所以它會將資料放在 <code>row.c[0]</code> 及 <code>row.c[1]</code> 之中，不過這個資料結構還有儲存像是資料型態的資訊，所以要存取它的值，就要讀取它的 <code>v</code> 成員變數。這樣就可以利用 Google 試算表做一個簡單的資料來源，在建立資料時可以上 Google 試算表用它的介面輸入，而網頁呈現則可以另外製作。</p>
<blockquote><p>COSCUP 2010 的 Mobile Web App 在 Sessions/Schedule 頁面的資料就是利用這個方式存取遠端 Spreadsheet 的資料，這樣工作人員只需要利用 Google 文件的頁面修改資料，web app 的部份完全不需要修改。</p></blockquote>
<p>至於 Query Language 可以怎麼使用，或是要怎麼讓自己的資料來源符合輸出規範，這部份就參考<a href="http://code.google.com／apis/visualization/documentation/querylanguage.html" target="_blank">官方文件</a>吧！</p>
<h4>以 JSON 方式取得資料</h4>
<p>當然，如果你不想使用 Visualization API 也沒關係，只要在你「發佈」（右上角的 Share 按鈕，有個 Publish as a web page）了這份文件時，就可以選擇以各種格式輸出，如下圖所示：</p>
<div style="text-align:center"><img src="http://lh6.ggpht.com/_hNy_9UI1_R8/TGjjRcyQ8XI/AAAAAAAARSY/7hXqCyHlkas/s800/pub_spreadsheet.png" alt=""></div>
<p>如果你要 json 格式的資料，雖然這個介面上目前沒有 JSON 格式可以選擇，但是你可以先選擇 RSS，再將網址中的 <code>alt=rss</code> 改成 <code>alt=json</code> 就能透過該 URL 輸出 json 格式的資料囉。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1417/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[非官方] COSCUP 2010 Mobile Web App</title>
		<link>http://blog.ericsk.org/archives/1416</link>
		<comments>http://blog.ericsk.org/archives/1416#comments</comments>
		<pubDate>Tue, 10 Aug 2010 15:41:50 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[coscup]]></category>
		<category><![CDATA[googleio]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[webapp]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1416</guid>
		<description><![CDATA[因為不是官方發佈，純粹是個人小品，所以軟體品質跟 COSCUP 工作人員沒有關係喔（也就是說，如果你覺得這東西很鳥很爛，罵我就是了）。但還是要提醒大家記得要來參加 COSCUP 2010 喔！！ 今年五月時我飛到美國舊金山參加了 Google I/O 2010 這個年度盛會（當時的速記），出發前 Google 不但一人送了一臺 Nexus One（或是 Droid），同時官方也弄了一個專屬 Google I/O 這個研討會的 Android App，這個軟體讓你可以在手機上瀏覽會場資訊，包括會場平面圖、議程資訊、寫筆記等等，如果你有興趣的話，Google 的工程師也有將它 open source 出來，你可以感受一下它的用途。 後來我決定參加台灣開源界一年一度盛事－－COSCUP 2010 之後，聽聞這次 HTML5 是個很大的主題，我就突然興趣想用 HTML5 來仿製那個 Google I/O App，除了提供參加者一個方便的途逕即時利用手機（其實只支援 iPhone/Android）查詢資料之外，也暗自呼應 HTML5 這個主題，如果你有興趣嚐試，可以拿出你的 iPhone/Android，用（內建的）瀏覽器開啟：http://bit.ly/coscup-mobile 這一頁（或是使用下方的 QR-code） 雖然做得沒有像 Google I/O 那個軟體那麼完整，而且我也因為自己能力有限、時間不足的情況下擠出了這個野人所獻的曝，還請大家多多包含。不過為了補償我這不專業的成果，我會陸續將我開發這個 webapp 的過程、心得及手法找時間寫出心得分享的文章，讓大家一起討論、一起學習 HTML5。目前我有用到的相關技術大致上如下：（好像很多 Google API/service&#8230;.沒辦法，誰教我現在是 Taipei GTUG organizer 呢 XD） [...]]]></description>
			<content:encoded><![CDATA[<p>因為不是官方發佈，純粹是個人小品，所以軟體品質跟 COSCUP 工作人員沒有關係喔（也就是說，如果你覺得這東西很鳥很爛，罵我就是了）。但還是要提醒大家記得要來參加 <a href="http://coscup.org/" target="_blank">COSCUP 2010</a> 喔！！</p>
<p>今年五月時我飛到美國舊金山參加了 <a href="http://code.google.com/events/io/2010/" target="_blank">Google I/O 2010</a> 這個年度盛會（當時的<a href="http://blog.ericsk.org/archives/1405" target="_blank">速記</a>），出發前 Google 不但一人送了一臺 Nexus One（或是 Droid），同時官方也弄了一個專屬 Google I/O 這個研討會的 Android App，這個軟體讓你可以在手機上瀏覽會場資訊，包括會場平面圖、議程資訊、寫筆記等等，如果你有興趣的話，Google 的工程師也有<a href="http://code.google.com/p/iosched/" target="_blank">將它 open source 出來</a>，你可以感受一下它的用途。</p>
<div style="text-align:center"><img src="http://lh6.ggpht.com/_hNy_9UI1_R8/TGFxOw0FcOI/AAAAAAAARQE/V0VI1fqgo5M/s400/coscup-mobile.png" alt=""></div>
<p>後來我決定參加台灣開源界一年一度盛事－－COSCUP 2010 之後，聽聞這次 HTML5 是個很大的主題，我就突然興趣想用 HTML5 來仿製那個 Google I/O App，除了提供參加者一個方便的途逕即時利用手機（其實只支援 iPhone/Android）查詢資料之外，也暗自呼應 HTML5 這個主題，如果你有興趣嚐試，可以拿出你的 iPhone/Android，用（內建的）瀏覽器開啟：<a href="http://bit.ly/coscup-mobile">http://bit.ly/coscup-mobile</a> 這一頁（或是使用下方的 QR-code）</p>
<p><img src="http://qrcode.kaywa.com/img.php?s=8&#038;d=http%3A%2F%2Fconference-app.appspot.com%2Fcoscup10%2F" alt="qrcode" ></p>
<p>雖然做得沒有像 Google I/O 那個軟體那麼完整，而且我也因為自己能力有限、時間不足的情況下擠出了這個野人所獻的曝，還請大家多多包含。不過為了補償我這不專業的成果，我會陸續將我開發這個 webapp 的過程、心得及手法找時間寫出心得分享的文章，讓大家一起討論、一起學習 HTML5。目前我有用到的相關技術大致上如下：（好像很多 Google API/service&#8230;.沒辦法，誰教我現在是  <a href="http://www.taipei-gtug.org/" target="_blank">Taipei GTUG</a> organizer 呢 XD）</p>
<ul>
<li><a href="http://code.google.com/appengine" target="_blank">Google AppEngine</a></li>
<li><a href="http://code.google.com/apis/storage" target="_blank">Google Storage</a></li>
<li><a href="http://code.google.com/apis/visualization/documentation/querylanguage.html" target="_blank">Google Visualization API Query Language</a></li>
<li><a href="http://code.google.com/apis/maps/" target="_blank">Google Maps API</a></li>
<li>HTML5
<ul>
<li>Web Storage</li>
<li>Web Database</li>
<li>Application Cache</li>
</ul>
</li>
<li>CSS3 Box Layout</li>
<li>其它（？）</li>
</ul>
<p>目前從<a href="http://www.plurk.com/p/6uir37" target="_blank">這則噗浪</a>中好像還有一些朋友發現了幾個問題，吃燒餅難免掉芝麻，寫程式一定會有 bugs 的，如果看到這篇文章的朋友還發現了什麼問題，歡迎提出您的看法，我會努力想辦法去解決它的！還請大家多多指教囉～</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1416/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>使用 Google Maps API (v3) 中的 Image Map Type</title>
		<link>http://blog.ericsk.org/archives/1414</link>
		<comments>http://blog.ericsk.org/archives/1414#comments</comments>
		<pubDate>Tue, 03 Aug 2010 17:04:45 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[coscup]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google maps api]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1414</guid>
		<description><![CDATA[使用 ImageMapType 讓你的 Maps 更有自己的風格！ 前情提要 因為義務幫忙今年的 COSCUP 製作了一個 webapp 供參加者來使用，目前已經接近完成（因為有別的事在忙，所以拖了有點久）的階段，過幾天會正式放出來給大家使用，不過我先寫一些製作的心得分享文。 什麼是 ImageMapType 在 COSCUP Mobile WebApp 中的「Maps」部份，為了顯示出活動地點的室內平面圖，這個東西是我參考 Google I/O 2010 提供的會場地圖的方式而製作出來，使用自己繪製的平面圖疊加在原本的衛星圖資之上，它的顯示效果如下所示： 如果你曾經有注意過 Google 與電影「赤壁」合作過的活動網頁，你會發現其中有一個呈現赤壁古戰場風貌的地圖小工具（Mapplet），而它也是利用了 ImageMapType 的方式將古地圖貼上去。若是你也有類似的開發需求，不必抓破頭煩惱怎麼把自己的圖片疊上去而寫出複雜的 JavaScript 程式碼，只需要利用 Google Maps JavaScript API v3 中的 ImageMapType 部份的 API 就可以完成，只不過在實務上該怎麼進行，以及要注意的事項在目前的官方文件並沒有寫得很清楚，這篇文章將會介紹我是如何完成這個效果，以及開發時的心得。 Google地圖圖資規格 Google 地圖的圖資是以一堆正方形的 tiles 所組成，每一個 tile 的大小是 256px * 256px（不論縮放，不同縮放大小就是不同的 tile，但大小都是 256px * 256px），而每個 tile 有 [...]]]></description>
			<content:encoded><![CDATA[<p>使用 ImageMapType 讓你的 Maps 更有自己的風格！</p>
<h4>前情提要</h4>
<p>因為義務幫忙今年的 <a href="http://coscup.org/">COSCUP</a> 製作了一個 webapp 供參加者來使用，目前已經接近完成（因為有別的事在忙，所以拖了有點久）的階段，過幾天會正式放出來給大家使用，不過我先寫一些製作的心得分享文。</p>
<h4>什麼是 ImageMapType</h4>
<p>在 COSCUP Mobile WebApp 中的「Maps」部份，為了顯示出活動地點的室內平面圖，這個東西是我參考 <a href="http://code.google.com/intl/zh-TW/events/io/2010/map/" target="_blank">Google I/O 2010 提供的會場地圖</a>的方式而製作出來，使用自己繪製的平面圖疊加在原本的衛星圖資之上，它的顯示效果如下所示：<br />
<a href="http://lh6.ggpht.com/_hNy_9UI1_R8/TFgy4Y9s5FI/AAAAAAAARJA/rnLVWyRaBWo/s800/imagemap_01.png"><img src="http://lh6.ggpht.com/_hNy_9UI1_R8/TFgy4Y9s5FI/AAAAAAAARJA/rnLVWyRaBWo/s288/imagemap_01.png" alt=""></a> <a href="http://lh3.ggpht.com/_hNy_9UI1_R8/TFgy4WrhaoI/AAAAAAAARJE/qo7NFWGHmB0/s800/imagemap_02.png"><img src="http://lh3.ggpht.com/_hNy_9UI1_R8/TFgy4WrhaoI/AAAAAAAARJE/qo7NFWGHmB0/s288/imagemap_02.png" alt=""></a></p>
<p>如果你曾經有注意過 Google 與電影「赤壁」合作過的<a href="http://www.google.com.tw/redcliff" target="_blank">活動網頁</a>，你會發現其中有一個呈現赤壁古戰場風貌的<a href="http://maps.google.com.tw/maps/mpl?moduleurl=http://redcliff.googlecode.com/svn/trunk/mapplet/redcliff_tc.xml&#038;t=p&#038;utm_campaign=zh_TW&#038;utm_medium=lp&#038;utm_source=zh_TW-lp-apac-tw-gns-mp&#038;utm_term=redc" target="_blank">地圖小工具</a>（Mapplet），而它也是利用了 <em>ImageMapType</em> 的方式將古地圖貼上去。若是你也有類似的開發需求，不必抓破頭煩惱怎麼把自己的圖片疊上去而寫出複雜的 JavaScript 程式碼，只需要利用 Google Maps JavaScript API v3 中的 <a href="http://code.google.com/apis/maps/documentation/javascript/maptypes.html#ImageMapTypes" target="_blank">ImageMapType</a> 部份的 API 就可以完成，只不過在實務上該怎麼進行，以及要注意的事項在目前的官方文件並沒有寫得很清楚，這篇文章將會介紹我是如何完成這個效果，以及開發時的心得。</p>
<h4>Google地圖圖資規格</h4>
<p>Google 地圖的圖資是以一堆正方形的 tiles 所組成，每一個 tile 的大小是 256px * 256px（不論縮放，不同縮放大小就是不同的 tile，但大小都是 256px * 256px），而每個 tile 有 <code>z</code>, <code>x</code>, <code>y</code> 三個屬性，z 是表示縮放大小，而 x, y 則是 tile 在全球圖資中的 x, y 座標（與經緯度的值相關，但座標系統不一樣）。以中研院人文資訊大樓為例，若在縮放等級18時，圖資的 tiles 是這樣排列的：</p>
<p><img src="http://lh3.ggpht.com/_hNy_9UI1_R8/TFg8BDymt1I/AAAAAAAARJQ/6S0Y7M3VtMM/s800/tiles_grid.png" alt=""></p>
<p>這個示意圖我以紅線作為 tiles 的分界（只是畫個大概，不用真的去量是不是 256px * 256px），而淺藍色的座標數字則表示該 tile 的z, x 及 y 值。如果你要利用 Google Maps API 中的 ImageMap Overlay 來疊上自己的圖片，你必須「做出覆蓋原先 tiles 的 tiles」才能蓋上去，也就是在這個縮放等級之下，我至少要自行製作兩個 tiles 才能把目標物給覆蓋住，最後的成果便是這兩張圖（僅3樓的部份，注意空白的部份其實是<em>透明</em>的）：</p>
<p><img src="http://commondatastorage.googleapis.com/conference-app-assets/coscup10/tiles/t_18_3_219626_112227.png" alt="" style="border:1px solid #ccc"> <img src="http://commondatastorage.googleapis.com/conference-app-assets/coscup10/tiles/t_18_3_219626_112228.png" style="border:1px solid #ccc"></p>
<p>為了方便起見，我將這兩張圖的檔案名稱根據 Google Maps 圖資的座標來命名為「<strong>t_18_219626_112227.png</strong>」及「<strong>t_18_219626_112228.png</strong>」，數字分別對應到 z, x, 及 y，至於為什麼要這樣做，接下來就要介紹 ImageMap Overlay 的使用作法。</p>
<h4>使用ImageMapType API</h4>
<p>API的詳細使用方法可以參考 Google Maps API 的文件，我這裡大概說明一下程式碼大概需要怎麼寫。在你建立好一個 mapInstance 後，使用 ImageMap 的程式嗎如下：</p>
<blockquote><p><pre><code>
// ImageMap Overlay 的選項
var imgMapTypeOpt = {
 ‘getTileUrl’: function(coord, zoom) {
&nbsp;&nbsp; var url = [‘http://tiles.example.com/t_’, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zoom, ‘_’, coord.x, ‘_’, coord.y, ‘.png’].join(‘’);
&nbsp;&nbsp; return url;
 },
 ‘isPng’: true
};
// 建立 ImageMap Overlay type
var imgOverlay = new google.maps.ImageMapType(imgMapTypeOpt);
// 疊在 Map 上，mapInst 是前面建立地圖時 new google.maps.Map 的物件
mapInst.overlayMapTypes.insertAt(0, imgOverlay);
</code></pre></p></blockquote>
<p>一旦在 map 上加上 <strong>ImageMapType</strong> 之後，當 Google Maps API 把原本的該顯示的圖資（也就是你看得到的範圍）顯示完畢後，接著會根據每一塊顯示出來的 tile<em>（注意這段話，等一下會發生問題）</em>，藉著你提供的 <code>getTileUrl</code> 這個 callback function 來找出期望疊加在原有 tile 上的圖片，也就是說，當 Google Maps API 在顯示 <code>(18, 219626, 112227)</code> 這塊 tile 時，根據這段程式碼的設計，它會試著去讀取 <strong>http://tiles.example.com/t_18_219626_112227.png</strong> 這張圖片，因為它在呼叫 <code>getTileUrl</code> 這個 callback function 時就得到了這個回傳值，這就是上面提到，為什麼把圖片的檔名對應到座標，如此一來才方便你寫 callback function。這樣一來，Google Maps API 只要讀取到對應座標的圖片，就會自動疊加上去了。</p>
<h4>產生的問題以及解決方案</h4>
<p>假設你已讀懂上一段的敘述，接下來就會產生幾個問題：</p>
<ol>
<li>Maps API 會依照「可視範圍」來尋找 image overlay 的位置，這在大多數的狀況是完全沒有必要的。因為以我做中研院大樓的例子而言，在縮放等級18時我只需要疊加兩張 tiles ，但是我的可視範圍可能是好多塊 tiles，這就多花了很多時間在讀取空的資料（例如從檔案伺服器那裡要到了一堆 404 的回應），除了發出了沒必要的 http requests 之外（也暴力地打你的檔案伺服器），因為這個 API 是在 client 端執行的，也會拖慢 client 端瀏覽器的效能。
<p>所幸當 <code>getTileUrl</code> 的回傳值若為空字串時，Maps API 就會判斷該座標不需要去抓圖，所以只要輕鬆設定一個座標範圍的檢查就可以解決發出過多 requests 的問題，像是這樣：</p>
<blockquote><p><pre><code>
getTileUrl: function(coord, zoom) {
 ....
 if (coord.x &lt; BOUND.west || coord.x &gt; BOUND.east ||
&nbsp;&nbsp;&nbsp;&nbsp; coord.y &lt; BOUND.north || coord.y &gt; BOUND.south) {
&nbsp;&nbsp;&nbsp;&nbsp;return “”;
&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;return url;
&nbsp;&nbsp;}
}
</code></pre></p></blockquote>
<p>這樣的簡單的判斷法雖然不保證 100% 避免浪費的 requests，但至少已經縮減了很多 trivial 的不必要，若是你的 image 分佈得不是很均勻，可就要好好複習一下幾何演算法，有效地判斷什麼時候才該回傳圖檔、什麼時候回傳空字串。</li>
<li>在上面的例子中，我只示範了在縮放等級18的顯示效果，事實上我做了縮放等級17, 18及19的效果，所以我必須依照不同縮放等級而準備不同的 tiles（實際數據是，單以3樓為例，z=17 有2張，z=18有2張，z=19有5張，所以兩層樓都做下去就要準備18張圖），既然我已經確定我只做這三個縮放層級，那我可以在 imageMapTypeOpt 選項中加入兩個屬性，用來限制 maps api 不要在其它縮放層級還去呼叫 getTileUrl：<br />
<blockquote><p><pre><code>var imgMapTypeOpt = {
 ....
&nbsp;&nbsp;minZoom: 17,
&nbsp;&nbsp;maxZoom: 19
};</code></pre></p></blockquote>
</li>
<li>另外就是我雖然切換了兩層樓，但在地球上這兩層樓是同一個經緯度座標呀（廢話！）！所以對應到的 Google Maps 圖資 tiles 也是一樣，這裡就要在另外從檔名及 JavaScript 來下手，細節我就不贅述了，不過重點是：如果要更換 ImageMapType 的話，記得要先將原本的疊加層先移除，然後再加入新的才行（產生過的 imageMapType 記得存下來，不要每次都 new 新的）：<br />
<blockquote><p><pre><code>
if (mapInst.overlayMapTypes.length != 0) {
 mapInst.overlayMapTypes.removeAt(0);
}
// 這裡再加另一個 imageMapType
</code></pre></p></blockquote>
</li>
<li>到現在我們都瞭解 Google 圖資的 tiles 有座標了，那我要怎麼知道它的座標到底是啥啊！而且又要怎麼知道到底 Google 圖資的 tiles 是怎麼切割的？身為一個網頁前端工程師，我不相信你不會使用 Firefox + firebug 或是 Chrome + devtools 來「分析」一個頁面在載入的過程中到底讀取了什麼東西&#8230;&#8230;..嗯，剩下的就看你是不是一個合格的前端工程師囉 :P</li>
</ol>
<h4>結論</h4>
<p>經過我這樣隨意地解釋之後，想必你也瞭解使用 ImageMapType 並不會要寫多麼複雜的程式，因為所有的苦工都是在處理圖片、對準 tiles 啊！ XD 如果你本身就很熟悉影像工具的話應該會減輕這方面的負擔。</p>
<p>最後希望大家若是有使用 Google Maps API 介接圖資的用途時，不妨考慮做出更多具有自己風格的 ImageMap Overlay 吧！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1414/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Android App Inventor 使用體驗</title>
		<link>http://blog.ericsk.org/archives/1413</link>
		<comments>http://blog.ericsk.org/archives/1413#comments</comments>
		<pubDate>Tue, 20 Jul 2010 03:34:23 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[app inventor]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1413</guid>
		<description><![CDATA[不太會寫程式，但又很想開發 Android 應用程式？那可以試試 Android App Inventor。 前幾天 Google 發表了 Android App Inventor 這樣的 web application，旨在讓想開發 Android app 的人可以有這樣的工具來達到目的，而且未來 Google 也打算與學校合作，以此工具做為開發 android app 的入門。 目前這個 web application 還需要等候邀請才能使用，不過筆者有幸在今日得到使用的機會，所以簡單地向各位介紹一下 app inventor 是怎樣的東西。 在使用前，必須先到這裡學習怎麼使用，並且安裝軟體讓這個 webapp 能夠連接到你的手機。在進入 app inventor 後，首先進入的第一個畫面如下所示－－一個很簡單的 project list，你可以在這裡新增 projects： App Inventor 的 Project List view 而建立 project 之後，開發畫面就如同大家在各報導中看到的一樣，是一個很標準的 visual design 工具－－左側欄是 widgets 列表，可以拖拉到中間的手機畫面，而右側則是調整 widget 屬性的區域： [...]]]></description>
			<content:encoded><![CDATA[<p>不太會寫程式，但又很想開發 Android 應用程式？那可以試試 <a href="http://appinventor.googlelabs.com/">Android App Inventor</a>。</p>
<p>前幾天 Google 發表了 <a href="http://appinventor.googlelabs.com/" target="_blank">Android App Inventor</a> 這樣的 web application，旨在讓想開發 Android app 的人可以有這樣的工具來達到目的，而且未來 Google 也打算與學校合作，以此工具做為開發 android app 的入門。</p>
<p>目前這個 web application 還需要等候邀請才能使用，不過筆者有幸在今日得到使用的機會，所以簡單地向各位介紹一下 app inventor 是怎樣的東西。</p>
<p>在使用前，必須先到<a href="http://appinventor.googlelabs.com/learn/" target="_blank">這裡</a>學習怎麼使用，並且安裝軟體讓這個 webapp 能夠連接到你的手機。在進入 app inventor 後，首先進入的第一個畫面如下所示－－一個很簡單的 project list，你可以在這裡新增 projects：</p>
<div style="text-align:center"><img src="http://farm5.static.flickr.com/4134/4811094246_4c03724582.jpg" alt="" width="500" height="380" style="border: 1px solid #999; padding: 2px"/><br/><small>App Inventor 的 Project List view</small></div>
<p>而建立 project 之後，開發畫面就如同大家在各報導中看到的一樣，是一個很標準的 visual design 工具－－左側欄是 widgets 列表，可以拖拉到中間的手機畫面，而右側則是調整 widget 屬性的區域：</p>
<div style="text-align:center"><img src="http://farm5.static.flickr.com/4121/4811130464_610df77048.jpg" alt="" width="500" height="389" style="border: 1px solid #999;padding:2px"/><br/><small>App Inventor 的 project 主畫面</small></div>
<p>比方像是這樣：拉了一個 button 到畫面之後，在右側去修改它的屬性：</p>
<div style="text-align:center"><img src="http://farm5.static.flickr.com/4135/4810530741_da27f320dc.jpg" alt="" width="500" height="401" style="border:1px solid #999;padding:2px"/><br/><small>設計 app 中的 widget</small></div>
<p>而拉出一個按鈕後，自然會想要去設計它被按下後的動作，此時可以按下右上角的「Open Block Editor」的按鈕，接著會提示你要透過 Java Web Start 啟動一個 java app（當然就是這個 block editor）：</p>
<div style="text-align:center"><img src="http://farm5.static.flickr.com/4097/4811166196_acbe8982c7.jpg" alt="" width="500" height="439" style="border:1px solid #999;padding:2px"/><br/><small>Block Editor 是一個 Java app</small></div>
<p>在 Block Editor 中就可以針對 widget 來處理各種事件所要觸發的動作：</p>
<div style="text-align:center"><img src="http://farm5.static.flickr.com/4134/4811197272_aabc8d2f71.jpg" alt="" width="500" height="362" style="border:1px solid #999;padding:2px"/><br/><small>處理 Button1 的各種事件</small></div>
<p>就像是拼拼圖一樣地作設計，我這裡示範的是：在按鈕被按下後，將下面的文字框中設定「Clicked」的字樣，你只需要設計 app 的運作邏輯，在寫這樣簡單的程式時，幾乎不用寫到一行程式碼：</p>
<div style="text-align:center"><img src="http://farm5.static.flickr.com/4138/4810595657_66edd4b7fd.jpg" alt="" width="500" height="362" style="border:1px solid #999;padding:2px"/><br/><small>拼拼圖</small></div>
<p>接下來當然是可以將這樣的 app 下載到電腦上，或是已經連結好的手機上。</p>
<h4>感想</h4>
<p>App Inventor 是還蠻有趣的東西，設計出來的 app 也真的可以裝到手機上，不過當然它還不容易寫出高品質、很複雜的 app，但這樣的概念至少有機會讓很多人躍躍欲試，體驗一下開發手機應用程式的感覺。而在使用上來看，目前還必須連結一個 Java App 是有點麻煩，使用上就少了流暢感。畢竟目前還是放在 Google Labs 下，說不定之後「畢業」時有更順暢的使用體驗，只好再慢慢期待它的改進囉。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1413/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>淺談HTML5中的 Application Cache</title>
		<link>http://blog.ericsk.org/archives/1412</link>
		<comments>http://blog.ericsk.org/archives/1412#comments</comments>
		<pubDate>Thu, 15 Jul 2010 02:17:22 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[offline web application]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1412</guid>
		<description><![CDATA[用了 application cache 之後，平時可以加快網站載入的速度，離線時還可以繼續使用。 HTML5 中有一個「Offline Web Application」的規格，簡單來說，就是你可以告訴瀏覽器 「哪些東西請 cache 在你那裡，哪些東西一定得上網路抓，在沒有網路連線時應該使用哪一個 html 檔案來開啟」。 而你需要做的，只是準備一個檔案提供這些資料，當（支援這個規格的）瀏覽器讀取時便會自動 cache 住該 cache 的檔案。 假設有一個這樣的 html 檔案（sample.html）： &#60;!DOCTYPE html&#62; &#60;html&#62; &#160;&#160;&#60;head&#62; &#160;&#160;&#160;&#160;&#60;meta charset=&#34;UTF-8&#34;&#62; &#160;&#160;&#160;&#160;&#60;title&#62;測試&#60;/title&#62; &#160;&#160;&#160;&#160;&#60;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;sample.css&#34;&#62; &#160;&#160;&#60;/head&#62; &#160;&#160;&#60;body&#62; &#160;&#160;&#160;&#160;&#60;img src=&#34;http://example.com/path/to/file.jpg&#34; alt=&#34;&#34;&#62; &#160;&#160;&#160;&#160;&#60;script src=&#34;sample.js&#34;&#62;&#60;/script&#62; &#160;&#160;&#60;/body&#62; &#60;/html&#62; 這個網頁（或者說是 web application）需要 sample.html、 sample.css、sample.js 檔案以及 http://example.com/path/to/file.jpg 這個圖檔才能運作，那麼可以利用 HTML5 application cache 的機制將前三個檔案 cache 在 [...]]]></description>
			<content:encoded><![CDATA[<p>用了 <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html" target="_blank">application cache</a> 之後，平時可以加快網站載入的速度，離線時還可以繼續使用。</p>
<p>HTML5 中有一個「Offline Web Application」的規格，簡單來說，就是你可以告訴瀏覽器</p>
<blockquote><p>「哪些東西請 cache 在你那裡，哪些東西一定得上網路抓，在沒有網路連線時應該使用哪一個 html 檔案來開啟」。</p></blockquote>
<p>而你需要做的，只是準備一個檔案提供這些資料，當（支援這個規格的）瀏覽器讀取時便會自動 cache 住該 cache 的檔案。</p>
<p>假設有一個這樣的 html 檔案（<code>sample.html</code>）：</p>
<blockquote><p><pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&nbsp;&nbsp;&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta charset=&quot;UTF-8&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;測試&lt;/title&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;sample.css&quot;&gt;
&nbsp;&nbsp;&lt;/head&gt;
&nbsp;&nbsp;&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;img src=&quot;http://example.com/path/to/file.jpg&quot; alt=&quot;&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script src=&quot;sample.js&quot;&gt;&lt;/script&gt;
&nbsp;&nbsp;&lt;/body&gt;
&lt;/html&gt;</code></pre></p></blockquote>
<p>這個網頁（或者說是 web application）需要 <code>sample.html</code>、 <code>sample.css</code>、<code>sample.js</code> 檔案以及 <code>http://example.com/path/to/file.jpg</code> 這個圖檔才能運作，那麼可以利用 HTML5 application cache 的機制將前三個檔案 cache 在 local 端，只有圖檔是上網抓，這樣可以大大減少瀏覽器的 request 數目。</p>
<p>所以根據規格，你可以準備一個 sample.manifest 檔案，內容如下：</p>
<blockquote><p><pre><code>CACHE MANIFEST
sample.html
sample.css
sample.js
NETWORK:
*</code></pre></p></blockquote>
<p>這個檔案在 server 上必須要以 <code>text/cache-manifest</code> 的 MIME type 送出，而為了讓瀏覽器知道有這個檔案，則加在 <code>&lt;html&gt;</code> 標籤中：</p>
<blockquote><p><pre><code>&lt;!DOCTYPE html&gt;
&lt;html manifest=&quot;sample.manifest&quot;&gt;
...</code></pre></p></blockquote>
<p>如此一來（支援此規格的）瀏覽器便知道要去下載 <code>sample.manifest</code> 來看看要 cache 什麼檔案，所以之後瀏覽器就知道遇到這些檔案可以直接從 local 端拿，不必再到 server 端讀取，除了離線支援之外，就有是有連線的狀況也可以省下不少網路傳輸（讀取）的時間。</p>
<p>關於 manifest 檔案中的語法，建議參考規格書的內容（因為都還在 draft）。</p>
<p>當然，有 cache 就會有 cache invalidate 的問題，也就是當被 cache 住的檔案有更新的時候，要怎麼讓瀏覽器知道呢？你可以利用 JavaScript 操作 <code>window.applicationCache</code> 這個物件來瞭解 cache 的狀況，除了可以利用 <code>applicationCache.status</code> 取得 cache 的狀態之外，也可以手動透過 <code>applicationCache.update()</code> 來進行更新的動作。此外，在操作 cache 時可以檢查 <code>navigator.onLine</code> 的值來確定瀏覽器目前是否有網路連線。</p>
<h4>實例參考</h4>
<p>如果你有使用 iPhone/Android 手機連上 Google 的行動版網站，你可以發現只要你曾經連過那些網站，下一次在瀏覽器開啟時，畫面很快就出現了，其餘可能需要網路連線（檢查你的位置、讀取遠端資料庫等等）的部份是稍候才會開始動作。這就是利用 application cache 讓你的手機先將畫面的部份 cache 起來，所以不但開啟時很快就可以讀出畫面，就算手機在沒有網路連線的狀態下，還是可以看到畫面。試想一下，手機的連線、傳輸都較有線網路慢上許多，有這樣的 cache 機制可以讓你的 (mobile) web application 更加 responsive，而若是搭配 local storage 或是 local database 那就有更完整的離線支援（如：Gmail 行動版）了。</p>
<h4>References</h4>
<ul>
<li><a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html" target="_blank">Offline Web applications</a></li>
<li><a href="http://www.ibm.com/developerworks/xml/library/x-html5mobile3/" target="_blank">Creating mobile Web applications with HTML 5, Part 3: Make mobile Web applications work offline with HTML 5</a></li>
<li><a href="http://googlecode.blogspot.com/2009/04/gmail-for-mobile-html5-series-using.html" target="_blank">Gmail for mobile HTML5 Series: Using AppCache to Launch Offline &#8211; Part 1</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1412/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>淺談 CSS3 Flexible Box Layout</title>
		<link>http://blog.ericsk.org/archives/1410</link>
		<comments>http://blog.ericsk.org/archives/1410#comments</comments>
		<pubDate>Tue, 06 Jul 2010 04:22:00 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[css3 flexbox]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[webkit]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1410</guid>
		<description><![CDATA[希望有機會成為「淺談 CSS3」系列文章。 要在 HTML 中做排版（layout）一直是前端工程中的一件苦差事，最初人們都是使用 &#60;table&#62; 元素作為排版的輔助工具，甚至許多 WYSIWYG 編輯器、GWT 等工具也都是這麼做，可是利用這種方式作排版，除了彈性不高之外，也容易堆疊出過份冗長的 HTML 碼，後來前端工程師、設計師們開始瞭解可以利用 CSS 中的 float, inline-block 等屬性來完成排版的需要。然而，伴隨而來的卻是更不直覺的程式碼，而且還要處理更多對齊、水平垂直置中的問題。 CSS3 中的 Flexible Box Layout module 試著制定出更有彈性、更簡單的 layout 方法。直接以一個例子來看，很多網站會做出像這樣的三欄式版面： 當然，就算不使用任何 CSS3 的功能也可以做出像這樣的版面，只是你可能會絞盡腦汁去想到底要怎麼完美搭配 float、position:absolute、margin、clear 以及 &#60;div&#62; 的排列來達到你的效果。但要是我用 CSS3 來做這樣的版面，code 大概會像是這樣（以 WebKit 系的瀏覽器作示範）： [HTML部份] &#60;div id=”container”&#62; &#160;&#160;&#60;div id=”left” class=”sidebar”&#62; ... &#60;/div&#62; &#160;&#160;&#60;div id=”mid”&#62; ... &#60;/div&#62; &#160;&#160;&#60;div id=”right” class=”sidebar”&#62; ... &#60;/div&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>希望有機會成為「淺談 CSS3」系列文章。</p>
<p>要在 HTML 中做排版（layout）一直是前端工程中的一件苦差事，最初人們都是使用 <code>&lt;table&gt;</code> 元素作為排版的輔助工具，甚至許多 WYSIWYG 編輯器、GWT 等工具也都是這麼做，可是利用這種方式作排版，除了彈性不高之外，也容易堆疊出過份冗長的 HTML 碼，後來前端工程師、設計師們開始瞭解可以利用 CSS 中的 <code>float</code>, <code>inline-block</code> 等屬性來完成排版的需要。然而，伴隨而來的卻是更不直覺的程式碼，而且還要處理更多對齊、水平垂直置中的問題。</p>
<p>CSS3 中的 Flexible Box Layout module 試著制定出更有彈性、更簡單的 layout 方法。直接以一個例子來看，很多網站會做出像這樣的三欄式版面：</p>
<div style="text-align:center"><img src="http://lh5.ggpht.com/_hNy_9UI1_R8/TDKt70Mfo5I/AAAAAAAARBQ/MOa2izDx7o0/s288/3col.png" alt="" style="border:1px solid #999;padding:2px"/></div>
<p>當然，就算不使用任何 CSS3 的功能也可以做出像這樣的版面，只是你可能會絞盡腦汁去想到底要怎麼完美搭配 <code>float</code>、<code>position:absolute</code>、<code>margin</code>、<code>clear</code> 以及 <code>&lt;div&gt;</code> 的排列來達到你的效果。但要是我用 CSS3 來做這樣的版面，code 大概會像是這樣（以 WebKit 系的瀏覽器作示範）：</p>
<p>[HTML部份]<br />
<blockquote><pre><code>
&lt;div id=”container”&gt;
&nbsp;&nbsp;&lt;div id=”left” class=”sidebar”&gt; ... &lt;/div&gt;
&nbsp;&nbsp;&lt;div id=”mid”&gt; ... &lt;/div&gt;
&nbsp;&nbsp;&lt;div id=”right” class=”sidebar”&gt; ... &lt;/div&gt;
&lt;/div&gt;
</code></pre></p></blockquote>
<p>[CSS 部份]<br />
<blockquote><pre><code>
#container {
&nbsp;&nbsp;...
&nbsp;&nbsp;display: -webkit-box;
&nbsp;&nbsp;-webkit-box-align: stretch;
&nbsp;&nbsp;-webkit-box-orient: horizontal;
}
#mid {
&nbsp;&nbsp;-webkit-box-flex: 1;
}
.sidebar {
&nbsp;&nbsp;...
&nbsp;&nbsp;width: 180px;
}
</code></pre></p></blockquote>
<p>如此一來便能輕鬆、直覺地做出三欄式的版面，可以<a href="http://s.ericsk.org/html5/3col.html" target="_blank">到這裡</a>看一下顯示的效果（記得用 Safari/Chrome 這類 WebKit 系的瀏覽器開啟）。</p>
<p>簡單地解釋一下這個例子，我們在 <strong>#container</strong> 中設定了 <code>-webkit-box-orient</code> 的屬性，瀏覽器便會依照設定的值來排版 <strong>#container</strong> 的子元素（也就是 <strong>#left</strong>, <strong>#mid</strong> 及 <strong>#right</strong>），在此例中由於<strong> #left</strong>, <strong>#mid</strong> 及 <strong>#right</strong> 是以水平方式排列，所以將值設定為 <code>horizontal</code>；而 <code>-webkit-box-align</code> 的屬性則是指定子元素在排列時如何對齊母元素，可以設定 <code>start|end|center|baseline|stretch</code> 等值，這裡設定成 <code>stretch</code> 是為了讓子元素的高度變成與母元素相同（因為 <code>box-orient</code> 是 <code>horinzontal</code>，所以 stretch 會往垂直的方向延伸）。</p>
<p><strong><em>（思考一下：所以水平、垂直置中就簡單多了吧～）</em></strong></p>
<p>至於左右兩個 sidebar 沒就沒什麼特別，只是單純地用 <code>width: 180px</code> 來指定大小而已，有趣的是 <strong>#mid</strong> 中 <code>-webkit-box-flex</code> 屬性，它可以設定<em>該元素在剩餘空間中的佔有比例</em>，預設為<code>0.0</code>（可用浮點數）。在這個例子中，<strong>#left</strong> 及 <strong>#right</strong> 都已經設定了 <code>width: 180px</code>，那若是 <strong>#mid</strong> 設定了 <code>-webkit-box-flex: 1</code>，則表示 <strong>#mid</strong> 會佔有 <strong>#container</strong> 剩餘的空間。如果你覺得這樣的說明很難懂，那下面有個簡單的例子：</p>
<p>[HTML]<br />
<blockquote><pre><code>
&lt;div id=”container”&gt;
&nbsp;&nbsp;&lt;div id=”left”&gt;Left&lt;/div&gt;
&nbsp;&nbsp;&lt;div id=”right”&gt;Right&lt;/div&gt;
&lt;/div&gt;
</code></pre></p></blockquote>
<p>[CSS]<br />
<blockquote><pre><code>
#container 與上述同
#left { -webkit-box-flex: 1 }
#right { -webkit-box-flex: 1}
</code></pre></p></blockquote>
<p>這樣一來，<strong>#left</strong> 及 <strong>#right</strong> 會在 <strong>#container</strong> 下佔有 <strong>1 : 1</strong> 的比例，也就是說這兩個元素會平分 <strong>#container</strong> 的空間。若是將 CSS 的部份改為：</p>
<p>[CSS]<br />
<blockquote><pre><code>
#left { -webkit-box-flex: 1 }
#right { -webkit-box-flex: 2}
</code></pre></p></blockquote>
<p>那佔有比例就會成為 <strong>1:2</strong>，<strong>#left</strong> 佔有 <strong>1/3</strong> 的空間，而 <strong>#right</strong> 則佔有 <strong>2/3</strong>。<code>-webkit-box-flex</code> 的值預設為 <code>0.0</code>，所以若是該 box 沒有指定大小的話，則會依照內容的大小動態決定。</p>
<p>當然，CSS3 的 Flexible Box 還有其它調整排版的屬性及效果，如果有興趣的話則可以參考 W3C 的規格書草案：<a href="http://www.w3.org/TR/css3-flexbox/" target="_blank">[Ref] CSS3: Flexible Box Layout Module</a>。瞭解之後，你是不是能夠利用這個模組隨心所欲地做出你想要的排版呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1410/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何開始寫 Chrome App</title>
		<link>http://blog.ericsk.org/archives/1408</link>
		<comments>http://blog.ericsk.org/archives/1408#comments</comments>
		<pubDate>Mon, 05 Jul 2010 16:46:27 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[chrome os]]></category>
		<category><![CDATA[chromium]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google chrome webstore]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1408</guid>
		<description><![CDATA[Google I/O 2010 的 Day 1 Keynote 中介紹了 Chrome Web Store，顯然這就是（不久的）未來在 Chrome/Chromium/(Chrome OS) 的應用程式平台及 marketplace。 而在這樣的平台之下，使用者便可以在 Chrome （泛指 Google Chrome, Chromium, 以及 Chrome OS）上面安裝「應用程式」，當然，這個應用程式的運作平台就是 Chrome 這個瀏覽器，於是你也可以猜想得到－－應用程式是以 HTML/CSS/JavaScript 所開發的，而隨著 Google 一直宣傳著 HTML5 Rocks ，對於有志於開發「Chrome App」的人來說，當然是選擇 HTML5 再加上 CSS3 作為開發技術囉。（平衡報導一下：只要是目前能在 Chrome 上使用的網頁技術都可以啦，如 Flash、Native Client 都可以，不然怎麼會有植物大戰殭屍、樂高星際大戰呢 :P） Chrome 裝了 Chrome Apps 的開始畫面 在目前的 Chrome dev channel 版本或是 Chromium [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/events/io/2010/" target="_blank">Google I/O 2010</a> 的 Day 1 Keynote 中介紹了 <a href="http://chrome.google.com/webstore" target="_blank">Chrome Web Store</a>，顯然這就是（不久的）未來在 Chrome/Chromium/(Chrome OS) 的應用程式平台及 marketplace。</p>
<p>而在這樣的平台之下，使用者便可以在 Chrome （泛指 Google Chrome, Chromium, 以及 Chrome OS）上面安裝「應用程式」，當然，這個應用程式的運作平台就是 Chrome 這個瀏覽器，於是你也可以猜想得到－－應用程式是以 HTML/CSS/JavaScript 所開發的，而隨著 Google 一直宣傳著 <a href="http://www.html5rocks.com/" target="_blank">HTML5 Rocks</a> ，對於有志於開發「Chrome App」的人來說，當然是選擇 HTML5 再加上 CSS3 作為開發技術囉。（平衡報導一下：只要是目前能在 Chrome 上使用的網頁技術都可以啦，如 Flash、Native Client 都可以，不然怎麼會有植物大戰殭屍、樂高星際大戰呢 :P）</p>
<div style="text-align:center"><img src="http://code.google.com/chrome/apps/images/launcher.png" alt="" style="border:1px solid #999; padding: 2px"/><br /><small>Chrome 裝了 Chrome Apps 的開始畫面</small></div>
<p>在目前的 <a href="http://www.chromium.org/getting-involved/dev-channel#TOC-Subscribing-to-a-channel" target="_blank">Chrome dev channel</a> 版本或是 <a href="http://build.chromium.org/buildbot/snapshots/" target="_blank">Chromium nightly build</a> 都已經開始支援 Chrome App 這個功能，不過還沒有預設開啟，不過可以透過在啟動 Chrome 之前傳入 <code>--enable-apps</code> 的參數來開啟 Chrome App 的支援，以 Mac 版為例，簡單的方法可以在終端機下以這樣的指令來啟動：</p>
<blockquote><p><code>open &#039;/Applications/Google Chrome.app&#039; --args --enable-apps</code></p></blockquote>
<p>在 Windows 上則可以去修改桌面捷徑的內容。</p>
<p>要開發 Chrome App 可以參考這個<a href="http://code.google.com/chrome/apps/" target="_blank">官方文件</a>，但由於目前還算是早期測試，所以文件規格會突然變動，當你哪一天發現自己寫的 Chrome App 不會動的時候，可以來這裡看看，或是到<a href="http://groups.google.com/a/chromium.org/group/chromium-apps/topics" target="_blank">討論區</a>看看有沒有新消息。</p>
<p>至於 Chrome App 的結構，與 Chrome Extensions 的結構幾乎一模一樣（參考：<a href="http://code.google.com/chrome/extensions/getstarted.html" target="_blank">開發文件</a>）－－用一個資料夾將一個 app 裝起來，而裡面至少有一個 <code>manifest.json</code> 檔案，用來描述 app。Chrome 官方以 <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/extensions/maps_app/" target="_blank">Google Maps App</a> 為例，示範了如何將一個原本就是 web application 的網站包裝成一個 Chrome App。</p>
<p>而當你將 Chrome App 寫好了之後，可以就像開發 Chrome extension 那樣，在 <code>chrome://extensions</code> 這一頁，打開「開發人員模式」，再「載入未封裝擴充功能」將這個 app 載入即可。</p>
<div style="text-align:center"><img src="http://lh5.ggpht.com/_hNy_9UI1_R8/TDIJ4kiYbPI/AAAAAAAARAg/Q0VjvQEz86c/s400/chrome-ext.png" alt="" style="border:1px solid #999;padding:2px"/><br /><small>安裝 chrome app 的方式與 chrome ext 一模一樣</small></div>
<p>而 Maps App 安裝好就會像是這樣：</p>
<div style="text-align:center"><img src="http://lh3.ggpht.com/_hNy_9UI1_R8/TDIK3auP63I/AAAAAAAARAo/ppajbUdTkZc/s400/chrome-start.png" alt="" style="border:1px solid #999;padding:2px"/></div>
<p>如果你想將原本的 webapp 包裝成 chrome app 是非常簡單的事，但若是你要開發一個單獨執行（standalone）的 webapp（非網站），那也可以將 <code>manifest.json</code> 中的 <code>app</code> 部份修改像是這樣：</p>
<blockquote><p><pre><code>...
&quot;app&quot;: {
&nbsp;&nbsp;&quot;launch&quot;: {
&nbsp;&nbsp;&nbsp;&nbsp;&quot;local_path&quot;: &quot;main.html&quot;
&nbsp;&nbsp;}
}
...</code></pre></p></blockquote>
<p>以 <code>local_path</code> 來指定 app 啟動的 html 檔案，作為 app 的進入點。這裡有一個從 Chromium 討論區上網友分享的作品－－<a href="http://antimatter15.com/ajaxanimator/webstore.crx" target="_blank">Ajax Animator</a>（需先開啟 chrome app 功能再下載安裝），還蠻有模有樣的（以 ExtJS 所開發的一個 app），也許你可以由這個 app 來發現究竟可以在 chrome 這樣一個應用程式平台玩出什麼樣的可能性。</p>
<p>如果你覺得學習 HTML5, CSS3 （可能為了得支援過時的瀏覽器等等的原因）無法應用在現有的網站產品上，那麼，相信在 Chrome 這個「平台」上，會有很多發揮的空間。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1408/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>關於 CSS3 的視覺效果</title>
		<link>http://blog.ericsk.org/archives/1407</link>
		<comments>http://blog.ericsk.org/archives/1407#comments</comments>
		<pubDate>Mon, 05 Jul 2010 08:29:07 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[tossug]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1407</guid>
		<description><![CDATA[好久沒寫 blog，拿來墊檔一下。 之前在 tossug 的 HTML5 讀書會中負責關於 CSS3 一些視覺效果的部份，以下是我整理一些重點的投影片： 在這則 google wave 中可以看到一些 demo sites。]]></description>
			<content:encoded><![CDATA[<p>好久沒寫 blog，拿來墊檔一下。</p>
<p>之前在 <a href="http://www.tossug.org/" target="_blank">tossug</a> 的 HTML5 讀書會中負責關於 CSS3 一些視覺效果的部份，以下是我整理一些重點的投影片：</p>
<p><iframe src="http://docs.google.com/present/embed?id=ajj7kcj4d635_495f6n8wdfq&#038;size=m" frameborder="0" width="555" height="451"></iframe></p>
<p>在<a href="http://bit.ly/tossug-html5-2" target="_blank">這則</a> google wave 中可以看到一些 demo sites。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1407/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Storage 初試用</title>
		<link>http://blog.ericsk.org/archives/1406</link>
		<comments>http://blog.ericsk.org/archives/1406#comments</comments>
		<pubDate>Wed, 26 May 2010 15:40:59 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[逛逛網站]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google storage]]></category>
		<category><![CDATA[s3]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1406</guid>
		<description><![CDATA[多功能用途的「雲端儲存」服務。（這年頭什麼都要扯上雲端） Google 在今年的 Google I/O 中公佈了 Google Storage，它是一個類似 Amazon S3 的網路檔案儲存的服務，目前還只有 Developer Preview 版本，有參加今年 Google I/O 的人應該申請都通過且能試用了，所以這裡稍微跟各位讀者介紹一下這個服務的概貌。 Google Storage Manager Google Storage 提供了一個網頁的操作介面讓你可以建立 Bucket，然後在 Bucket 中放置目錄、檔案等，Bucket 的命名空間是全球使用者共用的（不是依帳號區別）。每個檔案也可以設定存取權限，讓你可以用來做任何用途。比方說，要與朋友分享檔案，或是用來作為網站、應用程式的「圖床」（透過一個公開的 URL）等。下面這張圖就是我放在 Google Storage 的 png 檔。 如果你是個開發者，也可以使用 GSUtil 這個 command line 工具來操作 Bucket 的建立刪除、檔案的上傳、下載、更改權限等等，或者是利用 GSUtil 中的 boto 這個 python 模組來整合到程式中來使用。真是一般使用者或 geeks 兩相宜。 未來 Google Storage 會依照容量、流量、request 次數等來計費，如果有雲端儲存需求的人，可以自行評估自己的需求來看是否划算。]]></description>
			<content:encoded><![CDATA[<p>多功能用途的「雲端儲存」服務。（這年頭什麼都要扯上雲端）</p>
<p>Google 在今年的 Google I/O 中公佈了 <a href="http://code.google.com/apis/storage" target="_blank">Google Storage</a>，它是一個類似 <a href="http://aws.amazon.com/s3/" target="_blank">Amazon S3</a> 的網路檔案儲存的服務，目前還只有 Developer Preview 版本，有參加今年 Google I/O 的人應該申請都通過且能試用了，所以這裡稍微跟各位讀者介紹一下這個服務的概貌。</p>
<div style="text-align:center"><img src="http://lh6.ggpht.com/_hNy_9UI1_R8/S_0-122Zi6I/AAAAAAAAQwg/j6unBXo49ig/s400/manager.png" alt="" style="border:1px solid #999;padding:2px"/><br/><small>Google Storage Manager</small></div>
<p>Google Storage 提供了一個網頁的操作介面讓你可以建立 Bucket，然後在 Bucket 中放置目錄、檔案等，Bucket 的命名空間是全球使用者共用的（不是依帳號區別）。每個檔案也可以設定存取權限，讓你可以用來做任何用途。比方說，要與朋友分享檔案，或是用來作為網站、應用程式的「圖床」（透過一個公開的 URL）等。下面這張圖就是我放在 Google Storage 的 png 檔。</p>
<p><img src="http://commondatastorage.googleapis.com/taipei-gtug-sandbox/20083-big14.jpg" alt=""/></p>
<p>如果你是個開發者，也可以使用 <a href="http://code.google.com/apis/storage/docs/gsutil.html" target="_blank">GSUtil</a> 這個 command line 工具來操作 Bucket 的建立刪除、檔案的上傳、下載、更改權限等等，或者是利用 GSUtil 中的 boto 這個 python 模組來整合到程式中來使用。真是一般使用者或 geeks 兩相宜。</p>
<p>未來 Google Storage 會依照容量、流量、request 次數等來<a href="http://code.google.com/apis/storage/docs/overview.html#pricing">計費</a>，如果有雲端儲存需求的人，可以自行評估自己的需求來看是否划算。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1406/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Google I/O 2010 之旅速記</title>
		<link>http://blog.ericsk.org/archives/1405</link>
		<comments>http://blog.ericsk.org/archives/1405#comments</comments>
		<pubDate>Mon, 24 May 2010 09:12:36 +0000</pubDate>
		<dc:creator>ericsk</dc:creator>
				<category><![CDATA[資訊科學]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[googleio]]></category>
		<category><![CDATA[io2010]]></category>

		<guid isPermaLink="false">http://blog.ericsk.org/?p=1405</guid>
		<description><![CDATA[很多的第一次，都是因為 Google I/O 而起的 :P 約莫在去年底，Google 放出 Google I/O 2010 的消息，由於是 Taipei GTUG 的 organizer，消息一出來後，就一直被負責 GTUG 事務的 Googlers 「勸進」，而且又有一點門票票價的優惠，就在一股「Try It!」的熱血之下報了名，與 Taipei GTUG 的朋友 gasolin 及 htchien 一同前往 Google I/O 2010。 事實上，這是我第一次去美國、第一次坐那麼長途的飛機、第一次參與全英文的研討會、第一次參加 Google I/O，不知道是不是這麼多第一次所帶來的興奮，讓我完全不受時差的困擾，可以在抵達 San Francisco 的隔天就能到處 sightseeing；可以在回台灣不到12小時內再完成 Google CodeJam 2010 的第一回合參賽。 值得一提的是，San Francisco 感覺很漂亮，差點就要唱首 I Left My Heart in San Francisco 了。 參觀藝術宮 當然要去金門大橋 搭乘 [...]]]></description>
			<content:encoded><![CDATA[<p>很多的第一次，都是因為 Google I/O 而起的 :P</p>
<p>約莫在去年底，Google 放出 <a href="http://code.google.com/io" target="_blank">Google I/O</a> 2010 的消息，由於是 <a href="http://taipei-gtug.org/" target="_blank">Taipei GTUG</a> 的 organizer，消息一出來後，就一直被負責 <a href="http://www.gtugs.org/" target="_blank"><acronym title="Google Technologies User Group">GTUG</acronym></a> 事務的 Googlers 「勸進」，而且又有一點門票票價的優惠，就在一股「Try It!」的熱血之下報了名，與 Taipei GTUG 的朋友 <a href="http://inet6.blogspot.com/" target="_blank">gasolin</a> 及 <a href="http://htchien.blogspot.com/" target="_blank">htchien</a> 一同前往 Google I/O 2010。</p>
<p>事實上，這是我第一次去美國、第一次坐那麼長途的飛機、第一次參與全英文的研討會、第一次參加 Google I/O，不知道是不是這麼多第一次所帶來的興奮，讓我完全不受時差的困擾，可以在抵達 San Francisco 的隔天就能到處 sightseeing；可以在回台灣不到12小時內再完成 <a href="http://code.google.com/codejam" target="_blank">Google CodeJam</a> 2010 的第一回合參賽。</p>
<p>值得一提的是，San Francisco 感覺很漂亮，差點就要唱首 <a href="http://www.youtube.com/watch?v=ryF9p-nqsWw" target="_blank">I Left My Heart in San Francisco</a> 了。</p>
<div style="text-align:center"><img src="http://lh6.ggpht.com/_hNy_9UI1_R8/S_DBlpHLWgI/AAAAAAAAQE4/KfsDIdZqYEA/s400/DSC_0070.jpg" alt="" style="border:1px solid #999;padding:2px"/><br/><small>參觀藝術宮</small></div>
<div style="text-align:center"><img src="http://lh5.ggpht.com/_hNy_9UI1_R8/S_pB3t-MGvI/AAAAAAAAQtI/UWv6e5PHhqk/s400/IMG_3897.jpg" alt=""  style="border:1px solid #999;padding:2px"/><br/><small>當然要去金門大橋</small></div>
<div style="text-align:center"><img src="http://lh6.ggpht.com/_hNy_9UI1_R8/S_TjFiLH6FI/AAAAAAAAQTM/CxFw4jjiXcE/s400/DSC_0224.jpg" alt="" style="border:1px solid #999;padding:2px"/><br/><small>搭乘 Cable Car 亂晃舊金山</small></div>
<p>至於 Google I/O 的 keynote，想看的朋友可以<a href="http://www.youtube.com/GoogleDevelopers" target="_blank">在 YouTube 上觀賞</a>，雖然兩天開場的 keynotes 都可以在 YouTube 上找到，但是第一時間就聽到發表（還有 <a href="http://www.google.com/phone" target="_blank">Google Nexus One</a> 及 <a href="http://now.sprint.com/evo/" target="_blank">HTC Evo 4G</a> 的禮物）、能更深入瞭解 Google 技術的議程（這就沒有 YouTube Live 轉播了）、現場的廠商成果（火力）展示區、認識了一些朋友、以及逛逛一部份美麗的 California（加州），這些都是讓此次旅程值回票價的因素。</p>
<div style="text-align:center"><img src="http://lh3.ggpht.com/_hNy_9UI1_R8/S_Tm_pWYkGI/AAAAAAAAQXU/gn3ui9gEl7Q/s400/DSC_0287.jpg" alt="" style="border:1px solid #999;padding:2px"/><br/><small>搭建中的廠商展示區</small></div>
<div style="text-align:center"><img src="http://lh3.ggpht.com/_hNy_9UI1_R8/S_TqeLWOfVI/AAAAAAAAQbA/zKcwBtF3SRw/s400/DSC_0377.jpg" alt=""  style="border:1px solid #999;padding:2px"/><br/><small>聽議程中，圖中的講者為 Python 之父：<a href="http://neopythonic.blogspot.com/" target="_blank">Guido van Rossum</a></small></div>
<div style="text-align:center"><img src="http://lh4.ggpht.com/_hNy_9UI1_R8/S_TpLYOShkI/AAAAAAAAQaQ/X-zFqKwXvqk/s400/DSC_0362.jpg" alt="" style="border:1px solid #999;padding:2px"/><br/><small>拜見負責全球 GTUGs 事務的 Stephanie</small></div>
<div style="text-align:center"><img src="http://lh4.ggpht.com/_hNy_9UI1_R8/S_Ts7gqhUeI/AAAAAAAAQcY/2byAsvQXejw/s400/DSC_0389.jpg" alt="" style="border:1px solid #999;padding:2px"/><br/><small>Taipei GTUG被標示在 GTUG Lounge 的大地圖上</small></div>
<p>雖然現在還不知道我會不會參加 Google I/O 2011，但是如果你也對於 Google 技術感興趣，又想進行更深入的瞭解，我推薦讀者可以認真考慮參加看看，一定會很有收穫的（但我不知道會不會又那麼大手筆送禮物了 XD）。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ericsk.org/archives/1405/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
