<?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>Fri, 04 May 2012 04:11:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[Node.js] 使用 Node.js 來達成電腦網頁與手機網頁即時互動</title>
		<link>http://patw.idv.tw/blog/archives/566?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=node-js-%25e4%25bd%25bf%25e7%2594%25a8-node-js-%25e4%25be%2586%25e9%2581%2594%25e6%2588%2590%25e9%259b%25bb%25e8%2585%25a6%25e7%25b6%25b2%25e9%25a0%2581%25e8%2588%2587%25e6%2589%258b%25e6%25a9%259f%25e7%25b6%25b2%25e9%25a0%2581%25e5%258d%25b3%25e6%2599%2582%25e4%25ba%2592%25e5%258b%2595</link>
		<comments>http://patw.idv.tw/blog/archives/566#comments</comments>
		<pubDate>Wed, 02 May 2012 16:09:43 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[手機版網頁]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Nodejs]]></category>
		<category><![CDATA[socket.io]]></category>
		<category><![CDATA[即時互動]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=566</guid>
		<description><![CDATA[這幾年 Node.js 在台灣許多網站都開始使用，我對這項技術一直頗有興趣，在想能怎麼使用這項技術去玩些有趣的互動。 曾照著網上熱心前輩所寫的文章試著寫寫看，也在去年九月參加了 HTML5與Node.js在台灣聯合技術小聚，但一時案子忙碌，實在沒有心力好好研究便停滯了。 &#160; 最近公司上線的案子剛好能有這個機會讓我來玩玩，目的是讓使用者透過手機網頁來與電腦開啟的網頁做些即時互動。 用 App 寫要考量跨平台與門檻(還要去下載 App，應該會讓一些單純想玩玩 Event 的使用者卻步)的問題，因此便希望能都用 Web 上的技術來達成囉。 &#160; 此篇便簡單紀錄一下 Node.js 在 FreeBSD 上的安裝，以及簡單製作一個手機與電腦即時互動的網頁。 自認觀念上還不是相當清楚便迫不及待分享了，若有誤之處還請前輩給予指導囉 ：） 一、安裝 我自家使用的伺服器環境是 FreeBSD，所以這邊就介紹在 FreeBSD 上安裝 Nodejs 的方法。 ports 裡面有喔！直接進去裝就可以了～真是方便！ 如果順利的話應該就可以安裝完畢，但有時候會遇到找不到相符版本的情況，那就這樣做吧： 經過一段時間的等待，終於安裝完了！ &#160; 可以試一下能不能執行，印出 nodejs 的版本試試： ※小提醒：如果 FreeBSD 還沒認出 node，就 rehash 一下再執行。 安裝介紹至此終了。 接下來是第二單元，來實作囉！：Ｄ &#160; 二、實作：使用 Node.js 來達成電腦網頁與手機網頁即時互動 &#160; 這邊會寫一個簡單的範例來展示怎麼用 Node.js 來達成電腦網頁與手機網頁即時互動。 首先，我們會用上 socket.io&#8230;]]></description>
			<content:encoded><![CDATA[<p>這幾年 Node.js 在台灣許多網站都開始使用，我對這項技術一直頗有興趣，在想能怎麼使用這項技術去玩些有趣的互動。</p>
<p>曾照著網上熱心前輩所寫的文章試著寫寫看，也在去年九月參加了 <a href="http://www.facebook.com/events/108571625914197/" target="_blank">HTML5與Node.js在台灣聯合技術小聚</a>，但一時案子忙碌，實在沒有心力好好研究便停滯了。</p>
<p>&nbsp;</p>
<p>最近公司上線的案子剛好能有這個機會讓我來玩玩，目的是讓使用者透過手機網頁來與電腦開啟的網頁做些即時互動。<br />
用 App 寫要考量跨平台與門檻(還要去下載 App，應該會讓一些單純想玩玩 Event 的使用者卻步)的問題，因此便希望能都用 Web 上的技術來達成囉。</p>
<p>&nbsp;</p>
<p>此篇便簡單紀錄一下 Node.js 在 FreeBSD 上的安裝，以及簡單製作一個手機與電腦即時互動的網頁。</p>
<p>自認觀念上還不是相當清楚便迫不及待分享了，若有誤之處還請前輩給予指導囉 ：）</p>
<p><span id="more-566"></span></p>
<h2>一、安裝</h2>
<p>我自家使用的伺服器環境是 FreeBSD，所以這邊就介紹在 FreeBSD 上安裝 Nodejs 的方法。<br />
ports 裡面有喔！直接進去裝就可以了～真是方便！</p>
<pre class="brush: plain; title: ; notranslate">
root@patwbsd [/root] # cd /usr/ports/www/node/
root@patwbsd [/usr/ports/www/node] # make install clean
</pre>
<p>如果順利的話應該就可以安裝完畢，但有時候會遇到找不到相符版本的情況，那就這樣做吧：</p>
<pre class="brush: plain; title: ; notranslate">
# 看起來 work 裡面沒有最新版 v0.6.14 ... 好吧，自己去抓回來。
root@patwbsd [/usr/ports/www/node/work] # fetch http://nodejs.org/dist/v0.6.14/node-v0.6.14.tar.gz
node-v0.6.14.tar.gz		100% of	10MB 1838 kBps

# 解壓縮：
root@patwbsd [/usr/ports/www/node/work] # tar zxf node-v0.6.14.tar.gz

# 然後進去編譯：
root@patwbsd [/usr/ports/www/node/work] # cd node-v0.6.14
root@patwbsd [/usr/ports/www/node/work/node-v0.6.14] # ./configure
root@patwbsd [/usr/ports/www/node/work/node-v0.6.14] # gmake

# 再出來安裝：
root@patwbsd [/usr/ports/www/node/work] # cd ..
root@patwbsd [/usr/ports/www/node] # make install clean
</pre>
<p>經過一段時間的等待，終於安裝完了！</p>
<p>&nbsp;</p>
<p>可以試一下能不能執行，印出 nodejs 的版本試試：<br />
※小提醒：如果 FreeBSD 還沒認出 node，就 rehash 一下再執行。</p>
<pre class="brush: plain; title: ; notranslate">
root@patwbsd [/root ] # node -v
v0.6.14
</pre>
<p>安裝介紹至此終了。<br />
接下來是第二單元，來實作囉！：Ｄ</p>
<p>&nbsp;</p>
<hr />
<h2>二、實作：使用 Node.js 來達成電腦網頁與手機網頁即時互動</h2>
<p>&nbsp;</p>
<p>這邊會寫一個簡單的範例來展示怎麼用 Node.js 來達成電腦網頁與手機網頁即時互動。</p>
<p>首先，我們會用上 socket.io 跟 express 兩個套件，先裝好吧：</p>
<pre class="brush: plain; title: ; notranslate">
root@patwbsd [/home/ftp/patw/nodejs] # npm install socket.io
root@patwbsd [/home/ftp/patw/nodejs] # npm install express
</pre>
<p>裝完之後，應該可以在所在目錄底下看到 node_modules/ 目錄。</p>
<p>OK，準備完畢，開始寫吧。<br />
我們可以將這隻 nodejs 程式命名為 server.js，先簡單寫些內容測試看看：</p>
<pre class="brush: jscript; title: ; notranslate">
// 引入 express &amp; socket.io
var app = require('express').createServer()
var io = require('socket.io').listen(app);

// 偵聽在 8081 port，隨你喜歡
app.listen(8081);
console.log('Server running');

// Routing，其實這首頁沒什麼用
app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});
</pre>
<p>存檔，再準備一個預設的 index.html 用來看看 Server 是否有 Run 起來吧。(照慣例打個 Hello world! 好了 ：Ｄ)</p>
<p>Run run 看：</p>
<pre class="brush: plain; title: ; notranslate">
root@patwbsd [/home/ftp/patw/nodejs] # node server.js
   info  - socket.io started
Server running
</pre>
<p>順利的話應該可以看到執行後的兩行訊息，其中 Server running 是我們在程式中用 console.log 印出的。<br />
然後連線到 http://你的ip:8081/ ，應該就可以看到剛剛我們所設定的 index.html 內容。</p>
<p>接著，我們要增加偵聽事件，讓 Nodejs Server 在接收到訊息後再發出動作，以達到互動的效果。<br />
一樣是改 server.js 這支：</p>
<pre class="brush: jscript; title: ; notranslate">
var app = require('express').createServer()
var io = require('socket.io').listen(app);

app.listen(8081);
console.log('Server running');

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

// 連線
io.sockets.on('connection', function (socket) {

	// 偵聽 send 事件
	socket.on('send', function (data) {

		// 然後我們依據 data.act 做不同的動作
		switch ( data.act )
		{
		    // 這個是使用者打開手機網頁後發生的事件
		    case &quot;enter&quot;:
			io.sockets.emit('get_response', data);
			console.log(&quot;Sending getEnter&quot;);
			break;

		    // 這個是使用者在手機網頁中點擊按鈕，讓電腦網頁背景變色的事件
		    case &quot;changebg&quot;:
			io.sockets.emit('get_response', data);
			console.log(&quot;Sending changeBg&quot;);
			break;
		}

	});

});
</pre>
<p>OK，存檔。一樣用 node server.js 讓它運行。</p>
<p>伺服器端的程式差不多了，再來是電腦網頁與手機網頁的撰寫囉。<br />
要怎麼讓特定手機網頁能夠控制特定電腦網頁呢？思考方向是──設定一組專屬的 KEY，一對一，就可以知道只聽到某個 KEY 的手機網頁呼叫，電腦網頁才會動作。</p>
<p>為了讓手機使用者方便輸入，這邊將網址包含 KEY 變成一組 QRCode。 (使用 Google Charts)</p>
<p>流程大致是這樣：</p>
<blockquote><p>使用者開啟電腦網頁→用手機掃描網頁上的 QRCode→手機打開了專屬 KEY 的網頁→電腦網頁透過 Nodejs 伺服器知道這個 KEY 被打開了→開始互動</p></blockquote>
<p>電腦網頁的 code 如下：</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!document html&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;meta charset=&quot;utf-8&quot;&gt;
		&lt;title&gt;Nodejs - 電腦網頁&lt;/title&gt;
		&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js&quot;&gt;&lt;/script&gt;
		&lt;script src=&quot;http://Nodejs伺服器位置:埠號/socket.io/socket.io.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			#main {
				display: none;
			}
		&lt;/style&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			// 用來產生類似 GUID 的字串
			function S4() {
			   return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
			}

			function NewGuid() {
			   return (S4()+S4());
			}

			$(document).ready(function(){

				var key = NewGuid();
				console.log(key);
				$(&quot;#qrcode&quot;).append(&quot;&lt;img src='http://chart.apis.google.com/chart?chs=300x300&amp;cht=qr&amp;chl=http://手機版網址/?key=&quot; + key + &quot;&amp;choe=UTF-8' /&gt;&quot;);

				// NodeJS Server
				var nodejs_server = &quot;Nodejs伺服器位置:埠號&quot;;

				// 進行 connect
				var socket = io.connect(&quot;http://&quot; + nodejs_server);

				// 偵聽 nodejs 事件
				socket.on(&quot;get_response&quot;, function (b) {

				    var combine = b.key + &quot;_&quot; + b.act;
				    console.log(combine);

				    switch (combine) {

				    	// 當擁有特定 KEY 的使用者打開手機版網頁，觸發 enter 事件，就會將 qrcode 隱藏，並秀出一張圖
				    	case key + &quot;_enter&quot;:
				            setTimeout(function () {

				                $(&quot;#qrcode&quot;).hide();
				            	$(&quot;#main&quot;).show();

				            }, 500);
				            break;

				    	// 當擁有特定 KEY 的使用者在手機版網頁中，觸發 changebg 事件，就會將網頁的背景顏色隨機變換
				        case key + &quot;_changebg&quot;:
				            setTimeout(function () {

							    var str = &quot;0123456789abcdef&quot;, t = &quot;&quot;;
							    for (j = 0; j &lt; 6; j++) {
							        t = t + str.charAt(Math.random() * str.length);
							    }

				            	$(&quot;body&quot;).css(&quot;background-color&quot;, t);

				            }, 500);
				            break;

				    }
				});

			});
		&lt;/script&gt;
	&lt;/head&gt;
&lt;body&gt;

		&lt;div id=&quot;qrcode&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;main&quot;&gt;&lt;img src=&quot;amber.jpg&quot; /&gt;&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>至於手機版網頁的 code 如下：(本例用 PHP 撰寫，目的是取得 querystring 的 key 值)</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;

&lt;html&gt;
&lt;head&gt;
	&lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;title&gt;Nodejs -  手機網頁&lt;/title&gt;
        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0&quot;&gt;
        &lt;meta name=&quot;author&quot; content=&quot;patw, Patrick Wang&quot; /&gt;
    	&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script src=&quot;http://Nodejs伺服器位置:埠號/socket.io/socket.io.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
	$(document).ready(function() {

		// ==========================================================================================================================
		// 建立 Socket IO 連線
		// ==========================================================================================================================
		var socket = io.connect(&quot;http://Nodejs伺服器位置:埠號&quot;);
		&quot;undefined&quot; != typeof console &amp;&amp; console.log(&quot;user enter via mobile&quot;);
		// ==========================================================================================================================

	    &quot;undefined&quot; != typeof console &amp;&amp; console.log(&quot;enter mobile page&quot;);
	    socket.emit(&quot;send&quot;, {
	        key: &quot;&lt;?php echo $_GET['key'];?&gt;&quot;,
	        act: &quot;enter&quot;
	    });

		$(&quot;#change_btn&quot;).click(function(){
		    &quot;undefined&quot; != typeof console &amp;&amp; console.log(&quot;send change color command&quot;);
		    socket.emit(&quot;send&quot;, {
		        key: &quot;&lt;?php echo $_GET['key'];?&gt;&quot;,
		        act: &quot;changebg&quot;
		    });
		});

	});
	&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;p&gt;打開手機網頁成功！快看看你的電腦螢幕吧！&lt;/p&gt;

&lt;input id=&quot;change_btn&quot; type=&quot;button&quot; value=&quot;控制電腦端變背景色&quot; /&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>最後放個成果的 DEMO 影片：<br />
<iframe width="640" height="360" src="http://www.youtube.com/embed/IKw8jklZ4Mg" frameborder="0" allowfullscreen></iframe></p>
<p>以上，與大家分享。<br />
也希望有心得的朋友一起討論喔：Ｄ 看能做出什麼更有趣的東西</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/566/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>iPhone/iPad 等行動裝置上的 audio 標籤無法自動播放 (autoplay) 與預載 (preload) 的問題</title>
		<link>http://patw.idv.tw/blog/archives/562?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=iphoneipad-%25e7%25ad%2589%25e8%25a1%258c%25e5%258b%2595%25e8%25a3%259d%25e7%25bd%25ae%25e4%25b8%258a%25e7%259a%2584-audio-%25e6%25a8%2599%25e7%25b1%25a4%25e7%2584%25a1%25e6%25b3%2595%25e8%2587%25aa%25e5%258b%2595%25e6%2592%25ad%25e6%2594%25be-autoplay-%25e8%2588%2587%25e9%25a0%2590%25e8%25bc%2589-prelo</link>
		<comments>http://patw.idv.tw/blog/archives/562#comments</comments>
		<pubDate>Mon, 30 Apr 2012 07:32:53 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[手機版網頁]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[autoplay]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[preload]]></category>
		<category><![CDATA[自動播放]]></category>
		<category><![CDATA[預載]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=562</guid>
		<description><![CDATA[即將上線的 Case 花了不少時間在調校手機網頁與電腦網頁互動的工作，是使用 Nodejs 來達成，但這篇講的主題跟 Nodejs 無關，而是在製作手機版網頁時用到 audio 標籤用以播放音效所遇到的問題。 &#160; 情況描述：Case 中有個互動效果是當使用者開啟手機版網頁後，會進行互動並播放 GIF 動畫（噢，許多舊版本的 Android 裝置是無法播放 GIF 動畫的，這點也要提一下），動畫播放過程中會播放音效。 在 Android 的內建瀏覽器中可自動播放音效，但在 Android 的 Chrome Beta 與 iPhone/iPad 上的 Safari 卻無法正常播放，一點聲音也沒有。而且在桌上型電腦上都可正常地播放。 &#160; 為什麼呢？ 後來查到 Safari 官方的規範文件 Safari HTML5 Audio and Video Guide 中提到： User Control of Downloads Over Cellular Networks In Safari on iOS (for all devices,&#8230;]]></description>
			<content:encoded><![CDATA[<p>即將上線的 Case 花了不少時間在調校手機網頁與電腦網頁互動的工作，是使用 Nodejs 來達成，但這篇講的主題跟 Nodejs 無關，而是在製作手機版網頁時用到 audio 標籤用以播放音效所遇到的問題。</p>
<p>&nbsp;</p>
<p>情況描述：Case 中有個互動效果是當使用者開啟手機版網頁後，會進行互動並播放 GIF 動畫（噢，許多舊版本的 Android 裝置是無法播放 GIF 動畫的，這點也要提一下），動畫播放過程中會播放音效。</p>
<p>在 Android 的內建瀏覽器中可自動播放音效，但在 Android 的 Chrome Beta 與 iPhone/iPad 上的 Safari 卻無法正常播放，一點聲音也沒有。而且在桌上型電腦上都可正常地播放。</p>
<p>&nbsp;</p>
<p>為什麼呢？</p>
<p><span id="more-562"></span></p>
<p>後來查到 Safari 官方的規範文件 <a href="http://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html#//apple_ref/doc/uid/TP40009523-CH5-SW4" target="_blank">Safari HTML5 Audio and Video Guide</a> 中提到：</p>
<blockquote><p><strong>User Control of Downloads Over Cellular Networks</strong></p>
<p>In Safari on iOS (for all devices, including iPad), where the user may be on a cellular network and be charged per data unit, preload and autoplay are disabled. No data is loaded until the user initiates it. This means the JavaScript play() and load() methods are also inactive until the user initiates playback, unless the play() or load() method is triggered by user action. In other words, a user-initiated Play button works, but an onLoad="play()" event does not.</p>
<p>This plays the movie: &lt;input type="button" value="Play" onClick="document.myMovie.play()"&gt;</p>
<p>This does nothing on iOS: &lt;body onLoad="document.myMovie.play()"&gt;</p></blockquote>
<p>這是為了防止使用者使用以量計費的行動網路時，自動播放或預載就會不知不覺地花去網路費用。</p>
<p>除非這個播放是使用者「主動」點擊觸發的，不然設什麼屬性都不會自動播放/預載。</p>
<p>能了解它們的立場，是立意良好啦，但在製作一些需要互動體驗的效果上就會受此限制了。跟<a href="http://buildingwebapps.blogspot.com/2012/04/state-of-html5-audio-in-mobile-safari.html" target="_blank">此篇</a>作者最後的看法一樣，為何不跳出選項（像要求存取 GPS 一樣）讓使用者自由選擇是否要預載/播放聲音呢？</p>
<p>&nbsp;</p>
<p>在我的 Case 中，確實是在使用者「主動觸發」，不過是在觸發播放 GIF 動畫後「一段時間」( 我是用 setTimeout 或是 Nodejs 的偵聽來等待 ) 才會播放聲音，那一樣會被判定為「非使用者主動點擊」。</p>
<p>解法有點取巧，就是「先 play 再 pause，接著再 play 」。</p>
<p>&nbsp;</p>
<p>Code 如下：</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;

&lt;html&gt;
&lt;head runat=&quot;server&quot;&gt;
	&lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;title&gt;測試 audio 標籤於行動裝置瀏覽器能否播放&lt;/title&gt;
        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0&quot;&gt;
        &lt;meta name=&quot;author&quot; content=&quot;patw, Patrick Wang&quot; /&gt;
    	&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			$(document).ready(function() {
				$(&quot;#sound_laugh&quot;)[0].play();
			});

			function playsound()
			{
				$(&quot;#sound_laugh&quot;)[0].play();
				$(&quot;#sound_laugh&quot;)[0].pause();

				setTimeout(function(){
					$(&quot;#sound_laugh&quot;)[0].currentTime = 0;
					$(&quot;#sound_laugh&quot;)[0].play();
				}, 2000);
			}
		&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;

	&lt;audio id=&quot;sound_laugh&quot; preload=&quot;auto&quot; controls=&quot;controls&quot;&gt;
	  &lt;source src=&quot;sound/laugh.mp3&quot;&gt;
	&lt;/audio&gt;

	&lt;p&gt;&lt;input type=&quot;button&quot; value=&quot;播放吧～&quot; style=&quot;width:200px;height:100px;font-size:16pt;&quot; onclick=&quot;javascript:playsound();&quot; /&gt;&lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>主要是 playsound() 這個 function 裡面的 code 啦。<br />
測試過其實用 load() 方法來代替 play() &amp; pause() 也可以，只是在按第二次 playsound 按鈕時會無法再播放一次。<br />
這段 code 在 Android &amp; iPhone (iOS 5.1) &amp; iPad (iOS 4.3.3) 上測試過都可正常播放。</p>
<p>&nbsp;</p>
<p>順帶一提，$(document).ready() 中的這段播放音樂 code，在桌上型電腦、Android 內建瀏覽器上都可以在網頁載入後自動播放的，也許是設計規範上的不同吧。</p>
<p>&nbsp;</p>
<p>OK，這篇就這樣囉。<br />
行動版網頁的製作上許多眉眉角角，除了聲音外還有很多需要注意的細節哩。</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/562/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[JavaScript] 判斷手機為直向或橫向</title>
		<link>http://patw.idv.tw/blog/archives/555?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=javascript-%25e5%2588%25a4%25e6%2596%25b7%25e6%2589%258b%25e6%25a9%259f%25e7%2582%25ba%25e7%259b%25b4%25e5%2590%2591%25e6%2588%2596%25e6%25a9%25ab%25e5%2590%2591</link>
		<comments>http://patw.idv.tw/blog/archives/555#comments</comments>
		<pubDate>Mon, 23 Apr 2012 15:55:06 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[手機版網頁]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[landscape]]></category>
		<category><![CDATA[orientation]]></category>
		<category><![CDATA[portrait]]></category>
		<category><![CDATA[橫向]]></category>
		<category><![CDATA[直向]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=555</guid>
		<description><![CDATA[最近在製作手機版的 Event Site，發現許多眉眉角角的東西要不斷地調校。 iOS 也許還好，頂多就是 iPhone 跟 iPad 的差異。 但 Android 就麻煩多了，要顧及各種版本與螢幕大小。喔對了，還有不同瀏覽器的問題。 本例想利用 JavaScript 來判斷使用者的行動裝置正在使用直向或橫向瀏覽， 若非我們預設的瀏覽方向，需秀出警語或遮罩。 當然也可以選擇 CSS 的方式來製作，可以搜尋 "orientation css" 這樣的關鍵字，可以找到許多做法。 但有時候還是需要 JavaScript 的事件來控制一些流程。 以下是在 SAMSUNG I9100 (Android 4.0.3): 內建瀏覽器、海豚瀏覽器 8.0.0、Chrome Beta 0.18.4409.2396、Opera Mobile 12.00.ADR-1203051631 Sony XPERIA S: 內建瀏覽器 HTC ONE X: 內建瀏覽器 SonyEricsson Xperia Arc S: 內建瀏覽器 Apple iPhone 3GS 內建瀏覽器(Safari) Apple iPhone&#8230;]]></description>
			<content:encoded><![CDATA[<p>最近在製作手機版的 Event Site，發現許多眉眉角角的東西要不斷地調校。<br />
iOS 也許還好，頂多就是 iPhone 跟 iPad 的差異。<br />
但 Android 就麻煩多了，要顧及各種版本與螢幕大小。喔對了，還有不同瀏覽器的問題。</p>
<p>本例想利用 JavaScript 來判斷使用者的行動裝置正在使用直向或橫向瀏覽，<br />
若非我們預設的瀏覽方向，需秀出警語或遮罩。</p>
<p>當然也可以選擇 CSS 的方式來製作，可以搜尋 "orientation css" 這樣的關鍵字，可以找到許多做法。<br />
但有時候還是需要 JavaScript 的事件來控制一些流程。</p>
<p>以下是在</p>
<ul>
<li>SAMSUNG I9100 (Android 4.0.3): 內建瀏覽器、海豚瀏覽器 8.0.0、Chrome Beta 0.18.4409.2396、Opera Mobile 12.00.ADR-1203051631</li>
<li>Sony XPERIA S: 內建瀏覽器</li>
<li>HTC ONE X: 內建瀏覽器</li>
<li>SonyEricsson Xperia Arc S: 內建瀏覽器</li>
<li>Apple iPhone 3GS 內建瀏覽器(Safari)</li>
<li>Apple iPhone 4S 內建瀏覽器(Safari)</li>
<li>Apple iPad2: 內建瀏覽器(Safari)</li>
</ul>
<p>測試過 OK。</p>
<p>以下是 Code:<br />
<span id="more-555"></span></p>
<p>(請先引入 jQuery)</p>
<pre class="brush: jscript; title: ; notranslate">
var checkOrientation = function(){

	    mode = Math.abs(window.orientation) == 90 ? 'landscape' : 'portrait';

	    // 在 Android 上使用 Opera Mobile 測試, 發現要另外這樣判斷
	    if ( $.browser.opera )
	    {
		    width = screen.width;
		    height = screen.height;
		    mode = width &gt; height ? &quot;landscape&quot; : &quot;portrait&quot;;
	    }

        // 本例為希望在使用者用橫向瀏覽時，就秀出遮罩或警示訊息
        if (mode == 'landscape')
        {
           // 警語遮罩 顯示
           $(&quot;#mask&quot;).show();
        } else {
           // 警語遮罩 關閉
           $(&quot;#mask&quot;).hide();
        }
};

window.addEventListener(&quot;resize&quot;, checkOrientation, false);
window.addEventListener(&quot;orientationchange&quot;, checkOrientation, false);
setInterval(checkOrientation, 500);
</pre>
<p>參考資料：</p>
<p>http://stackoverflow.com/questions/1649086/detect-rotation-of-android-phone-in-the-browser-with-javascript</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/555/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Android] 好用的 Chrome 瀏覽器之開發人員工具 &#8211; USB 網頁偵錯功能</title>
		<link>http://patw.idv.tw/blog/archives/545?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=android-%25e5%25a5%25bd%25e7%2594%25a8%25e7%259a%2584-chrome-%25e7%2580%258f%25e8%25a6%25bd%25e5%2599%25a8%25e4%25b9%258b%25e9%2596%258b%25e7%2599%25bc%25e4%25ba%25ba%25e5%2593%25a1%25e5%25b7%25a5%25e5%2585%25b7-usb-%25e7%25b6%25b2%25e9%25a0%2581%25e5%2581%25b5%25e9%258c%25af%25e5%258a%259f%25e8%2583%25bd</link>
		<comments>http://patw.idv.tw/blog/archives/545#comments</comments>
		<pubDate>Sat, 21 Apr 2012 12:59:18 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[手機版網頁]]></category>
		<category><![CDATA[網頁設計]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[USB 網頁偵錯]]></category>
		<category><![CDATA[手機網頁]]></category>
		<category><![CDATA[開發人員工具]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=545</guid>
		<description><![CDATA[最近在 Android 上終於推出繁體中文的 Chrome 測試版瀏覽器，除了不支援 Flash 外，其他部分個人認為都比內建或其他 Android 網頁瀏覽器來的好用。不過只支援 Android 4.0 。 其中更包含「開發人員工具」，讓開發手機版網頁的人可以方便地在電腦上用 Developer Tools 來針對手機上的網頁進行除錯。本篇文章就來簡單介紹一下使用方法。 測試環境： 手機： SAMSUNG i9100 SII (Android 4.0.3) Chrome Beta 0.18.4409.2396 電腦： Windows 7 64bit 已安裝好 Android 驅動程式 首先，在手機上須設定開啟 USB 偵錯。位置在 設定→開發人員工具 裡面。 然後打開 Chrome Beta，進去 設定→開發人員工具，將「啟用 USB 網頁偵錯功能」打開： 而電腦端需有 Android SDK，因為我們要使用其中的 adb.exe 。 還沒有的朋友可以在官方網站下載，解壓縮到特定目錄，本例為 F:\android-sdk\ 。 備好上述工具後，用 USB 線將&#8230;]]></description>
			<content:encoded><![CDATA[<p>最近在 Android 上終於推出繁體中文的 Chrome 測試版瀏覽器，除了不支援 Flash 外，其他部分個人認為都比內建或其他 Android 網頁瀏覽器來的好用。不過只支援 Android 4.0 。</p>
<p>其中更包含「開發人員工具」，讓開發手機版網頁的人可以方便地在電腦上用 Developer Tools 來針對手機上的網頁進行除錯。本篇文章就來簡單介紹一下使用方法。</p>
<p><a href="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19.32.47.png"><img class="alignnone size-medium wp-image-546" style="border-image: initial; border-width: 1px; border-color: black; border-style: solid;" title="2012-04-21 19.32.47" src="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19.32.47-180x300.png" alt="" width="180" height="300" /></a></p>
<p><span id="more-545"></span></p>
<p>測試環境：</p>
<p>手機：</p>
<p>SAMSUNG i9100 SII (Android 4.0.3)</p>
<p>Chrome Beta 0.18.4409.2396</p>
<p>電腦：</p>
<p>Windows 7 64bit</p>
<p>已安裝好 Android 驅動程式</p>
<p>首先，在手機上須設定開啟 USB 偵錯。位置在 設定→開發人員工具 裡面。</p>
<p><a href="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19.31.41.png"><img class="alignnone size-medium wp-image-547" style="border-image: initial; border-width: 1px; border-color: black; border-style: solid;" title="2012-04-21 19.31.41" src="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19.31.41-180x300.png" alt="" width="180" height="300" /></a></p>
<p>然後打開 Chrome Beta，進去 設定→開發人員工具，將「啟用 USB 網頁偵錯功能」打開：</p>
<p><a href="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19.32.47.png"><img style="border-image: initial; border-width: 1px; border-color: black; border-style: solid;" title="2012-04-21 19.32.47" src="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19.32.47-180x300.png" alt="" width="180" height="300" /></a></p>
<p>而電腦端需有 Android SDK，因為我們要使用其中的 adb.exe 。</p>
<p>還沒有的朋友可以在<a href="http://developer.android.com/sdk/index.html" target="_blank">官方網站</a>下載，解壓縮到特定目錄，本例為 F:\android-sdk\ 。</p>
<p>備好上述工具後，用 USB 線將 Android 手機與電腦連接，</p>
<p>然後打開「命令提示字元」(cmd.exe)，切換至 android-sdk 目錄，然後進到 platform-tools 子目錄，鍵入：</p>
<blockquote><p>adb.exe devices</p></blockquote>
<p>如果有正確抓到手機裝置的話，應該會列出像下面資訊：</p>
<blockquote><p>List of devices attached<br />
001ase655ac97e device</p></blockquote>
<p>然後是重頭戲，設定 USB 網頁偵錯功能：</p>
<blockquote><p>F:\android-sdk\platform-tools&gt;adb.exe forward tcp:9222 localabstract:chrome_devtools_remote</p></blockquote>
<p>然後打開瀏覽器，連到 http://localhost:9222 試試看吧！</p>
<p>可以看看介面，就如同 Chrome 電腦版的開發人員工具喔！</p>
<p>就不多介紹操作方法了，真的很方便！</p>
<p>例如我在 Elements 中選擇這個 div 元素：</p>
<p><a href="http://patw.idv.tw/blog/wp-content/uploads/2012/04/chrome-developer-tools.gif"><img class="alignnone size-medium wp-image-548" style="border-image: initial; border-width: 1px; border-color: black; border-style: solid;" title="chrome-developer-tools" src="http://patw.idv.tw/blog/wp-content/uploads/2012/04/chrome-developer-tools-265x300.gif" alt="" width="265" height="300" /></a></p>
<p>這時手機 Chrome 瀏覽器中也會顯示這個區塊被選擇了：</p>
<p><a href="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19.47-1.jpg"><img class="alignnone size-medium wp-image-559" title="2012-04-21-19.47-(1)" src="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19.47-1-180x300.jpg" alt="" width="180" height="300" /></a></p>
<p>&nbsp;</p>
<p>當然也可以即時在電腦上進行修改 CSS 樣式、增加或刪除元素等等的操作，手機 Chrome 瀏覽器上也會立即呈現喔！</p>
<p>更少不了好用的 Console 工具，一樣可以用 console.log 偵錯，或是即時輸入 javascript 執行。</p>
<p>例如在電腦上試著輸入 alert 來輸出 "Hello World from PC" 印出對話框：</p>
<p><a href="http://patw.idv.tw/blog/wp-content/uploads/2012/04/chrome-developer-tools2.gif"><img class="alignnone size-medium wp-image-550" title="chrome-developer-tools2" src="http://patw.idv.tw/blog/wp-content/uploads/2012/04/chrome-developer-tools2-265x300.gif" alt="" width="265" height="300" /></a></p>
<p>手機上也馬上就蹦出來了：</p>
<p><a href="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19.jpg"><img class="alignnone size-medium wp-image-560" title="2012-04-21-19" src="http://patw.idv.tw/blog/wp-content/uploads/2012/04/2012-04-21-19-180x300.jpg" alt="" width="180" height="300" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>這邊還有個介紹影片，有興趣了解的可以看看：</p>
<p><a href="http://www.youtube.com/watch?feature=player_embedded&amp;v=s4zpL4VBbuU">http://www.youtube.com/watch?feature=player_embedded&amp;v=s4zpL4VBbuU</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>利用 Android 的 Chrome 瀏覽器工具，往後進行手機網頁製作時就更方便囉！</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/545/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在 IE9 / IE8 中 Flash 的區塊高度未 100% 顯示的問題</title>
		<link>http://patw.idv.tw/blog/archives/542?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%259c%25a8-ie9-ie8-%25e4%25b8%25ad-flash-%25e7%259a%2584%25e5%258d%2580%25e5%25a1%258a%25e9%25ab%2598%25e5%25ba%25a6%25e6%259c%25aa-100-%25e9%25a1%25af%25e7%25a4%25ba%25e7%259a%2584%25e5%2595%258f%25e9%25a1%258c</link>
		<comments>http://patw.idv.tw/blog/archives/542#comments</comments>
		<pubDate>Fri, 20 Apr 2012 15:05:37 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[網頁設計]]></category>
		<category><![CDATA[100%]]></category>
		<category><![CDATA[aspx]]></category>
		<category><![CDATA[half]]></category>
		<category><![CDATA[height]]></category>
		<category><![CDATA[IE8]]></category>
		<category><![CDATA[IE9]]></category>
		<category><![CDATA[高度]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=542</guid>
		<description><![CDATA[在處理 Flash Event Site 時遇過一個問題，特此紀錄。 於 Chrome 時瀏覽 100% 寬高的 Flash Site 時都很正常，但到了 IE9 / IE8 中測試卻變成下圖這樣，僅有不到一半的區塊大小： 這是一頁 ASP.NET Webform 的頁面，裡面包了 &#60;form id="form1&#8243; runat="server"&#62; 標籤，就是這個 form 標籤在 IE9/8 中的高度解釋造成 Flash 區塊高度無法到達 100% 瀏覽器高度。 解決方法如下： 只要將 form 標籤加上 style="height:100%;" 就解決了。 參考來源： IE 9 flash loads but only half seen, IE flash does not load &#8211; every&#8230;]]></description>
			<content:encoded><![CDATA[<p>在處理 Flash Event Site 時遇過一個問題，特此紀錄。<br />
於 Chrome 時瀏覽 100% 寬高的 Flash Site 時都很正常，但到了 IE9 / IE8 中測試卻變成下圖這樣，僅有不到一半的區塊大小：<br />
<a href="http://patw.idv.tw/blog/wp-content/uploads/2012/04/ie9_flash_form.gif"><img class="alignnone size-medium wp-image-543" title="ie9_flash_form" src="http://patw.idv.tw/blog/wp-content/uploads/2012/04/ie9_flash_form-300x159.gif" alt="" width="300" height="159" /></a></p>
<p>這是一頁 ASP.NET Webform 的頁面，裡面包了 &lt;form id="form1&#8243; runat="server"&gt; 標籤，就是這個 form 標籤在 IE9/8 中的高度解釋造成 Flash 區塊高度無法到達 100% 瀏覽器高度。<br />
解決方法如下：</p>
<p><span id="more-542"></span></p>
<pre class="brush: xml; title: ; notranslate">
&lt;form id=&quot;form1&quot; runat=&quot;server&quot; style=&quot;height: 100%;&quot;&gt;
</pre>
<p>只要將 form 標籤加上 style="height:100%;" 就解決了。</p>
<p>參考來源：<br />
<a href="http://stackoverflow.com/questions/8360467/ie-9-flash-loads-but-only-half-seen-ie-flash-does-not-load-every-other-browse" target="_blank">IE 9 flash loads but only half seen, IE flash does not load &#8211; every other browser works great &#8211; stackOverflow</a></p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/542/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在 IE9 中 ExternalInterface.call 無法作用的解決方法</title>
		<link>http://patw.idv.tw/blog/archives/540?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%259c%25a8-ie9-%25e4%25b8%25ad-externalinterface-call-%25e7%2584%25a1%25e6%25b3%2595%25e4%25bd%259c%25e7%2594%25a8%25e7%259a%2584%25e8%25a7%25a3%25e6%25b1%25ba%25e6%2596%25b9%25e6%25b3%2595</link>
		<comments>http://patw.idv.tw/blog/archives/540#comments</comments>
		<pubDate>Fri, 20 Apr 2012 12:41:41 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[Action Script 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ExternalInterface.call]]></category>
		<category><![CDATA[IE9]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=540</guid>
		<description><![CDATA[由於要在網頁中呼叫 Flash 裡面用 ExternalInterface.addCallback 加入的事件， 除了 HTML 中Flash 物件加入時要設定 id &#038; name，還有 allowScriptAccess params 使其允許、AS 中也要加入 flash.system.Security.allowDomain(sourceDomain) 外， 在不同瀏覽器上也會因為 js 抓取 flash 物件的方式不同而要個別判斷。 Calling a custom FLASH method from IE7 &#38; IE8 &#8211; stackOverflow 提供了一個方法，可通用於 IE, Chrome, Firefox: 然後如果要 call Flash 中的 function 的話可以這樣寫: 就醬子。]]></description>
			<content:encoded><![CDATA[<p>由於要在網頁中呼叫 Flash 裡面用 ExternalInterface.addCallback 加入的事件，<br />
除了 HTML 中Flash 物件加入時要設定 id &#038; name，還有 allowScriptAccess params 使其允許、AS 中也要加入 flash.system.Security.allowDomain(sourceDomain) 外，<br />
在不同瀏覽器上也會因為 js 抓取 flash 物件的方式不同而要個別判斷。</p>
<p><a href="http://stackoverflow.com/questions/3923923/calling-a-custom-flash-method-from-ie7-ie8" target="_blank">Calling a custom FLASH method from IE7 &amp; IE8 &#8211; stackOverflow</a> 提供了一個方法，可通用於 IE, Chrome, Firefox:</p>
<pre class="brush: jscript; title: ; notranslate">
 function thisMovie(movieName) {
     return document[movieName] || window[movieName];
 }
</pre>
<p>然後如果要 call Flash 中的 function 的話可以這樣寫:</p>
<pre class="brush: jscript; title: ; notranslate">
function callExtFunction(g){
	var flash = thisMovie('flash物件的id&amp;name');
	if (flash) { flash.flashFunction名稱(g); }
}
</pre>
<p>就醬子。</p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/540/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Office 2010 的貼上選項只剩「只保留文字」的解法</title>
		<link>http://patw.idv.tw/blog/archives/536?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=office-2010-%25e7%259a%2584%25e8%25b2%25bc%25e4%25b8%258a%25e9%2581%25b8%25e9%25a0%2585%25e5%258f%25aa%25e5%2589%25a9%25e3%2580%258c%25e5%258f%25aa%25e4%25bf%259d%25e7%2595%2599%25e6%2596%2587%25e5%25ad%2597%25e3%2580%258d%25e7%259a%2584%25e8%25a7%25a3%25e6%25b3%2595</link>
		<comments>http://patw.idv.tw/blog/archives/536#comments</comments>
		<pubDate>Sun, 15 Apr 2012 12:51:07 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[Microsoft Office]]></category>
		<category><![CDATA[Office 2010]]></category>
		<category><![CDATA[skype]]></category>
		<category><![CDATA[貼上]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=536</guid>
		<description><![CDATA[最近遇上在 Microsoft Office 2010 中，複製某些東西想要在文件內按右鍵貼上時，原本右鍵選單中的「貼上選項」卻只有一項「只保留文字」，原先應有三個選項：「保持來源格式設定」、「合併格式設定」與「只保留文字」。 情況如圖： 最後在 Microsoft Answers 中找到解法： 若瀏覽器有安裝 Skype Click to Call 外掛的話，會造成這樣的問題，因此只要至控制台的新增移除程式將之移除即可。 &#160; 參考資料： 複製表格 但貼上時變成文字? &#8211; Microsoft Answers Skype conflicts with MS Word? &#8211; Skype Support Network]]></description>
			<content:encoded><![CDATA[<p>最近遇上在 Microsoft Office 2010 中，複製某些東西想要在文件內按右鍵貼上時，原本右鍵選單中的「貼上選項」卻只有一項「只保留文字」，原先應有三個選項：「保持來源格式設定」、「合併格式設定」與「只保留文字」。</p>
<p>情況如圖：<br />
<a href="http://patw.idv.tw/blog/wp-content/uploads/2012/04/office2010-paste.gif"><img class="alignnone size-medium wp-image-537" title="office2010-paste" src="http://patw.idv.tw/blog/wp-content/uploads/2012/04/office2010-paste-215x300.gif" alt="" width="215" height="300" /></a></p>
<p><span id="more-536"></span></p>
<p>最後在 Microsoft Answers 中找到解法：</p>
<p>若瀏覽器有安裝 Skype Click to Call 外掛的話，會造成這樣的問題，因此只要至控制台的新增移除程式將之移除即可。</p>
<p>&nbsp;</p>
<p>參考資料：</p>
<ul>
<li><a href="http://answers.microsoft.com/zh-hant/office/forum/office_2010-word/%E8%A4%87%E8%A3%BD%E8%A1%A8%E6%A0%BC/8afef3bc-9e9b-4a1c-8310-accfb072af08" target="_blank">複製表格 但貼上時變成文字? &#8211; Microsoft Answers</a></li>
<li><a href="http://community.skype.com/t5/Windows/Skype-conflicts-with-MS-Word/m-p/594631#M49196" target="_blank">Skype conflicts with MS Word? &#8211; Skype Support Network</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/536/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Facebook][FQL] 取得使用者 Timeline 封面照片的方法</title>
		<link>http://patw.idv.tw/blog/archives/530?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=facebookfql-%25e5%258f%2596%25e5%25be%2597%25e4%25bd%25bf%25e7%2594%25a8%25e8%2580%2585-timeline-%25e5%25b0%2581%25e9%259d%25a2%25e7%2585%25a7%25e7%2589%2587%25e7%259a%2584%25e6%2596%25b9%25e6%25b3%2595</link>
		<comments>http://patw.idv.tw/blog/archives/530#comments</comments>
		<pubDate>Sat, 31 Mar 2012 09:51:04 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[Facebook]]></category>
		<category><![CDATA[cover]]></category>
		<category><![CDATA[fql]]></category>
		<category><![CDATA[timeline]]></category>
		<category><![CDATA[封面照片]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=530</guid>
		<description><![CDATA[有個需求是要取得使用者 Facebook Timeline 的封面照片(Cover Photo)，就是最上方那一塊啦。 當然，要先透過應用程式取得使用者的 user_photos 權限。 這次用 FQL 來達成目標。 撈到的似乎不一定是使用者目前使用的那張，而是最新的那張： 你也許可以發現這不是最大尺寸的那張，那麼列出全尺寸吧： 第一張就是了。 如果要取得所有的封面照片： 可以在這裡測試： http://developers.facebook.com/docs/reference/rest/fql.query/]]></description>
			<content:encoded><![CDATA[<p>有個需求是要取得使用者 Facebook Timeline 的封面照片(Cover Photo)，就是最上方那一塊啦。<br />
當然，要先透過應用程式取得使用者的 user_photos 權限。</p>
<p>這次用 FQL 來達成目標。</p>
<p><span id="more-530"></span></p>
<p>撈到的似乎不一定是使用者目前使用的那張，而是最新的那張：</p>
<pre class="brush: sql; title: ; notranslate">
SELECT src_big FROM photo WHERE object_id IN (SELECT cover_object_id from album where aid IN (SELECT aid, name FROM album WHERE owner=me() AND name=&quot;Cover Photos&quot;))
</pre>
<p>你也許可以發現這不是最大尺寸的那張，那麼列出全尺寸吧：</p>
<pre class="brush: sql; title: ; notranslate">
SELECT images FROM photo WHERE object_id IN (SELECT cover_object_id from album where aid IN (SELECT aid, name FROM album WHERE owner=me() AND name=&quot;Cover Photos&quot;))
</pre>
<p>第一張就是了。</p>
<p>如果要取得所有的封面照片：</p>
<pre class="brush: sql; title: ; notranslate">
SELECT src_big from photo where aid IN (SELECT aid, name FROM album WHERE owner=me() AND name=&quot;Cover Photos&quot;)
</pre>
<p>可以在這裡測試：<br />
<a href="http://developers.facebook.com/docs/reference/rest/fql.query/" target="_blank">http://developers.facebook.com/docs/reference/rest/fql.query/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/530/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Facebook][ASP.NET] 使用 IE 瀏覽 Facebook 頁籤應用程式時遺失 Session 的解法 &#8211; 使用 P3P Header</title>
		<link>http://patw.idv.tw/blog/archives/525?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=facebookasp-net-%25e4%25bd%25bf%25e7%2594%25a8-ie-%25e7%2580%258f%25e8%25a6%25bd-facebook-%25e9%25a0%2581%25e7%25b1%25a4%25e6%2587%2589%25e7%2594%25a8%25e7%25a8%258b%25e5%25bc%258f%25e6%2599%2582%25e9%2581%25ba%25e5%25a4%25b1-session-%25e7%259a%2584%25e8%25a7%25a3%25e6%25b3%2595-%25e4%25bd%25bf</link>
		<comments>http://patw.idv.tw/blog/archives/525#comments</comments>
		<pubDate>Thu, 08 Mar 2012 05:53:19 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[P3P]]></category>
		<category><![CDATA[Session]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=525</guid>
		<description><![CDATA[其實這個問題在用 PHP 撰寫 Facebook 頁籤應用程式時就遇過，最近在用 ASP.NET 時又遇上了。 測試時使用 Internet Explorer 瀏覽，過程中有使用到 Session，但在送出表單後到下一頁面時 Session 卻遺失了。 &#160; 這是因為 IE 的隱私設定預設會阻擋 iframe 跨域網站的 Cookie，而 ASP.NET 的 Session 需使用 Cookie，因此導致 Session 失效。 解決方法有二，一是請使用者調整瀏覽器隱私設定，但實際案例中不大可能要求每個使用者一一調整。 因此第二條路是，需在程式端下 P3P Header 來告知瀏覽器我們的隱私規範。 ※關於 P3P 的相關說明相當複雜，請自行上網 Google 囉。 &#160; ASP.NET 中可以建立一 Global.asax，加入以下內容： &#160; 參考資料： 使用P3P Header解決跨網域IFrame Session遺失問題 &#8211; 黑暗執行緒 iframe Applications and P3P HTTP Headers&#8230;]]></description>
			<content:encoded><![CDATA[<p>其實這個問題在用 PHP 撰寫 Facebook 頁籤應用程式時就遇過，最近在用 ASP.NET 時又遇上了。<br />
測試時使用 Internet Explorer 瀏覽，過程中有使用到 Session，但在送出表單後到下一頁面時 Session 卻遺失了。</p>
<p>&nbsp;</p>
<p>這是因為 IE 的隱私設定預設會阻擋 iframe 跨域網站的 Cookie，而 ASP.NET 的 Session 需使用 Cookie，因此導致 Session 失效。<br />
<span id="more-525"></span></p>
<p>解決方法有二，一是請使用者調整瀏覽器隱私設定，但實際案例中不大可能要求每個使用者一一調整。<br />
因此第二條路是，需在程式端下 P3P Header 來告知瀏覽器我們的隱私規範。<br />
※關於 P3P 的相關說明相當複雜，請自行上網 Google 囉。</p>
<p>&nbsp;</p>
<p>ASP.NET 中可以建立一 Global.asax，加入以下內容：</p>
<pre class="brush: csharp; title: ; notranslate">
protected void Application_BeginRequest(Object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader(&quot;p3p&quot;, &quot;CP=\&quot;CAO PSA OUR\&quot;&quot;);
}
</pre>
<p>&nbsp;</p>
<p>參考資料：<br />
<a href="http://blog.darkthread.net/post-2011-10-27-p3p-header-and-iframe-session.aspx" target="_blank">使用P3P Header解決跨網域IFrame Session遺失問題 &#8211; 黑暗執行緒</a><br />
<a href="http://forum.developers.facebook.net/viewtopic.php?id=452" target="_blank">iframe Applications and P3P HTTP Headers &#8211; Facebook 開發者論壇</a><br />
<a href="http://support.microsoft.com/kb/323752/zh-tw">如果您在 Internet Explorer 6 中使用 FRAMESET 將會遺失工作階段變數 &#8211; Microsoft 技術支援</a></p>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/525/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ASP.NET][C#] 取得 Youtube 影片觀看次數</title>
		<link>http://patw.idv.tw/blog/archives/521?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=asp-netc-%25e5%258f%2596%25e5%25be%2597-youtube-%25e5%25bd%25b1%25e7%2589%2587%25e8%25a7%2580%25e7%259c%258b%25e6%25ac%25a1%25e6%2595%25b8</link>
		<comments>http://patw.idv.tw/blog/archives/521#comments</comments>
		<pubDate>Thu, 01 Mar 2012 13:38:02 +0000</pubDate>
		<dc:creator>patw</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Youtube]]></category>
		<category><![CDATA[觀看次數]]></category>

		<guid isPermaLink="false">http://patw.idv.tw/blog/?p=521</guid>
		<description><![CDATA[取得 Youtube 影片觀看次數。 參考資料：YouTube APIs and Tools &#8211; Reference Guide: Data API Protocol 使用方法範例： 順便提一下取得縮圖的方式： http://www.reelseo.com/youtube-thumbnail-image/ 可用下面網址取得： http://img.youtube.com/vi/VIDEO_ID/#.jpg # 可以為 0, 1, 2, 3 說明： # 尺寸 第幾張縮圖 0 480×360 1 1 120×90 1 2 120×90 2 3 120×90 3]]></description>
			<content:encoded><![CDATA[<p>取得 Youtube 影片觀看次數。<br />
參考資料：<a href="http://code.google.com/intl/zh-TW/apis/youtube/2.0/reference.html" target="_blank">YouTube APIs and Tools &#8211; Reference Guide: Data API Protocol</a></p>
<p><span id="more-521"></span></p>
<pre class="brush: csharp; title: ; notranslate">
        /// &lt;summary&gt;
        /// 取得 Youtube 影片觀看次數
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;youtubecode&quot;&gt;Youtube 影片碼&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetYoutubeViewcount(string youtubecode)
        {
            string url = string.Format(&quot;http://gdata.youtube.com/feeds/api/videos/{0}?alt=json&quot;, youtubecode);
            System.Net.HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

            try
            {
                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream());
                    string retVal = reader.ReadToEnd();

                    JObject googleSearch = JObject.Parse(retVal);
                    return googleSearch[&quot;entry&quot;][&quot;yt$statistics&quot;][&quot;viewCount&quot;].ToString();
                }
            }
            catch
            {
                return &quot;0&quot;;
            }
        }
</pre>
<p>使用方法範例：</p>
<pre class="brush: csharp; title: ; notranslate">
Response.Write(GetYoutubeViewcount(&quot;RCsCw9Vz7Nc&quot;));
</pre>
<hr />
<p>順便提一下取得縮圖的方式：<br />
<a href="http://www.reelseo.com/youtube-thumbnail-image/" target="_blank">http://www.reelseo.com/youtube-thumbnail-image/</a></p>
<p>可用下面網址取得：</p>
<p>http://img.youtube.com/vi/VIDEO_ID/#.jpg</p>
<p># 可以為 0, 1, 2, 3</p>
<p>說明：</p>
<table width="250" border="1">
<tbody>
<tr>
<th>#</th>
<th>尺寸</th>
<th>第幾張縮圖</th>
</tr>
<tr>
<td>0</td>
<td>480×360</td>
<td>1</td>
</tr>
<tr>
<td>1</td>
<td>120×90</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>120×90</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>120×90</td>
<td>3</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://patw.idv.tw/blog/archives/521/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

