<?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>Partner Studio</title>
	<atom:link href="http://patw.idv.tw/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://patw.idv.tw/blog</link>
	<description>patw 的筆記、生活、隨筆</description>
	<lastBuildDate>Mon, 02 Jan 2012 16:14:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>[攝影] 2011 to 2012 台北101跨年煙火</title>
		<link>http://patw.idv.tw/blog/archives/507?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e6%2594%259d%25e5%25bd%25b1-2011-to-2012-%25e5%258f%25b0%25e5%258c%2597101%25e8%25b7%25a8%25e5%25b9%25b4%25e7%2585%2599%25e7%2581%25ab</link>
		<comments>http://patw.idv.tw/blog/archives/507#comments</comments>
		<pubDate>Mon, 02 Jan 2012 16:14:20 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[攝影]]></category>
		<category><![CDATA[101]]></category>
		<category><![CDATA[煙火]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=507</guid>
		<description><![CDATA[今年也趕流行去拍了台北101的跨年煙火，由於公司就在附近，於是下午就先去公司準備，晚上跟同事 Clerk 一同去拍攝。 去年拍攝的點已變成工地了，今年便在附近再找了另一個不錯的點，一樣在 101 的東北方，不會拍到一堆煙。 &#160; 覺得今年的煙火比起去年精采多了，可惜沒什麼高空煙火。 HAPPY NEW YEAR! &#160; 散場仍滿地垃圾，大家要有公德心啊，好歹也丟到垃圾桶，清潔工作人員很辛苦的。 &#160; LOVE 散場人潮很多，所以跟同事 Clerk 去通化街吃了麻辣鴨血，等人潮少了些再回家。 &#160; 說實在，跟同事 Clerk 都一致認為要拍煙火便無法好好靜下心欣賞煙火施放的美景呢，有種一晃眼就到 2012 的感覺 &#8230; 無論如何，祝各位 2012 Happy New Year! 心想事成! &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p>今年也趕流行去拍了台北101的跨年煙火，由於公司就在附近，於是下午就先去公司準備，晚上跟同事 Clerk 一同去拍攝。</p>
<p>去年拍攝的點已變成工地了，今年便在附近再找了另一個不錯的點，一樣在 101 的東北方，不會拍到一堆煙。</p>
<p><img class="alignnone" src="http://farm8.staticflickr.com/7152/6610401767_7b287e4b97.jpg" alt="" width="332" height="500" /></p>
<p><span id="more-507"></span></p>
<p><img class="alignnone" src="http://farm8.staticflickr.com/7163/6610401451_d464bf9c14.jpg" alt="" width="332" height="500" /></p>
<p><img class="alignnone" src="http://farm8.staticflickr.com/7035/6610401287_cc36f2802e.jpg" alt="" width="332" height="500" /></p>
<p><img class="alignnone" src="http://farm8.staticflickr.com/7168/6610401193_e5c8464039.jpg" alt="" width="332" height="500" /></p>
<p><img class="alignnone" src="http://farm8.staticflickr.com/7034/6610403771_89f515ca75.jpg" alt="" width="332" height="500" /></p>
<p><img class="alignnone" src="http://farm8.static.flickr.com/7142/6610400901_a09e38082d.jpg" alt="" width="332" height="500" /></p>
<p>&nbsp;</p>
<p>覺得今年的煙火比起去年精采多了，可惜沒什麼高空煙火。</p>
<p><img class="alignnone" src="http://farm8.static.flickr.com/7170/6610402041_c15790fdd8.jpg" alt="" width="332" height="500" /></p>
<p>HAPPY NEW YEAR!</p>
<p><img class="alignnone" src="http://farm8.static.flickr.com/7171/6610402791_33a23a8eb9.jpg" alt="" width="332" height="500" /></p>
<p>&nbsp;</p>
<p>散場仍滿地垃圾，大家要有公德心啊，好歹也丟到垃圾桶，清潔工作人員很辛苦的。</p>
<p><img class="alignnone" src="http://farm8.static.flickr.com/7154/6610402991_550b262d52.jpg" alt="" width="500" height="332" /></p>
<p>&nbsp;</p>
<p>LOVE</p>
<p><img class="alignnone" src="http://farm8.static.flickr.com/7028/6610403355_f4fa696200.jpg" alt="" width="332" height="500" /></p>
<p>散場人潮很多，所以跟同事 Clerk 去通化街吃了麻辣鴨血，等人潮少了些再回家。</p>
<p><img class="alignnone" src="http://farm8.static.flickr.com/7153/6610403705_a9336fedd3.jpg" alt="" width="500" height="332" /></p>
<p>&nbsp;</p>
<p>說實在，跟同事 Clerk 都一致認為要拍煙火便無法好好靜下心欣賞煙火施放的美景呢，有種一晃眼就到 2012 的感覺 &#8230;</p>
<p>無論如何，祝各位 2012 Happy New Year! 心想事成! <img src='http://patw.idv.tw/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/507/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[攝影] 克難熱血合歡山結霜x星軌之旅 2011/12/22 &#8211; 24</title>
		<link>http://patw.idv.tw/blog/archives/501?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e6%2594%259d%25e5%25bd%25b1-%25e5%2585%258b%25e9%259b%25a3%25e7%2586%25b1%25e8%25a1%2580%25e5%2590%2588%25e6%25ad%25a1%25e5%25b1%25b1%25e7%25b5%2590%25e9%259c%259cx%25e6%2598%259f%25e8%25bb%258c%25e4%25b9%258b%25e6%2597%2585-20111222-24</link>
		<comments>http://patw.idv.tw/blog/archives/501#comments</comments>
		<pubDate>Sun, 25 Dec 2011 13:24:45 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[攝影]]></category>
		<category><![CDATA[旅遊]]></category>
		<category><![CDATA[合歡山]]></category>
		<category><![CDATA[星軌]]></category>
		<category><![CDATA[石門山]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=501</guid>
		<description><![CDATA[跟前同事阿泰兩人於 2011 年末 12/22 &#8211; 24 的克難熱血合歡山結霜x星軌之旅！ 好久沒寫網誌了，到年底了工作開始多了起來，讓人有些煩躁。由於累積的補休假快到期，趁著這週還有些空檔，就規劃了年末的攝影行。 曾經看過石門山這個景點的星軌照，十分嚮往，最近在網上也看到許多人張貼的照片，於是心中就決定是這個點了！揪咖的過程並不容易，大家都忙，最後好不容易找到了也喜愛攝影的前同事阿泰，就決定成行了！ 先貼一張星軌照當開頭吧！ 為何說克難呢？因為我們沒有交通工具，所以一路都是轉搭客運；二來這是第一次去合歡山，事後發現許多準備都不夠齊全，最重要的就是保暖工作啦 &#8230; XD 本次大略行程： Day 1 04:16 板橋車站 和欣客運 06:00 台中車站休息吃早餐 08:00 豐原客運（台中-梨山） 至 合歡山 12:30 合歡山 松雪樓 Check in &#38; 吃泡麵 15:00 入住沒暖氣的滑雪山莊 16:00 嘗試人生第一座百岳 &#8211; 石門山(3237m) 17:00 夜晚起大霧 20:00 用完餐依然是大霧，早點睡 Day 2 01:00 睡飽了 手機上網配泡麵 10:00 爬武嶺 結霜 14:00 洗澡 20:00 用完餐 霧氣消散&#8230;]]></description>
			<content:encoded><![CDATA[<p><strong>跟前同事阿泰兩人於 2011 年末 12/22 &#8211; 24 的克難熱血合歡山結霜x星軌之旅！</strong></p>
<p>好久沒寫網誌了，到年底了工作開始多了起來，讓人有些煩躁。由於累積的補休假快到期，趁著這週還有些空檔，就規劃了年末的攝影行。<br />
曾經看過石門山這個景點的星軌照，十分嚮往，最近在網上也看到許多人張貼的照片，於是心中就決定是這個點了！揪咖的過程並不容易，大家都忙，最後好不容易找到了也喜愛攝影的前同事阿泰，就決定成行了！</p>
<p>先貼一張星軌照當開頭吧！</p>
<p><img src="http://farm8.staticflickr.com/7014/6563645115_1e9e002ae1.jpg" alt="" width="500" height="332" /></p>
<p>為何說克難呢？因為我們沒有交通工具，所以一路都是轉搭客運；二來這是第一次去合歡山，事後發現許多準備都不夠齊全，最重要的就是保暖工作啦 &#8230; XD</p>
<p><span id="more-501"></span></p>
<p><strong>本次大略行程：</strong></p>
<p style="padding-left: 30px;"><strong>Day 1</strong></p>
<p style="padding-left: 30px;">04:16 板橋車站 和欣客運<br />
06:00 台中車站休息吃早餐<br />
08:00 豐原客運（台中-梨山） 至 合歡山<br />
12:30 合歡山 松雪樓 Check in &amp; 吃泡麵<br />
15:00 入住沒暖氣的滑雪山莊<br />
16:00 嘗試人生第一座百岳 &#8211; 石門山(3237m)<br />
17:00 夜晚起大霧<br />
20:00 用完餐依然是大霧，早點睡</p>
<p style="padding-left: 30px;"><strong>Day 2</strong><br />
01:00 睡飽了 手機上網配泡麵<br />
10:00 爬武嶺 結霜<br />
14:00 洗澡<br />
20:00 用完餐 霧氣消散 前往石門山拍星軌&amp;星空<br />
23:00 在零下 5.5 度三小時的拍攝結束 好冷！ 滑雪山莊停水了！</p>
<p style="padding-left: 30px;"><strong>Day 3</strong><br />
04:50 門口拍星軌<br />
06:00 出太陽了 但仍然滿地冰霜 很冷的陽光<br />
09:15 豐原客運 前往埔里<br />
12:00 埔里轉搭國光客運 返回台北</p>
<p><strong>本次裝備：</strong></p>
<ul>
<li>攝影類：
<ul>
<li>Nikon D90</li>
<li>EN-EL3e 原廠電池 x2 &amp; 充電器</li>
<li>Nikon 原廠快門線</li>
<li>永諾電子快門線</li>
<li>主腳架 Manfrotto 7302YB</li>
<li>副腳架 Velbon 43DL</li>
<li>Tokina 12-24 II</li>
<li>Nikon 18-105 &amp; Nikon 35 1.8 （但事實上最後都沒用上 <img src='http://patw.idv.tw/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  沒心力換鏡頭）</li>
<li>黑卡</li>
<li>Nikon FM10</li>
<li>傳統快門線</li>
<li>軟片 Kodak E100VS</li>
<li>CREE LED 18650 手電筒</li>
<li>KATA 3N1-22 攝影包</li>
</ul>
</li>
<li>保暖類：（事後發現明顯不足啊&#8230;）
<ul>
<li>SNOW TRAVEL AR-55 遮耳帽</li>
<li>SNOW TRAVEL WINDBLOC 防風保暖半指兩用手套</li>
<li>Uniqlo 發熱內衣</li>
<li>Uniqlo 發熱圍巾</li>
<li>Uniqlo 發熱長襪</li>
<li>3M 口罩</li>
<li>CAT 工作靴</li>
<li>滑雪用羽絨衣</li>
<li>暖暖包若干</li>
</ul>
</li>
</ul>
<p><a href="http://www.flickr.com/photos/patw/sets/72157628548570033/" target="_blank">這次的 Flickr 攝影集</a></p>
<p>前一晚在阿泰家集合，討論行程，小憩後便搭計程車前往板橋車站，轉搭和欣客運前往台中。</p>
<p>比預計的時間早抵達台中，但尋找豐原客運卻花了不少時間，地址是：台中市中區建國路113號。找到地址卻是間店家，並不是車站啊，原來要在往停車場走，<a href="http://maps.google.com.tw/maps?q=%E5%8F%B0%E4%B8%AD%E5%B8%82%E4%B8%AD%E5%8D%80%E5%BB%BA%E5%9C%8B%E8%B7%AF113%E8%99%9F&amp;hl=zh-TW&amp;ie=UTF8&amp;ll=24.136679,120.683988&amp;spn=0.00844,0.016512&amp;sll=24.136891,120.684054&amp;layer=c&amp;cbp=13,303.07,,0,2&amp;cbll=24.136643,120.683899&amp;gl=tw&amp;brcurrent=3,0x34693d12d30c4a9d:0x4f4b05370a88b42d,0,0x346917dff97922ef:0x87523ee47ea6447f&amp;hnear=400%E5%8F%B0%E4%B8%AD%E5%B8%82%E4%B8%AD%E5%8D%80%E5%BB%BA%E5%9C%8B%E8%B7%AF113%E8%99%9F&amp;t=m&amp;z=17&amp;vpsrc=0&amp;panoid=mdFwo5uGV-y10EwPivP67Q" target="_blank">Google Maps 的街道檢視在這</a>，下次就知道了。</p>
<p>聽說合歡山上買不到泡麵與飲料，於是在 7-11 吃早餐的同時就順便補貨。（泡麵若干、飲水、巧克力）</p>
<p>豐原客運（台中-梨山）是台小巴士，這個路線一天僅有一班，台中 08:00 發車，錯過就沒有了，這也是我們找到比較合用的無車族上合歡山方式。司機大哥一路上都會找地方停下讓乘客休息，上廁所、買午餐，所以其實午餐在這解決就好。</p>
<p>上山這天的天氣不佳，一路上風雨不斷。司機大哥也挺厲害的，在狹窄的道路上用對講機注意會車的情況（大卡車真的很多），終於在中午 12 時左右抵達合歡山。（於松雪樓站下車）</p>
<p>下車一看 LED 顯示幕，上面寫著 3.5℃，直呼真的好冷！（兩天後發現這還是小 case 哩）</p>
<p>我們訂的住宿地點是滑雪山莊，在松雪樓的下方約莫 15 分鐘腳程處，兩人背著行李好不容易抵達山莊門口，卻發現裏頭黑黑的一個人都沒有，電話聯繫下才發現就算住滑雪山莊，仍要在松雪樓辦理入住手續，於是又拖著行李步履蹣跚的到松雪樓去。</p>
<p>松雪樓裡頭有暖氣，很暖，辦了入住手續。想開包泡麵來吃，卻沒有熱水（飲水機要住宿處才有），拜託櫃台人員才能泡，可大廳不能吃，所以被趕到了最外邊寒冷的門口，坐著導演椅（還好有帶）快速解決&#8230; 只能說真不人性啊，這邊午餐僅有裡頭昂貴餐廳的選擇，只能摸摸鼻子囉。</p>
<p>休息後終於入住滑雪山莊，這裡一晚 1000，若有自備盥洗用具（毛巾、浴巾、牙刷、牙膏）則是 900（聽說前幾年是 700，嘖嘖），包含自助式早餐與晚餐（兩天菜色一樣），有飲水機（可是你得自備杯子＼瓶子，這邊沒辦法買到任何「容器」）、淋浴間（有熱水）、洗手間（無熱水）、通鋪（枕頭、床墊、棉被），但無任何暖氣設施，所以下次若也是冬季，我應該會考慮多加點錢住松雪樓 &#8230; 半夜沒暖氣真的很冷！而且最後一天滑雪山莊還忽然停水，很嘔！</p>
<p>稍做整理後，同住的大哥說要不要一起去爬山，我們便跟著去挑戰人生第一座百岳─石門山（3237m）。</p>
<p><img class="alignnone" title="霧鎖石門山" src="http://farm8.staticflickr.com/7033/6563626501_32208228b0.jpg" alt="" width="500" height="332" /></p>
<p>石門山果然如同網上所說的一樣，是最平易近人的百岳，但這天的霧氣瀰漫、寒風陣陣，爬到一半還險些被吹倒，大約半小時後忽然就攻頂了。</p>
<p><img class="alignnone" title="攻頂" src="http://farm8.staticflickr.com/7156/6563628953_14fda6736f.jpg" alt="" width="500" height="332" /></p>
<p>登山的穿著要注意保暖外，防水更不能少，下山後發現褲腳已濕了一大塊，爬過數座百岳的登山大哥是穿著雨衣雨褲加雨鞋。</p>
<p><img class="alignnone" title="帶我們登山的大哥" src="http://farm8.staticflickr.com/7010/6563628115_43bd8fae9f.jpg" alt="" width="332" height="500" /></p>
<p>山頂上風大到站不穩，胡亂拍個幾張攻頂照（用手機充當高度大字報）跟風景（可是霧很大）後就趕緊下去了，冷到頭很痛！</p>
<p><img class="alignnone" title="石門山風光" src="http://farm8.staticflickr.com/7020/6563630019_fecfd07d3a.jpg" alt="" width="500" height="332" /></p>
<p>第一天都是這種大霧，加上風吹的頭很痛，所以用過晚餐、稍作整理後，晚上八點多便早早入睡了。半夜爬起來用手機上上網，配碗泡麵也是小小的幸福～</p>
<p><img class="alignnone" title="霧氣繚繞" src="http://farm8.staticflickr.com/7001/6563630899_8cc8f11959.jpg" alt="" width="500" height="332" /></p>
<p>第二日，起床一看仍是霧氣瀰漫，加上沒有交通工具，只能選擇附近的點走走，最後決定到武嶺看看。</p>
<p>早上的氣溫是 -1.4℃，雖然低於 0℃，但水氣不足，因此沒有看到降雪。</p>
<p><img class="alignnone" title="阿泰起飛" src="http://farm8.staticflickr.com/7025/6563631849_288c273569.jpg" alt="" width="332" height="500" /></p>
<p>從松雪樓走到武嶺大概是 1 公里的上坡路，走走拍拍後抵達武嶺，這裡又是另一種風景，處處結霜。各家新聞記者皆來此地採訪，壹蘋果的記者甚至拿了爆掉的溫度計報導。</p>
<p><img class="alignnone" title="武嶺結霜" src="http://farm8.staticflickr.com/7017/6563633405_80621416ba.jpg" alt="" width="500" height="332" /></p>
<p>還看到一隻戴著馴鹿角的黃金獵犬，後來有看到牠上新聞喔！</p>
<p><img class="alignnone" title="馴鹿犬" src="http://farm8.staticflickr.com/7173/6563634229_d0325fc6a5.jpg" alt="" width="500" height="332" /></p>
<p>武嶺 3275m</p>
<p><img class="alignnone" title="武嶺" src="http://farm8.staticflickr.com/7172/6563635039_0b8f11f54b.jpg" alt="" width="500" height="332" /></p>
<p>遇到熱血大學生，在武嶺脫衣服拍照</p>
<p><img class="alignnone" title="熱血大學生" src="http://farm8.staticflickr.com/7024/6563636121_81d737ea39.jpg" alt="" width="500" height="332" /></p>
<p>下武嶺，於松雪樓用過午餐（拉麵，250 大洋），返回滑雪山莊洗個舒服的熱水澡後，兩人開始煩惱接著要去哪探險，因為霧越來越濃了，想再去一次石門山也不適合。</p>
<p><img class="alignnone" title="霧太濃" src="http://farm8.staticflickr.com/7155/6563638331_0a9f708e44.jpg" alt="" width="500" height="332" /></p>
<p>於是就在松雪樓的大廳休息，不想折回滑雪山莊了，畢竟這邊才有暖氣啊 &#8230;</p>
<p>就這樣休息到五點多，接著吃松雪樓晚餐 &#8230; 看著窗外的霧氣，心想這次就當作探路之行吧，大概與石門山星軌照無緣了，心中不免有些失落 &#8230;</p>
<p>但老天對我們還是不錯的，吃飽準備返回滑雪山莊、踏出松雪樓後，一看霧氣全都散去，接著抬頭竟發現滿天的星空！真的是好感動的一刻啊！！</p>
<p>十分興奮的我們便趕快回到滑雪山莊整理攝影裝備，八點多便匆匆趕往石門山的停車場，準備開始這次的星軌拍攝囉！</p>
<p>剛到時先將 ISO 拉高，曝了張石門山星空照，真的好漂亮！未曾看到如此多的星星！心中滿滿的感動啊 &#8230;</p>
<p><img class="alignnone" title="石門山星空照" src="http://farm8.staticflickr.com/7175/6563640859_61aee30296.jpg" alt="" width="500" height="332" /></p>
<p>冬季在此處拍攝實在不是件輕鬆的事情，雖說霧氣已散，但溫度卻下降的特快，出門時看到顯示幕上的氣溫是 -5.5℃，在停車場旁又正好是個風口，毫無山壁或草木的遮蔽，風強時甚至吹倒了腳架。</p>
<p>就算穿得厚厚的，待了三小時還是冷到手腳無知覺，必須不斷地跑跑跳跳來保持體溫，為了漂亮的美景照，就是要熱血的拚下去啊～</p>
<p>我們拍著拍著，先遇到了一位開車來的大哥，他也是第一次來到這拍攝，但後來他冷得受不了，叫我們年輕人繼續加油便開車走了 &#8230; 我們必須繼續拚下去！</p>
<p>接著是兩位香港來的朋友開車來了，聽他們說前幾日是在清境，接著就是石門山這了，也是被網上的石門山星軌照吸引來的。這兩位也真厲害，中文還不大輪轉，就遠從香港找到這裡拍攝，真佩服呀！</p>
<p>紀錄一下這次星軌拍攝的數值：</p>
<ul>
<li>Nikon D90 + Tokina 12-24 II，ISO 200、F/4、30mins，懶得一直設定所以就一張到底 <img src='http://patw.idv.tw/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
<li>底片機 Nikon FM10，Kodak E100VS，ISO100，大概曝 1hr，中間曾被風吹倒一次，等底片掃出來再看看成果吧 &#8230; &gt;"&lt;</li>
</ul>
<p>大概五～十分鐘一台車，從大卡車到轎車都有，真的是遮黑卡遮到手軟！有些卡車甚至還停下來會車，此時加上寒風刺骨卻又不能動，心中就是髒話不斷了XD</p>
<p><img class="alignnone" title="石門山星軌" src="http://farm8.staticflickr.com/7153/6563642157_c01a7da1ac.jpg" alt="" width="500" height="332" /></p>
<p><img class="alignnone" title="石門山星軌" src="http://farm8.staticflickr.com/7164/6563643953_c97eedd582.jpg" alt="" width="500" height="332" /></p>
<p><img class="alignnone" title="石門山星軌" src="http://farm8.staticflickr.com/7014/6563645115_1e9e002ae1.jpg" alt="" width="500" height="332" /></p>
<p>這次只拍了三張，因為後期實在太冷，冷到手指無知覺而放進嘴巴裡回溫，再拍個幾張星空照就收拾走人了，下次夏季，我一定還要再來拍攝跟好好欣賞！</p>
<p>星空</p>
<p><img class="alignnone" title="星空" src="http://farm8.staticflickr.com/7164/6563648925_48b6f080a3.jpg" alt="" width="332" height="500" /></p>
<p><img class="alignnone" title="星空" src="http://farm8.staticflickr.com/7159/6563649857_dd281b35f6.jpg" alt="" width="500" height="332" /></p>
<p><img class="alignnone" title="星空" src="http://farm8.staticflickr.com/7151/6563650913_339d9bd9e8.jpg" alt="" width="332" height="500" /></p>
<p>冷到快失溫的我，拍一拍就躲到後面拍星空了，風口超冷！待阿泰也拍攝完畢，告別兩位熱血的香港朋友後，約莫晚間 11 點，兩人便趕快返回山莊休息。</p>
<p>這時候來個熱水澡是最棒的，但沒想到 &#8230; 在淋浴間脫了衣服、打開水龍頭，流了細細的水流後就停‧水‧了！！超冷的為什麼要這樣對我 &#8230;&#8230;</p>
<p>連洗手的水龍頭都停水，真的扯翻了，打去松雪樓櫃台也沒人接，想必是下班了吧 &#8230;</p>
<p>無奈之下也只好穿回衣服，躲進被窩裡直發抖，就這樣昏迷到凌晨兩點多，阿泰又跑去門口曝星軌了，其實門口除了前景不夠漂亮外，也算是可以曝啦。</p>
<p>早晨，本來計畫要拍日出，但兩人由於前一晚的疲憊而睡過頭，醒來時已是 06:30，太陽早就出來了。</p>
<p>一片萬里無雲的藍天，陽光卻也沒有帶來什麼暖意，山莊外頭地上的積水已結冰，好幾隻叫不出名字的小鳥不畏寒冷地飛飛跳跳。</p>
<p><img class="alignnone" title="藍天" src="http://farm8.staticflickr.com/7141/6563652435_5f9fc294a3.jpg" alt="" width="500" height="332" /></p>
<p>前晚問過豐原客運，09:15 下山的車，所以整理行李、吃過早餐就準備要 check out 了。</p>
<p><img class="alignnone" title="好陽光" src="http://farm8.staticflickr.com/7031/6563659221_72de39a6e4.jpg" alt="" width="500" height="332" /></p>
<p>好陽光！</p>
<p><img class="alignnone" title="攝影" src="http://farm8.staticflickr.com/7164/6563660359_055facbaca.jpg" alt="" width="500" height="332" /></p>
<p><img class="alignnone" title="藍天" src="http://farm8.staticflickr.com/7018/6563681947_e1ee46fb8a.jpg" alt="" width="500" height="332" /></p>
<p><img class="alignnone" title=" " src="http://farm8.staticflickr.com/7029/6563689745_c7352d7bcc.jpg" alt="" width="500" height="332" /></p>
<p><img class="alignnone" title=" " src="http://farm8.staticflickr.com/7001/6563687001_5ca575e115.jpg" alt="" width="500" height="332" /></p>
<p><img class="alignnone" src="http://farm8.staticflickr.com/7007/6563675835_4733b18a49.jpg" alt="" width="500" height="332" /></p>
<p>這樣清澈的藍天，在離開前夕，讓人殺了不少記憶卡空間跟底片，倘若早些起來、行程還有一天的話，那該有多好呀～好想看看壯麗的雲海、從山上俯瞰全景 &#8230;</p>
<p>好久沒來一場攝影旅行，此趟合歡山之行，好累、好冷，可是好值得、好感動！這次準備不足的，下次就知道了！</p>
<p>感謝阿泰的陪伴！</p>
<p>下次，還要再來探險！</p>
<p><a href="http://www.flickr.com/photos/patw/sets/72157628548570033/" target="_blank">這次的 Flickr 攝影集</a></p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/501/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[JavaScript] 在 IE 中隱藏/顯示 DIV 中的 Flash 不會重新播放的解法</title>
		<link>http://patw.idv.tw/blog/archives/492?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=javascript-%25e5%259c%25a8-ie-%25e4%25b8%25ad%25e9%259a%25b1%25e8%2597%258f%25e9%25a1%25af%25e7%25a4%25ba-div-%25e4%25b8%25ad%25e7%259a%2584-flash-%25e4%25b8%258d%25e6%259c%2583%25e9%2587%258d%25e6%2596%25b0%25e6%2592%25ad%25e6%2594%25be%25e7%259a%2584%25e8%25a7%25a3%25e6%25b3%2595</link>
		<comments>http://patw.idv.tw/blog/archives/492#comments</comments>
		<pubDate>Wed, 28 Sep 2011 07:30:55 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[網頁設計]]></category>
		<category><![CDATA[display]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[swfobject]]></category>
		<category><![CDATA[隱藏]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=492</guid>
		<description><![CDATA[在某個案件中，需求是點擊 HTML 頁面上的 button 便會以 BlockUI 方式顯示一個包含 SWF 動畫的 DIV 出來，點擊 SWF 上的叉叉可隱藏此 DIV，若使用者再次點擊 HTML button，該 DIV 又會顯示出來並且從頭再播放 SWF 動畫。 在 Chrome 以及 Firefox 上都可以達到上述需求，但到了 IE 上，隱藏 DIV 後再顯示，其中的 SWF 似乎並不會被重新載入，因此會停留在上次播放的最後一格，尚不知這是 IE 對於 Flash 的 Bug 或這才是正常的，經過一番討論跟摸索後試出了解決方法。 ※當然也可以採用 JavaScript 呼叫 SWF 中的重新播放事件來解決，但此次並不是採用此方法解決。 下面是範例原始 HTML（節錄）： 接著，要將使用 SWFObject 嵌入 SWF 播放物件的 JavaScript 寫成一個 Function： 思路大概是這樣的： 開啟：頁面載入後，嵌入 SWF&#8230;]]></description>
			<content:encoded><![CDATA[<p>在某個案件中，需求是點擊 HTML 頁面上的 button 便會以 <a href="http://jquery.malsup.com/block/" target="_blank">BlockUI</a> 方式顯示一個包含 SWF 動畫的 DIV 出來，點擊 SWF 上的叉叉可隱藏此 DIV，若使用者再次點擊 HTML button，該 DIV 又會顯示出來並且從頭再播放 SWF 動畫。</p>
<p>在 Chrome 以及 Firefox 上都可以達到上述需求，但到了 IE 上，隱藏 DIV 後再顯示，其中的 SWF 似乎並不會被重新載入，因此會停留在上次播放的最後一格，尚不知這是 IE 對於 Flash 的 Bug 或這才是正常的，經過一番討論跟摸索後試出了解決方法。</p>
<p>※當然也可以採用 JavaScript 呼叫 SWF 中的重新播放事件來解決，但此次並不是採用此方法解決。</p>
<p><span id="more-492"></span></p>
<p>下面是範例原始 HTML（節錄）：</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot;&gt;
google.load(&quot;jquery&quot;, &quot;1&quot;);
&lt;/script&gt;
&lt;script src=&quot;Scripts/swfobject.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;Scripts/jquery.blockUI.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;style type=&quot;text/css&quot;&gt;
#swf { display:none; }
&lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
      &lt;div id=&quot;swf&quot;&gt;
         &lt;div id=&quot;swfcontent&quot;&gt;&lt;/div&gt;
      &lt;/div&gt;

&lt;a href=&quot;#&quot;&gt;播放動畫&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>接著，要將使用 SWFObject 嵌入 SWF 播放物件的 JavaScript 寫成一個 Function：</p>
<pre class="brush: jscript; title: ; notranslate">
function showSwf() {
	var flashvars = { };
	var params = {};
	params.wmode = &quot;transparent&quot;;
	params.menu = &quot;true&quot;;
        params.quality = &quot;high&quot;;
	var attributes = {id:&quot;FlashID&quot;,name:&quot;FlashID&quot;};

	swfobject.embedSWF(&quot;flash.swf&quot;, &quot;swfcontent&quot;, &quot;698&quot;, &quot;608&quot;, &quot;10.0.0&quot;,&quot;expressInstall.swf&quot;, flashvars, params, attributes);
}
</pre>
<p>思路大概是這樣的：<br />
開啟：頁面載入後，嵌入 SWF 播放物件（CSS 中此物件是隱藏的）到 swf DIV 中，當使用者點擊播放動畫按鈕後，以 BlockUI 方式顯示 swf DIV。<br />
關閉：點擊 SWF 中的關閉按鈕，呼叫關閉 BlockUI 的 Close JavaScript 事件，關閉 swf DIV，此時也移除掉嵌入的 swfobject 播放物件，並再次嵌入（以確保 IE 可以重新播放）。</p>
<p>依此思路，寫出了第一版的解決方案：</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot;&gt;
google.load(&quot;jquery&quot;, &quot;1&quot;);
&lt;/script&gt;
&lt;script src=&quot;Scripts/swfobject.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;Scripts/jquery.blockUI.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
// 嵌入 SWF
function showSwf() {
	var flashvars = { };
	var params = {};
	params.wmode = &quot;transparent&quot;;
	params.menu = &quot;true&quot;;
        params.quality = &quot;high&quot;;
	var attributes = {id:&quot;FlashID&quot;,name:&quot;FlashID&quot;};

	swfobject.embedSWF(&quot;flash.swf&quot;, &quot;swfcontent&quot;, &quot;698&quot;, &quot;608&quot;, &quot;10.0.0&quot;,&quot;expressInstall.swf&quot;, flashvars, params, attributes);
}

// 關閉 Flash
function closeUI(){
    $.unblockUI();

    // 清掉 swf DIV 的內容
    $(&quot;#swf&quot;).html(&quot;&lt;div id='swfcontent'&gt;&lt;/div&gt;&quot;);
    // 再嵌入一次
    showSwf();
}

$(document).ready(function() {
    showSwf();

    $('#clickme').click(function() {
        $.blockUI({ message: $('#swf') });
    });
});
&lt;/script&gt;
&lt;style type=&quot;text/css&quot;&gt;
#swf { display:none; }
&lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
      &lt;div id=&quot;swf&quot;&gt;
         &lt;div id=&quot;swfcontent&quot;&gt;&lt;/div&gt;
      &lt;/div&gt;

&lt;a id=&quot;clickme&quot; href=&quot;#&quot;&gt;播放動畫&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>但是很弔詭的事情，依然發生在 IE 上，在這樣開開關關幾次 DIV 後，有時 SWF 動畫就會卡住不動，但用滑鼠在 SWF 上點幾下，又或是等個幾秒它又自己開始動起來 &#8230;<br />
看起來得針對 IE 特別做處理了。</p>
<p>最後跟同事討論出的最終解決方案 Code 如下：</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot;&gt;
google.load(&quot;jquery&quot;, &quot;1&quot;);
&lt;/script&gt;
&lt;script src=&quot;Scripts/swfobject.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;Scripts/jquery.blockUI.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
// 嵌入 SWF
function showSwf() {
	var flashvars = { };
	var params = {};
	params.wmode = &quot;transparent&quot;;
	params.menu = &quot;true&quot;;
        params.quality = &quot;high&quot;;
	var attributes = {id:&quot;FlashID&quot;,name:&quot;FlashID&quot;};

	swfobject.embedSWF(&quot;flash.swf&quot;, &quot;swfcontent&quot;, &quot;698&quot;, &quot;608&quot;, &quot;10.0.0&quot;,&quot;expressInstall.swf&quot;, flashvars, params, attributes);
}

// 關閉 Flash
function closeUI(){
    $.unblockUI();

    // 判斷 IE，用 swfobject 方法來移除嵌入物件
    if ( $.browser.msie ) {
	swfobject.removeSWF(&quot;FlashID&quot;);

	$(&quot;#swf&quot;).hide();
	$(&quot;#swf&quot;).html(&quot;&lt;div id='swfcontent'&gt;&lt;/div&gt;&quot;);

	var att = { data:&quot;flash.swf&quot;, width:&quot;698&quot;, height:&quot;608&quot; };
	var par = { flashvars:&quot;&quot; };
        var id = &quot;swfcontent&quot;;
        var myObject = swfobject.createSWF(att, par, id);
    } else {
       // 清掉 swf DIV 的內容
       $(&quot;#swf&quot;).html(&quot;&lt;div id='swfcontent'&gt;&lt;/div&gt;&quot;);
       // 再嵌入一次
       showSwf();
    }
}

$(document).ready(function() {
    showSwf();

    $('#clickme').click(function() {
        $.blockUI({ message: $('#swf') });
    });
});
&lt;/script&gt;
&lt;style type=&quot;text/css&quot;&gt;
#swf { display:none; }
&lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
      &lt;div id=&quot;swf&quot;&gt;
         &lt;div id=&quot;swfcontent&quot;&gt;&lt;/div&gt;
      &lt;/div&gt;

&lt;a id=&quot;clickme&quot; href=&quot;#&quot;&gt;播放動畫&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>也許用了笨方法來解決，先記下此次解法，有時間再來研究為什麼會有這些問題吧 Orz</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/492/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在資料夾上以右鍵開啟 Visual Studio 網站專案</title>
		<link>http://patw.idv.tw/blog/archives/480?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%259c%25a8%25e8%25b3%2587%25e6%2596%2599%25e5%25a4%25be%25e4%25b8%258a%25e4%25bb%25a5%25e5%258f%25b3%25e9%258d%25b5%25e9%2596%258b%25e5%2595%259f-visual-studio-%25e7%25b6%25b2%25e7%25ab%2599%25e5%25b0%2588%25e6%25a1%2588</link>
		<comments>http://patw.idv.tw/blog/archives/480#comments</comments>
		<pubDate>Mon, 26 Sep 2011 04:05:11 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[軟體]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=480</guid>
		<description><![CDATA[在 Visual Studio 開啟網站專案時，通常是「開啟 Visual Studio→檔案→開啟網站→選擇網站目錄」這樣繁瑣的步驟來開啟，一直覺得不是很順手，前幾天在網上終於找到了一個不錯的解決方案「一键打开ASP.NET WEB网站项目」（作者：lerit 出处：http://www.cnblogs.com/lerit/ 本文版权归作者和博客园共有，欢迎转载），不過懶人包好像連結失效了，在這邊也擷圖再次介紹一下這個方法。 示範環境：Visual Studio 2008 Standard 第一步： 先開啟 Visual Studio，工具→巨集 IDE 第二步： 在 MyMacros 專案中，新增一個名為 Website 的 Class。接著在 MyMacros 專案中新增參考。 第三步： 選擇「vsWebSite.Interop」加入參考。 第四步： 加入以下程式碼（再次感謝原作者的研究），儲存後編譯即可。 第五步： 將上面內容存檔成 reg 檔案執行，或是下載解壓縮後執行裡面的 reg 檔案。 最後： 您就可在資料夾上按右鍵，快速地開啟網站專案了。 &#8211; 詳細的概念可至原作者 Blog 文章瀏覽。]]></description>
			<content:encoded><![CDATA[<p>在 Visual Studio 開啟網站專案時，通常是「開啟 Visual Studio→檔案→開啟網站→選擇網站目錄」這樣繁瑣的步驟來開啟，一直覺得不是很順手，前幾天在網上終於找到了一個不錯的解決方案「<a href="http://www.cnblogs.com/lerit/archive/2011/02/16/1955729.html" target="_blank">一键打开ASP.NET WEB网站项目</a>」（作者：lerit 出处：http://www.cnblogs.com/lerit/ 本文版权归作者和博客园共有，欢迎转载），不過懶人包好像連結失效了，在這邊也擷圖再次介紹一下這個方法。</p>
<p>示範環境：Visual Studio 2008 Standard</p>
<p><span id="more-480"></span></p>
<p>第一步：<br />
先開啟 Visual Studio，工具→巨集 IDE<br />
<a href="http://patw.idv.tw/blog/wp-content/uploads/2011/09/vs_website01.gif"><img src="http://patw.idv.tw/blog/wp-content/uploads/2011/09/vs_website01-300x173.gif" alt="" title="vs_website01" width="300" height="173" class="alignnone size-medium wp-image-481" /></a></p>
<p>第二步：<br />
在 MyMacros 專案中，新增一個名為 Website 的 Class。接著在 MyMacros 專案中新增參考。<br />
<a href="http://patw.idv.tw/blog/wp-content/uploads/2011/09/vs_website02.gif"><img src="http://patw.idv.tw/blog/wp-content/uploads/2011/09/vs_website02-200x300.gif" alt="" title="vs_website02" width="200" height="300" class="alignnone size-medium wp-image-482" /></a></p>
<p>第三步：<br />
選擇「vsWebSite.Interop」加入參考。<br />
<a href="http://patw.idv.tw/blog/wp-content/uploads/2011/09/vs_website03.gif"><img src="http://patw.idv.tw/blog/wp-content/uploads/2011/09/vs_website03-264x300.gif" alt="" title="vs_website03" width="264" height="300" class="alignnone size-medium wp-image-483" /></a></p>
<p>第四步：<br />
加入以下程式碼（再次感謝原作者的研究），儲存後編譯即可。</p>
<pre class="brush: vb; title: ; notranslate">
Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module Website

    Sub OpenWebsite(Optional ByVal path As String = &quot;&quot;)

        If (String.Compare(path, String.Empty) = 0) Then

            MsgBox(&quot;不可為空白資料夾&quot;, MsgBoxStyle.OkOnly)

        Else

            Dim webPkg As VsWebSite.VSWebPackage

            webPkg = DTE.GetObject(&quot;WebPackage&quot;)

            webPkg.OpenWebSite(path, VsWebSite.OpenWebsiteOptions.OpenWebsiteOption_None, False)

        End If

    End Sub

End Module
</pre>
<p>第五步：</p>
<pre class="brush: plain; title: ; notranslate">
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\OpenVSWeb]
@=&quot;以 Visual Studio 開啟網站專案&quot;
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\OpenVSWeb\command]
@=&quot;devenv /command \\\&quot;Macros.MyMacros.Website.OpenWebsite %1\\\&quot;&quot;
</pre>
<p>將上面內容存檔成 reg 檔案執行，或是<a href="http://patw.idv.tw/files/vs_website.zip">下載</a>解壓縮後執行裡面的 reg 檔案。</p>
<p>最後：<br />
您就可在資料夾上按右鍵，快速地開啟網站專案了。<br />
<a href="http://patw.idv.tw/blog/wp-content/uploads/2011/09/vs_website04.gif"><img src="http://patw.idv.tw/blog/wp-content/uploads/2011/09/vs_website04-300x79.gif" alt="" title="vs_website04" width="300" height="79" class="alignnone size-medium wp-image-484" /></a></p>
<p>&#8211;<br />
詳細的概念可至<a href="http://www.cnblogs.com/lerit/archive/2011/02/16/1955729.html" target="_blank">原作者 Blog 文章瀏覽</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/480/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Facebook] Open Graph（開放社交關係圖） 動作設定教學</title>
		<link>http://patw.idv.tw/blog/archives/473?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=facebook-open-graph-%25e6%2595%2599%25e5%25ad%25b8</link>
		<comments>http://patw.idv.tw/blog/archives/473#comments</comments>
		<pubDate>Fri, 23 Sep 2011 08:20:16 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[Facebook]]></category>
		<category><![CDATA[FB]]></category>
		<category><![CDATA[Open Graph]]></category>
		<category><![CDATA[開放社交關係圖]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=473</guid>
		<description><![CDATA[Facebook 於 2011/09/23 發佈了新的 Open Graph 開發者教學，在應用程式中出現了 Open Graph（開放社交關係圖） 頁籤，項目相當多，因此快速做了簡單的翻譯，方便未來研究之用。 其中此篇便是讓使用者可以使用各種「動作」的新功能，就像除了某某某覺得什麼很「讚」之外，還可以增加 某某某 listen to 某專輯、某某某 cook 一道菜 這樣的動作。 這邊有相關的介紹。 ※不過很可惜的是目前尚不支援中文的動作與物件。 翻譯功力尚淺，請各位前輩不吝指正，也歡迎同好一起討論：） 這份教學將會帶領你照著下面步驟建立、測試、發佈你的第一個 Open Graph 應用程式。我們會建立一個讓使用者發佈料理資訊的範例應用程式。 Step 1: 建立 Facebook app Step 2: 取得使用者的時間軸授權 Step 3: 定義 初始動作、物件與集合 Step 4: 為你的使用者發佈動作 Step 5: 把社群外掛加到你的應用程式中: Facepile plugin, Activity plugin, and Recommendations plugin Step 6: 將動作送交審閱 如果你對 Open Graph 有疑問，請造訪: Debug and Troubleshoot。為了讓你更快上手，我們亦提供了 範例 下載。 Step 1: 建立 Facebook&#8230;]]></description>
			<content:encoded><![CDATA[<p>Facebook 於 2011/09/23 發佈了<a href="developers.facebook.com/docs/beta/opengraph/tutorial/#" target="_blank">新的 Open Graph 開發者教學</a>，在應用程式中出現了 Open Graph（開放社交關係圖） 頁籤，項目相當多，因此快速做了簡單的翻譯，方便未來研究之用。</p>
<p>其中此篇便是讓使用者可以使用各種「動作」的新功能，就像除了某某某覺得什麼很「讚」之外，還可以增加 某某某 listen to 某專輯、某某某 cook 一道菜 這樣的動作。<br />
<a href="http://techorange.com/2011/09/20/facebooks-new-buttons/" target="_blank">這邊</a>有相關的介紹。<br />
※不過很可惜的是目前尚不支援中文的動作與物件。</p>
<p>翻譯功力尚淺，請各位前輩不吝指正，也歡迎同好一起討論：）</p>
<hr />
<p>這份教學將會帶領你照著下面步驟建立、測試、發佈你的第一個 Open Graph 應用程式。我們會建立一個讓使用者發佈料理資訊的範例應用程式。</p>
<ul>
<li><a href="#create-app">Step 1: 建立</a> Facebook app</li>
<li><a href="#authenticate">Step 2: 取得使用者的時間軸授權</a></li>
<li><a href="#define">Step 3: 定義</a> 初始動作、物件與集合</li>
<li><a href="#publish">Step 4: 為你的使用者發佈動作</a></li>
<li><a href="#plugins">Step 5: 把社群外掛加到你的應用程式中</a>: <a href="#facepile">Facepile</a> plugin, <a href="#activity">Activity</a> plugin, and <a href="#rec">Recommendations</a> plugin</li>
<li><a href="#submit">Step 6: 將動作送交審閱</a></li>
</ul>
<p>如果你對 Open Graph 有疑問，請造訪: <a href="#debug">Debug and Troubleshoot</a>。為了讓你更快上手，我們亦提供了 <a href="#sample">範例</a> 下載。</p>
<p><span id="more-473"></span></p>
<hr />
<h2 id="create-app">Step 1: 建立 Facebook app</h2>
<p>先至 <a href="https://developers.facebook.com/apps">Dev App</a>，點擊 「建立新的應用程式」，並輸入應用程式的名稱以及命名空間。</p>
<p><img src="https://developers.facebook.com/attachment/devapp_home.png" alt="Open Graph protocol" /></p>
<p>當你送出初始資訊，你便會進入應用程式的基本設定頁面。</p>
<ol>
<li><strong>基本資料</strong>：
<ol>
<li>你的應用程式命名空間。這會是您的應用程序所特有的，將被用來管理你的物件和動作。</li>
</ol>
</li>
<li><strong>選擇你的應用程式是如何跟 Facebook 結合</strong>：
<ol>
<li>選擇「網站」 （在此份教學中，我們會建立一個與 Open Graph 整合的範例網站）</li>
<li>輸入網站的 URL。</li>
</ol>
</li>
</ol>
<p>您已設置的基本信息後，您便可以在你的網站中加入「<a href="https://developers.facebook.com/docs/beta/plugins/add-to-timeline">增加到時間軸</a>」的外掛，定義你的 Open Graph 行為和物件。</p>
<hr />
<h2 id="authenticate">Step 2: 取得使用者授權</h2>
<p>為了發佈使用者的 Open Graph 動作，您的應用程序需要取得使用者的 publish_actions 權限。您可以使用「<a href="https://developers.facebook.com/docs/beta/plugins/add-to-timeline">加入到時間軸</a>」外掛，它會自動要求用戶的權限。</p>
<p>下面是一段使用 <a href="https://developers.facebook.com/docs/reference/javascript/">JavaScript SDK</a> 的範例程式碼，幫助你快速進入狀況。請記得把 YOUR_APP_ID 以及範例圖片網址更新成你的喔。</p>
<pre class="brush: xml; title: ; notranslate">

&lt;script type=&quot;text/javascript&quot; src=&quot;http://connect.facebook.net/en_US/all.js&quot;&gt;&lt;/script&gt;&lt;script type=&quot;text/javascript&quot;&gt;// &lt;![CDATA[
    FB.init({
        appId:'YOUR_APP_ID', cookie:true,
        status:true, xfbml:true, oauth:true
    });
// ]]&gt;&lt;/script&gt;

&amp;nbsp;
&lt;h3&gt;&lt;span style=&quot;color: grey; font-family: verdana;&quot;&gt;
 Stuffed Cookies
 &lt;/span&gt;&lt;/h3&gt;
&lt;img title=&quot;Stuffed Cookies&quot; src=&quot;http://example.com/cookie.jpg&quot; alt=&quot;&quot; width=&quot;550&quot; /&gt;
</pre>
<p>您會發現，你的外掛可能會產生一個空白的預覽，並點擊「加入到時間軸」按鈕，產生一個空的權限對話框。</p>
<p><img src="https://developers.facebook.com/attachment/auth.png" alt="" /></p>
<p>要將特定的 app 資訊植入 <strong>授權對話框</strong> 與 <strong>加入時間軸外掛</strong>，請參閱 <a href="https://developers.facebook.com/docs/beta/opengraph/authenticaiton">Auth Dialog</a> 指南。</p>
<hr />
<h2 id="define">Step 3: 定義動作、對象與聚合</h2>
<p>應用程式開發中的 Open Graph 頁籤顯示了 "Getting Started" 頁籤：</p>
<div align="center"><img src="https://developers.facebook.com/attachment/devapp_start.png" alt="" /></div>
<h3>定義行為類型與對象類型</h3>
<p>Getting Started 精靈將引導你定義初始的動作與對象。</p>
<ul>
<li>點擊你的應用程式中的「Open Graph」頁籤</li>
<li>接著點擊「Getting Started」</li>
</ul>
<p>本教學中，你會建立一個使用者可以 <strong>cook</strong> a <strong>recpie</strong> 的動作（譯註：尚不知道在中文版會如何呈現這樣的行為句子）。為了達成前述目的，我們將會定義一個動作（或動詞）叫做 <strong>cook</strong>，並定義一個對象（或名詞）叫 <strong>recipe</strong>。</p>
<ul>
<li>在動詞輸入框中輸入 <strong>cook</strong> ，並在名詞輸入框中輸入 <strong>recipe</strong>。（譯註：可惜的是，目前似乎尚無法輸入中文的動詞與名詞。&#8211; 2011/09/23）</li>
<li>點擊「Get Started」</li>
</ul>
<p>下一步，你可以 <a href="https://developers.facebook.com/docs/beta/opengraph/define-actions/">定義你的動作</a>，<strong>cook</strong> 這個動作擁有自訂屬性與範例資料。在本教學中，我們使用預設的配置。點擊 <strong>Save Changes and Continue</strong>。</p>
<p><img src="https://developers.facebook.com/attachment/action_start.png" alt="" /></p>
<p>下一步，<a href="https://developers.facebook.com/docs/beta/opengraph/define-objects/">定義對象</a>，<strong>recipe</strong> 擁有自訂屬性與範例資料。在本教學中，我們使用預設的配置。點擊 <strong>Save Changes and Continue</strong>。</p>
<p><img src="https://developers.facebook.com/attachment/object_start.png" alt="" /></p>
<h3>定義集合</h3>
<p>下一步，<a href="https://developers.facebook.com/docs/beta/opengraph/define-units/">定義集合</a>。</p>
<p><img src="https://developers.facebook.com/attachment/agg_start.png" alt="" width="773" height="965" /></p>
<p>當使用者與你的應用程式以一種有意義的方式互動，我們亦會將使用者在時間軸上的動作以特別方式顯示集合資訊。集合資訊也可以用來植入驗證對話框展示區塊。</p>
<p>讓我們來建立一個特別標註 <strong>receipes cooked</strong> 列表的集合資訊：</p>
<ol>
<li><strong>Date to Display</strong> - 我們需要一個 <strong>cook</strong> 動作的列表，所以在此輸入 <strong>cook</strong>。</li>
<li><strong>Layout Style</strong> - 選擇 <strong>List</strong></li>
<li><strong>Sort By</strong> - 選擇 <strong>Most Recent Cook</strong></li>
<li><strong>Aggregation Title</strong> - 輸入一個有趣的集合資訊標題，像是「<strong>Recipes I&#8217;ve Cooked</strong>」</li>
<li><strong>Caption Lines</strong> - 你可以參考物件的自訂屬性，或動作的屬性。在此份教學中，我們不填這欄，更多本欄的資訊，請參考<a href="https://developers.facebook.com/docs/beta/opengraph/define-units/#captions">這裡</a>。</li>
<li><strong>In Timeline</strong> - 預覽在時間軸中你的集合資訊。點擊 <strong>Save and Finish</strong> 來返回 Open Graph 資訊頁面。</li>
</ol>
<p>當你儲存你的物件、動作與集合資訊的定義後，Open Graph 的控制台將會秀出這些資訊的綜覽。</p>
<p>下個單元會帶領你發布你的第一個動作並在使用者的時間軸中呈現集合資訊。</p>
<hr />
<h2 id="publish">Step 4: 發佈動作</h2>
<p>為了要發佈一個使用者的動作，你得先 <strong>建立一個對象（create an object）</strong>，這是基於在 <a href="#define">Step 3</a> 中定義的<strong>物件</strong>。</p>
<p>當<strong>對象</strong>被建立後，你便可使用 Graph API 發佈一個動作。</p>
<p><a id="create-object" name="create-object"></a></p>
<h3>建立物件</h3>
<p>Open Graph 資訊頁面在 <strong>Recipe</strong> 後面提供了「Get Code」連結。Open Graph 的 meta 標籤，包含那些你要嵌入在你網頁中的動作資訊。</p>
<ul>
<li>複製程式碼片段到你的網頁中。確認你的網頁是擺在 Facebook 可透過 HTTP GET 存取的主機上。</li>
<li>使用 <a href="https://developers.facebook.com/tools/debug">偵錯工具</a> 去驗證你的 meta 標籤是正確地被設置的。請試著解決所有的錯誤訊息（若有的話）。</li>
<li>記下對象的 URL，因為你將會使用它來發佈你的動作。</li>
</ul>
<p>下面是加入 &lt;meta&gt; 標籤的頁面。請記得把 YOUR_APP_ID、APP_NAMESPACE、OBJECT_TYPE 以及範例圖片網址更新成你的喔。</p>
<pre class="brush: xml; title: ; notranslate">
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;en-US&quot;
    xmlns:fb=&quot;https://www.facebook.com/2008/fbml&quot;&gt; 

&lt;head prefix=&quot;og: http://ogp.me/ns# APP_NAMESPACE: 

http://ogp.me/ns/apps/APP_NAMESPACE#&quot;&gt;

    &lt;meta property=&quot;fb:app_id&quot; content=&quot;YOUR_APP_ID&quot; /&gt;
    &lt;meta property=&quot;og:type&quot; content=&quot;APP_NAMESPACE:OBJECT_TYPE&quot; /&gt;
    &lt;meta property=&quot;og:title&quot; content=&quot;Stuffed Cookies&quot; /&gt;
    &lt;meta property=&quot;og:image&quot; content=&quot;http://example.com/zhen/cookie.jpg&quot; /&gt;
    &lt;meta property=&quot;og:description&quot; content=&quot;The Turducken of Cookies&quot; /&gt;
    &lt;meta property=&quot;og:url&quot; content=&quot;http://example.com/zhen/cookie.html&quot;&gt; 

&lt;/head&gt; 

&lt;body&gt;
    &lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
    &lt;script src=&quot;http://connect.facebook.net/en_US/all.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        FB.init({
            appId:'YOUR_APP_ID', cookie:true,
            status:true, xfbml:true, oauth:true
        });
        &lt;/script&gt;

        &lt;fb:add-to-timeline&gt;&lt;/fb:add-to-timeline&gt;

        &lt;h3&gt;
            &lt;font size=&quot;30&quot; face=&quot;verdana&quot; color=&quot;grey&quot;&gt;
                 Stuffed Cookies
            &lt;/font&gt;
        &lt;/h3&gt;
        &lt;p&gt;
            &lt;img title=&quot;Stuffed Cookies&quot;
                            src=&quot;http://fbwerks.com:8000/zhen/cookie.jpg&quot;
                            width=&quot;550&quot;/&gt;&lt;br /&gt;
        &lt;/p&gt;
    &lt;/body&gt;
    &lt;/html&gt;
</pre>
<p><a id="publish-action" name="publish-action"></a></p>
<h3>發佈動作</h3>
<p>發佈一個使用者與對象連結的動作。Open Graph 資訊頁面的 <strong>Action</strong> 後方，擁有「Get Code」連結，這包含了 curl 程式碼片段，你可複製到終端機中並直接執行。</p>
<p>發佈動作涉及建立一個 HTTP POST 要求送到 <strong>me/[namespace]:[action_type]</strong> Graph API 端點，帶有以下參數：</p>
<ul>
<li>[object_type]: 一個鏈接到一個網頁，代表一個對象。</li>
<li>access_token: 一個有效的用戶 access_token publish_actions權限。</li>
</ul>
<p>下面範例是傳送一個 POST 到：</p>
<pre class="brush: plain; title: ; notranslate">

https://graph.facebook.com/me/APP_NAMESPACE:ACTION_TYPE?OBJECT_TYPE=OBJECT_URL&#038;access_token=ACCESS_TOKEN
</pre>
<p>這將會發佈一個 cook 的動作，recipe 與提供的 OBJECT_URL 相應。請把 OBJECT_URL 更換為你的網頁 URL。</p>
<p>下面是更新了行為與 <strong>Cook</strong> 按鈕的範例應用程式。請記得把 YOUR_APP_ID、APP_NAMESPACE、OBJECT_TYPE、ACTION_TYPE 以及範例圖片網址更新成你的喔。</p>
<pre class="brush: xml; title: ; notranslate">
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;en-US&quot;
     xmlns:fb=&quot;https://www.facebook.com/2008/fbml&quot;&gt; 

&lt;head prefix=&quot;og: http://ogp.me/ns# APP_NAMESPACE: 

http://ogp.me/ns/apps/APP_NAMESPACE#&quot;&gt;

    &lt;meta property=&quot;fb:app_id&quot; content=&quot;YOUR_APP_ID&quot; /&gt;
    &lt;meta property=&quot;og:type&quot; content=&quot;APP_NAMESPACE:OBJECT_TYPE&quot; /&gt;
    &lt;meta property=&quot;og:title&quot; content=&quot;Stuffed Cookies&quot; /&gt;
    &lt;meta property=&quot;og:image&quot; content=&quot;http://example.com/cookie.jpg&quot; /&gt;
    &lt;meta property=&quot;og:description&quot; content=&quot;The Turducken of Cookies&quot; /&gt;
    &lt;meta property=&quot;og:url&quot; content=&quot;http://example.com/cookie.html&quot;&gt; 

    &lt;script type=&quot;text/javascript&quot;&gt;
    function postCook()
    {
        FB.api('/me/YOUR_NAMESPACE:ACTION_TYPE' +
                    '&amp;OBJECT_TYPE=http://example.com/cookie.html','post',
                    function(response) {
            if (!response || response.error) {
                    alert('Error occured');
            } else {
                alert('Post was successful! Action ID: ' + response.id);
                }
        });
    }
    &lt;/script&gt;
&lt;/head&gt; 

&lt;body&gt;
    &lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
    &lt;script src=&quot;http://connect.facebook.net/en_US/all.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        FB.init({
            appId:'YOUR_APP_ID', cookie:true,
            status:true, xfbml:true, oauth:true
        });
        &lt;/script&gt;

        &lt;fb:add-to-timeline&gt;&lt;/fb:add-to-timeline&gt;

        &lt;h3&gt;
            &lt;font size=&quot;30&quot; face=&quot;verdana&quot; color=&quot;grey&quot;&gt;
                Stuffed Cookies
            &lt;/font&gt;
        &lt;/h3&gt;
        &lt;p&gt;
            &lt;img title=&quot;Stuffed Cookies&quot;
                            src=&quot;http://example.com/cookie.jpg&quot;
                            width=&quot;550&quot;/&gt;&lt;br /&gt;
        &lt;/p&gt;       

        &lt;form&gt;
            &lt;input type=&quot;button&quot; value=&quot;Cook&quot; onclick=&quot;postCook()&quot; /&gt;
        &lt;/form&gt;
    &lt;/body&gt;
    &lt;/html&gt;
</pre>
<p>點 cook 按鈕，如果發佈是成功的，你將會取得一個返回的 id，其代表新的發佈。恭喜！你已經成功發佈一個動作，並完成讓 Open Graph 應用程式運作的基礎階段了。</p>
<p>為了檢視你時間軸上的聚合資訊，我們還得要建立一些動作。使用<a href="#create-app">上面的步驟</a>，建立幾個物件，並引發幾個動作。你需要發佈至少五個動作，才能看到時間軸上的集合資訊。</p>
<p>在 Facebook 的時間軸上，你應該會看到你應用程式的集合資訊：（譯註：集合資訊這塊筆者尚未成功試出來&#8230;僅有在一開始允許加入到時間軸時可看到這個資訊，不知是否因為尚在改版之故）</p>
<p><img src="https://developers.facebook.com/attachment/timeline_report.jpg" alt="" width="732" height="677" /></p>
<hr />
<h2 id="plugins">Step 5: 加入社群外掛</h2>
<p>加入一個或更多的 <a href="https://developers.facebook.com/docs/beta/plugins">Social Plugins</a> 供 Open Graph 應用程式使用。</p>
<p>在你的對象網頁中，你可以加入任何外掛去標註 Open Graph 動作。在我們的教學中，讓我們加入 <a href="https://developers.facebook.com/docs/beta/plugins/activity">Activity Plugin</a>。</p>
<h3>Activity</h3>
<p><a href="https://developers.facebook.com/docs/beta/plugins/activity/">Activity Plugin</a> 已經更新，以標註你應用程式的 Open Graph 動作。</p>
<p>加入 Activity Plugin：</p>
<pre class="brush: xml; title: ; notranslate">
&lt;fb:activity actions=&quot;APP_NAMESPACE:ACTION_TYPE&quot;/&gt;&lt;/fb:activity&gt;
</pre>
<p>下面是整份教學範例，加上 Add to Timeline、張貼動作，以及 Activity plugin。請記得把 YOUR_APP_ID、APP_NAMESPACE、OBJECT_TYPE、ACTION_TYPE 以及範例圖片網址更新成你的喔。</p>
<pre class="brush: xml; title: ; notranslate">
&lt;head prefix=&quot;og: http://ogp.me/ns# APP_NAMESPACE: 

http://ogp.me/ns/apps/APP_NAMESPACE#&quot;&gt;

    &lt;meta property=&quot;fb:app_id&quot; content=&quot;YOUR_APP_ID&quot; /&gt;
    &lt;meta property=&quot;og:type&quot; content=&quot;APP_NAMESPACE:OBJECT_TYPE&quot; /&gt;
    &lt;meta property=&quot;og:title&quot; content=&quot;Stuffed Cookies&quot; /&gt;
    &lt;meta property=&quot;og:image&quot; content=&quot;http://example.com/cookie.jpg&quot; /&gt;
    &lt;meta property=&quot;og:description&quot; content=&quot;The Turducken of Cookies&quot; /&gt;
    &lt;meta property=&quot;og:url&quot; content=&quot;http://example.com/cookie.html&quot;&gt; 

    &lt;script type=&quot;text/javascript&quot;&gt;
    function postCook()
    {
        FB.api('/me/APP_NAMESPACE:ACTION_TYPE' +
                    '&amp;OBJECT_TYPE=http://example.com/cookie.html','post',
                    function(response) {
            if (!response || response.error) {
                    alert('Error occured');
            } else {
                alert('Post was successful! Action ID: ' + response.id);
                }
        });
    }
    &lt;/script&gt;
&lt;/head&gt; 

&lt;body&gt;
    &lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
    &lt;script src=&quot;http://connect.facebook.net/en_US/all.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        FB.init({
            appId:'YOUR_APP_ID', cookie:true,
            status:true, xfbml:true, oauth:true
        });
        &lt;/script&gt;

        &lt;fb:add-to-timeline&gt;&lt;/fb:add-to-timeline&gt;

        &lt;h3&gt;
            &lt;font size=&quot;30&quot; face=&quot;verdana&quot; color=&quot;grey&quot;&gt;
                Stuffed Cookies
            &lt;/font&gt;
        &lt;/h3&gt;
        &lt;p&gt;
            &lt;img title=&quot;Stuffed Cookies&quot;
                            src=&quot;http://example.com/cookie.jpg&quot;
                            width=&quot;550&quot;/&gt;&lt;br /&gt;
        &lt;/p&gt;       

        &lt;form&gt;
            &lt;input type=&quot;button&quot; value=&quot;Cook&quot; onclick=&quot;postCook()&quot; /&gt;
        &lt;/form&gt;
        &lt;fb:activity actions=&quot;APP_NAMESPACE:ACTION_TYPE&quot;&gt;&lt;/fb:activity&gt;
    &lt;/body&gt;
    &lt;/html&gt;
</pre>
<hr />
<h2>Step 6: 將你的你的動作送交審閱</h2>
<p>在你的應用程式可以向所有使用者發佈 Open Graph 動作之前，我們會採用一個輕量級審查和核准<a href="https://developers.facebook.com/docs/beta/opengraph/opengraph-approval/">程序</a>。</p>
<p><center><br />
<img src="https://developers.facebook.com/attachment/submit_action.png" alt="" width="994" height="832" /></center>打開 Open Graph 活動將立即看到您的應用程式的管理員、開發人員和測試人員。這允許你做終端到終端的集成測試。一旦完成，透過<a href="https://developers.facebook.com/apps">應用程式開發頁</a>提交動作審查。</p>
<p>在我們驗證你的 Open Graph 使用方式符合標準，我們將會核可應用程式對所有 Facebook 的使用者發佈動作。請注意，我們並非核可你的應用程式，而只是 Open Graph 動作的使用。</p>
<p>更多細節請參照 <a href="https://developers.facebook.com/docs/beta/opengraph/opengraph-approval/">這裡</a> 。</p>
<hr />
<h2 id="debug">故障排除</h2>
<p>下面是當你遇到應用程式動作或對象問題時，幾個有幫助的技巧提示：</p>
<h3>如何驗證你的對象（Object）</h3>
<ul>
<li>使用 <a href="https://developers.facebook.com/tools/debug">object debugger</a>，你可驗證你的對象是否使用了必要的 meta 標籤。</li>
</ul>
<h3>如何驗證你的行為已被發佈</h3>
<ul>
<li>使用 <a href="https://developers.facebook.com/tools/debug">object debugger</a> 確保你的對象是正確地被定義的</li>
<li>確認你在 API 呼叫時使用正確的命名空間。記得當命名空間被儲存後便不能修改。</li>
<li>確認在你建立 Graph API 呼叫前，已經從 access_token 中移除了 &amp;expires token。</li>
<li>確認你可在 Graph API POST 呼叫後取得返回的 id</li>
</ul>
<h3>為什麼我在發佈動作後得到「This method must be called with an app access_token」的錯誤？</h3>
<ul>
<li>在應用程式開發頁，你的動作類型中取消勾選「Require app access token to write」選項。</li>
</ul>
<hr />
<h2 id="sample">範例程式碼</h2>
<p>此份教學在我們的 <a href="https://developers.facebook.com/docs/samples/">Samples and How-To</a> 中已可取得。</p>
<p>而這邊是筆者製作的<a href="http://jobs.iprefer.com.tw/iprefer/labs/patrick/opengraph/" target="_blank">範例</a>。</p>
<p>翻譯有誤或有任何需修正的部分，請不吝指正，大家一起討論 ：）</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/473/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[HTML5] 瀏覽器取得定位筆記</title>
		<link>http://patw.idv.tw/blog/archives/471?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=html5-%25e7%2580%258f%25e8%25a6%25bd%25e5%2599%25a8%25e5%258f%2596%25e5%25be%2597%25e5%25ae%259a%25e4%25bd%258d%25e7%25ad%2586%25e8%25a8%2598</link>
		<comments>http://patw.idv.tw/blog/archives/471#comments</comments>
		<pubDate>Thu, 18 Aug 2011 06:32:45 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[手機版網頁]]></category>
		<category><![CDATA[Gears]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[定位]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=471</guid>
		<description><![CDATA[某個案子要用手機取得使用者所在經緯度的功能，使用 HTML5 可以很快地達成這個需求，但在較舊的 Android 版本瀏覽器上（例如 HTC Magic 的內建瀏覽器，自行刷機就另當別論了XD）會無法透過 HTML5 的 navigator.geolocation 取得定位。找過資料後，發現在這種情況需要透過 Gears 功能來達成（HTC Magic 的瀏覽器支援 Gears）。 下面就是整合這兩種方法的 Code： 首先，要支援 Gears，要先在 head 標籤引入此 js： 接著，下面是主要的 JavaScript： 以上，如此便能確保在舊版 Android 瀏覽器中也能正確取得定位了。 在 HTC Magic, iPhone 3GS, iPhone 4, Samsung i9000, Samsung i9100 上實測過。 PS.對了，過程中也測過 Google AJAX API 的 IP 定位方式，也就是透過 google.loader.ClientLocation 的方式，但大概是對台灣的 IP 定位資料庫很不準吧，在台北市卻將我定位在台中。因此就沒有採用此方法了。 參考資料： 如何在 Mobile&#8230;]]></description>
			<content:encoded><![CDATA[<p>某個案子要用手機取得使用者所在經緯度的功能，使用 HTML5 可以很快地達成這個需求，但在較舊的 Android 版本瀏覽器上（例如 HTC Magic 的內建瀏覽器，自行刷機就另當別論了XD）會無法透過 HTML5 的 navigator.geolocation 取得定位。找過資料後，發現在這種情況需要透過 Gears 功能來達成（HTC Magic 的瀏覽器支援 Gears）。</p>
<p>下面就是整合這兩種方法的 Code：<br />
<span id="more-471"></span><br />
首先，要支援 Gears，要先在 head 標籤引入此 js：</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.google.com/apis/gears/gears_init.js&quot;&gt;&lt;/script&gt;
</pre>
<p>接著，下面是主要的 JavaScript：</p>
<pre class="brush: jscript; title: ; notranslate">
// 瀏覽器支援 HTML5 定位方法
if (navigator.geolocation) {

    // HTML5 定位抓取
    navigator.geolocation.getCurrentPosition(function(position) {
        mapServiceProvider(position.coords.latitude, position.coords.longitude);
    },
    function(error) {
	    switch (error.code) {
	        case error.TIMEOUT:
	            alert('連線逾時');
	            break;

	        case error.POSITION_UNAVAILABLE:
	            alert('無法取得定位');
	            break;

	        case error.PERMISSION_DENIED://拒絕
	            alert('想要參加本活動，\n記得允許手機的GPS定位功能喔!');
	            break;

	        case error.UNKNOWN_ERROR:
	            alert('不明的錯誤，請稍候再試');
	            break;
	    }
    });

} else { // 不支援 HTML5 定位

    // 若支援 Google Gears
    if (window.google &amp;&amp; google.gears) {
    	try {
              // 嘗試以 Gears 取得定位
              var geo = google.gears.factory.create('beta.geolocation');
              geo.getCurrentPosition(successCallback,errorCallback, { enableHighAccuracy: true,gearsRequestAddress: true });
        } catch(e){
              alert(&quot;定位失敗請稍候再試&quot;);
        }
    }else{
        alert(&quot;想要參加本活動，\n記得允許手機的GPS定位功能喔!&quot;);
    }
}

// 取得 Gears 定位發生錯誤
function errorCallback(err) {
    var msg = 'Error retrieving your location: ' + err.message;
    alert(msg);
}

// 成功取得 Gears 定位
function successCallback(p) {
      mapServiceProvider(p.latitude, p.longitude);
}

// 顯示經緯度
function mapServiceProvider(latitude, longitude) {
      alert(&quot;經緯度：&quot; + latitude + &quot;, &quot; + longitude);
}
</pre>
<p>以上，如此便能確保在舊版 Android 瀏覽器中也能正確取得定位了。<br />
在 HTC Magic, iPhone 3GS, iPhone 4, Samsung i9000, Samsung i9100 上實測過。</p>
<p>PS.對了，過程中也測過 Google AJAX API 的 IP 定位方式，也就是透過 google.loader.ClientLocation 的方式，但大概是對台灣的 IP 定位資料庫很不準吧，在台北市卻將我定位在台中。因此就沒有採用此方法了。</p>
<p>參考資料：<br />
<a href="http://blog.ericsk.org/archives/1347" target="_blank">如何在 Mobile Web App 中取得座標</a><br />
<a href="http://code.google.com/intl/zh-TW/apis/gears/api_geolocation.html" target="_blank">Google Geolocation API</a><br />
<a href="http://code.google.com/intl/zh-TW/apis/gears/samples/hello_world_geolocation.html" target="_blank">Gears Geolocation Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/471/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ASP.NET] 在文字控制項上使用 HTML5 input type 的方法</title>
		<link>http://patw.idv.tw/blog/archives/465?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=asp-net-%25e5%259c%25a8%25e6%2596%2587%25e5%25ad%2597%25e6%258e%25a7%25e5%2588%25b6%25e9%25a0%2585%25e4%25b8%258a%25e4%25bd%25bf%25e7%2594%25a8-html5-input-type-%25e7%259a%2584%25e6%2596%25b9%25e6%25b3%2595</link>
		<comments>http://patw.idv.tw/blog/archives/465#comments</comments>
		<pubDate>Wed, 17 Aug 2011 08:35:52 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[手機版網頁]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[type]]></category>
		<category><![CDATA[文字框]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=465</guid>
		<description><![CDATA[最近的案件在製作手機版網頁時，其中有讓使用者輸入「手機」的欄位，這時想到若能善用 HTML5 文字框中 type 屬性，將之設為 tel，在智慧型手機上就能自動呼叫出電話數字鍵盤，那麼使用者輸入手機時會方便許多。 但由於是用 ASP.NET 3.5 製作，似乎在 4 之前的版本，文字框控制項尚不支援 HTML5 的眾多 type 屬性，若強制更改會造成編譯錯誤。 網上搜尋了一下解法，果真有相關的討論，其實做法就如同在文字框控制項加上 keydown 屬性一樣，在 code behind 那邊加上即可。 以本例來說，就會像這樣： 成果圖： 一般的文字框輸入鍵盤 type 設成 tel 的電話輸入鍵盤]]></description>
			<content:encoded><![CDATA[<p>最近的案件在製作手機版網頁時，其中有讓使用者輸入「手機」的欄位，這時想到若能善用 HTML5 文字框中 type 屬性，將之設為 tel，在智慧型手機上就能自動呼叫出電話數字鍵盤，那麼使用者輸入手機時會方便許多。</p>
<p>但由於是用 ASP.NET 3.5 製作，似乎在 4 之前的版本，文字框控制項尚不支援 HTML5 的眾多 type 屬性，若強制更改會造成編譯錯誤。<br />
網上搜尋了一下解法，果真有相關的討論，其實做法就如同在文字框控制項加上 keydown 屬性一樣，在 code behind 那邊加上即可。</p>
<p>以本例來說，就會像這樣：<br />
<span id="more-465"></span></p>
<pre class="brush: csharp; title: ; notranslate">
this.txtPhone.Attributes.Remove(&quot;type&quot;);
this.txtPhone.Attributes.Add(&quot;type&quot;, &quot;tel&quot;);
</pre>
<p>成果圖：</p>
<p>一般的文字框輸入鍵盤<br />
<a href="http://patw.idv.tw/blog/wp-content/uploads/2011/08/SC20110817-162343.jpeg"><img src="http://patw.idv.tw/blog/wp-content/uploads/2011/08/SC20110817-162343.jpeg" alt="" title="一般的文字框輸入鍵盤" width="480" height="800" class="alignnone size-full wp-image-467" /></a></p>
<p>type 設成 tel 的電話輸入鍵盤<br />
<a href="http://patw.idv.tw/blog/wp-content/uploads/2011/08/SC20110817-162333.jpeg"><img src="http://patw.idv.tw/blog/wp-content/uploads/2011/08/SC20110817-162333.jpeg" alt="" title="電話輸入鍵盤" width="480" height="800" class="alignnone size-full wp-image-466" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/465/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[T-SQL] 亂數排序的分頁查詢方法</title>
		<link>http://patw.idv.tw/blog/archives/461?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=t-sql-%25e9%259a%25a8%25e6%25a9%259f%25e4%25ba%2582%25e6%2595%25b8%25e6%258e%2592%25e5%25ba%258f%25e7%259a%2584%25e5%2588%2586%25e9%25a0%2581%25e6%259f%25a5%25e8%25a9%25a2%25e6%2596%25b9%25e6%25b3%2595</link>
		<comments>http://patw.idv.tw/blog/archives/461#comments</comments>
		<pubDate>Thu, 07 Jul 2011 15:19:08 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[T-SQL]]></category>
		<category><![CDATA[分頁]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[隨機]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=461</guid>
		<description><![CDATA[今天遇到一個新需求，某個案件由於希望列表各物件的露出是公平的，也就是說，按照編號、時間等方式排序都不公平，希望能夠用亂數隨機排序。 環境是 SQL SERVER 配合 ASP.NET，分頁使用 AspNetPager 控制項。 這個需求看似相當容易，使用 ORDER BY NEWID() 就好了呀，但列表還要分頁呢，使用者若按下一頁，第二頁又不該出現第一頁的物件。 想到很多方法 &#8230; 可以用臨時表作、也或許可以做一隻已經亂數排好的資料 xml 以 jQuery 方式載入呈現 &#8230; 不過在拜請 Google 大神後發現一個相當有趣的作法，以 T-SQL 將某個種子值以 md5 方式編碼，並作為排序的依據。此種子值可在使用者進入頁面後給予，並塞入 Session 中，確保此使用者翻頁時還是同一種子值。 如同 StackOverflow 上 ccook 前輩所提供的範例 Code： 資料來源：http://stackoverflow.com/questions/458175/pseudo-random-sort-in-ms-sql-not-newid-and-not-rand]]></description>
			<content:encoded><![CDATA[<p>今天遇到一個新需求，某個案件由於希望列表各物件的露出是公平的，也就是說，按照編號、時間等方式排序都不公平，希望能夠用亂數隨機排序。<br />
環境是 SQL SERVER 配合 ASP.NET，分頁使用 AspNetPager 控制項。</p>
<p>這個需求看似相當容易，使用 ORDER BY NEWID() 就好了呀，但列表還要分頁呢，使用者若按下一頁，第二頁又不該出現第一頁的物件。<br />
想到很多方法 &#8230; 可以用臨時表作、也或許可以做一隻已經亂數排好的資料 xml 以 jQuery 方式載入呈現 &#8230;</p>
<p>不過在拜請 Google 大神後發現一個相當有趣的作法，以 T-SQL 將某個種子值以 md5 方式編碼，並作為排序的依據。此種子值可在使用者進入頁面後給予，並塞入 Session 中，確保此使用者翻頁時還是同一種子值。<br />
<span id="more-461"></span></p>
<p>如同 StackOverflow 上 ccook 前輩所提供的範例 Code：</p>
<pre class="brush: sql; title: ; notranslate">
--宣告一種子值，實際在 ASP.NET 中使用，可以將此值塞入 Session 中，確保使用者翻頁時是使用同一種子值
declare @seed as int;
--可試著將 @seed 值改變，可發現每一種 @seed 值都各有固定排序
set @seed = 10;

--建立一範例使用的表
create table temp (
id int,
date datetime)

--塞入幾筆資料
insert into temp (id, date) values (1,'20090119')
insert into temp (id, date) values (2,'20090118')
insert into temp (id, date) values (3,'20090117')
insert into temp (id, date) values (4,'20090116')
insert into temp (id, date) values (5,'20090115')
insert into temp (id, date) values (6,'20090114')

--將種子值以 md5 方式編碼，並以此作為排序依據
select *, HASHBYTES('md5',cast(id+@seed as varchar)) r
from temp order by r
--1 2009-01-19 00:00:00.000     0x6512BD43D9CAA6E02C990B0A82652DCA
--5 2009-01-15 00:00:00.000     0x9BF31C7FF062936A96D3C8BD1F8F2FF3
--4 2009-01-16 00:00:00.000     0xAAB3238922BCC25A6F606EB525FFDC56
--2 2009-01-18 00:00:00.000     0xC20AD4D76FE97759AA27A0C99BFF6710
--3 2009-01-17 00:00:00.000     0xC51CE410C124A10E0DB5E4B97FC2AF39
--6 2009-01-14 00:00:00.000     0xC74D97B01EAE257E44AA9D5BADE97BAF

--將範例表刪掉
drop table temp
</pre>
<p>資料來源：<a href="http://stackoverflow.com/questions/458175/pseudo-random-sort-in-ms-sql-not-newid-and-not-rand" target="_blank">http://stackoverflow.com/questions/458175/pseudo-random-sort-in-ms-sql-not-newid-and-not-rand</a></p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/461/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ASP] Base64 字串轉存成 JPG</title>
		<link>http://patw.idv.tw/blog/archives/456?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=asp-base64-%25e5%25ad%2597%25e4%25b8%25b2%25e8%25bd%2589%25e5%25ad%2598%25e6%2588%2590-jpg</link>
		<comments>http://patw.idv.tw/blog/archives/456#comments</comments>
		<pubDate>Tue, 21 Jun 2011 16:36:19 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[base64]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=456</guid>
		<description><![CDATA[某個案子要做 [AS3] 擷取 Flash 畫面上的某一區塊為圖檔 這樣的需求，但得到空間資訊後才發現必須得用古老的 ASP 寫。 上網找了一下，寫法整理在下面。 Base64 的變數名為 imageData，請用 POST 方式丟。 ※另外要注意，在 IIS 中，ASP 針對存入圖檔的目錄需另外開啟 IUSR 角色寫入的權限。]]></description>
			<content:encoded><![CDATA[<p>某個案子要做 <a href="http://patw.idv.tw/blog/archives/262" target="_blank">[AS3] 擷取 Flash 畫面上的某一區塊為圖檔</a> 這樣的需求，但得到空間資訊後才發現必須得用古老的 ASP 寫。<br />
上網找了一下，寫法整理在下面。</p>
<p>Base64 的變數名為 imageData，請用 POST 方式丟。<br />
※另外要注意，在 IIS 中，ASP 針對存入圖檔的目錄需另外開啟 IUSR 角色寫入的權限。</p>
<p><span id="more-456"></span></p>
<pre class="brush: vb; title: ; notranslate">
&lt;%@Language=&quot;VBScript&quot; CodePage=65001 %&gt;
&lt;%
On Error Resume Next

Function getTimeToString()
  Dim MyNewRandomNum
  Randomize
  MyNewRandomNum = Int(Rnd * 100)+1
  d = Now()
  getTimeToString = Year(d) &amp; &quot;_&quot; &amp; Month(d) &amp; &quot;_&quot; &amp; Day(d) &amp; &quot;_&quot; &amp; Hour(d) &amp; &quot;_&quot; &amp; Minute(d) &amp; &quot;_&quot; &amp; Second(d) &amp; &quot;_&quot; &amp; MyNewRandomNum
End Function

Dim filename
filename = getTimeToString() &amp; &quot;.jpg&quot;

Dim xml : Set xml=Server.CreateObject(&quot;MSXML2.DOMDocument&quot;)
Dim stm : Set stm=Server.CreateObject(&quot;ADODB.Stream&quot;)
xml.resolveExternals=False
xml.loadXML &quot;&lt;?xml version='1.0'?&gt;&lt;data&gt;&lt;![CDATA[&quot; &amp; Request.Form(&quot;imageData&quot;) &amp; &quot;]]&gt;&lt;/data&gt;&quot;
xml.documentElement.setAttribute &quot;xmlns:dt&quot;,&quot;urn:schemas-microsoft-com:datatypes&quot;
xml.documentElement.dataType = &quot;bin.base64&quot;
stm.Type=1 'adTypeBinary
stm.Open
stm.Write xml.documentElement.nodeTypedValue
stm.SaveToFile Server.MapPath(&quot;upload&quot;) &amp; &quot;/&quot; &amp; filename
stm.Close
Set xml=Nothing
Set stm=Nothing 

IF err.number&lt;&gt;0 THEN
	Response.Write &quot;Result=Failed&amp;msg=發生錯誤&quot;
ELSE
	Response.Write &quot;Result=&quot; &amp; filename '輸出檔名
END IF
%&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/456/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[IE] FCKeditor 於 IE9 中的對話框都跑不出來的解法</title>
		<link>http://patw.idv.tw/blog/archives/453?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ie-fckeditor-%25e6%2596%25bc-ie9-%25e4%25b8%25ad%25e7%259a%2584%25e5%25b0%258d%25e8%25a9%25b1%25e6%25a1%2586%25e9%2583%25bd%25e8%25b7%2591%25e4%25b8%258d%25e5%2587%25ba%25e4%25be%2586%25e7%259a%2584%25e8%25a7%25a3%25e6%25b3%2595</link>
		<comments>http://patw.idv.tw/blog/archives/453#comments</comments>
		<pubDate>Mon, 23 May 2011 04:00:04 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[網頁設計]]></category>
		<category><![CDATA[FCKeditor]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[IE9]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=453</guid>
		<description><![CDATA[以前的某個案子客戶反映，他們升級到 IE9 之後，所有 FCKeditor 的功能對話框 (例如: 從 Word 貼上、超連結) 都跑不出來， 經實際測試後發現果真如此，但只要將 IE 切到 IE8 模式（按 F12 的開發工具功能表最後兩欄可切換）就一切正常。 尋找 FCKeditor 官方論壇上的解法，最簡單的解法（省得還要更新 FCKeditor 版本）是在該頁面的 head 標籤中加上： 使 IE9 模擬成 IE8 模式在跑，就可解決此問題。 另外，提醒一下，若是以頁框組來載入不同頁面的 FCKeditor 編輯器，則該行需加在頁框組的頁面上。]]></description>
			<content:encoded><![CDATA[<p>以前的某個案子客戶反映，他們升級到 IE9 之後，所有 FCKeditor 的功能對話框 (例如: 從 Word 貼上、超連結) 都跑不出來，</p>
<p>經實際測試後發現果真如此，但只要將 IE 切到 IE8 模式（按 F12 的開發工具功能表最後兩欄可切換）就一切正常。</p>
<p><span id="more-453"></span></p>
<p>尋找 <a href="http://cksource.com/forums/viewtopic.php?t=21881">FCKeditor 官方論壇上的解法</a>，最簡單的解法（省得還要更新 FCKeditor 版本）是在該頁面的 head 標籤中加上：</p>
<pre class="brush: xml; title: ; notranslate">
&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=EmulateIE8&quot; /&gt;
</pre>
<p>使 IE9 模擬成 IE8 模式在跑，就可解決此問題。<br />
另外，提醒一下，若是以頁框組來載入不同頁面的 FCKeditor 編輯器，則該行需加在頁框組的頁面上。</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/453/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

