<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-866973865356001297</id><updated>2012-02-04T00:24:12.826-08:00</updated><category term='killProcess'/><category term='Draw 9-patch'/><category term='nexus'/><category term='JML'/><category term='dom'/><category term='relationship'/><category term='list'/><category term='map'/><category term='preference'/><category term='AuthSub'/><category term='android全螢幕'/><category term='avd'/><category term='http'/><category term='asynctask'/><category term='service'/><category term='appcfg'/><category term='mapreduce'/><category term='安裝位置'/><category term='chrome'/><category term='hadoop'/><category term='ip'/><category term='AppWidget'/><category term='picasa'/><category term='ApacheBench'/><category term='css'/><category term='proecss'/><category term='開箱'/><category term='imac'/><category term='deploy error'/><category term='domain'/><category term='servlet'/><category term='eclipse'/><category term='亂碼'/><category term='multiple language'/><category term='boxing'/><category term='menu'/><category term='c++'/><category term='google calendar'/><category term='paper'/><category term='apache'/><category term='狀態列'/><category term='updatePeriodMillis'/><category term='xml'/><category term='key'/><category term='mysql'/><category term='java'/><category term='camera'/><category term='htm'/><category term='datastore'/><category term='jstl'/><category term='adb'/><category term='GAE'/><category term='jsp'/><category term='Facebook Login'/><category term='AlarmManager'/><category term='標題'/><category term='pointer'/><category term='yahoo login'/><category term='default proposals'/><category term='button'/><category term='springmvc'/><category term='unboxing'/><category term='App Engine'/><category term='gae/j'/><category term='sdcard'/><category term='rollback'/><category term='captcha'/><category term='android'/><category term='installLocation'/><category term='adsense'/><category term='html'/><category term='reference'/><category term='drawable'/><category term='session'/><category term='market'/><category term='edittext'/><category term='index'/><category term='selector'/><category term='network'/><category term='screen on/off'/><category term='ubuntu'/><category term='google行事曆'/><category term='progress bar'/><category term='widget'/><category term='thinkpad t410'/><category term='ftp'/><category term='TabActivity'/><category term='bitmap'/><category term='db'/><category term='broadcast receiver'/><category term='Tab'/><title type='text'>Ken Yang 筆記</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.kenyang.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>95</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-5018271437708650720</id><published>2012-01-09T03:44:00.000-08:00</published><updated>2012-01-09T03:49:28.931-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='boxing'/><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><category scheme='http://www.blogger.com/atom/ns#' term='unboxing'/><title type='text'>Java 物件複製的問題</title><content type='html'>不知道大家有沒有發現，&lt;br /&gt;把物件A，設值給B，&lt;br /&gt;當B的值改，A也會改!?!?!?!?!?&lt;br /&gt;&lt;br /&gt;如下：&lt;br /&gt;&lt;pre class="brush: java"&gt;ArrayList&amp;lt;String&amp;gt; A = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;A.add("KenYang");&lt;br /&gt;ArrayList&amp;lt;String&amp;gt; B= A;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;這時候如果我們去印出B的長度，&lt;br /&gt;&lt;pre class="brush: java"&gt;System.out.println(B.size());&lt;br /&gt;&lt;/pre&gt;那會是甚麼？&lt;br /&gt;答案會是1，這無庸置疑，很基本的常識。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;可是如果我把B的第0項刪除，在印出B的長度呢?&lt;br /&gt;&lt;pre class="brush: java"&gt;B.remove(0);&lt;br /&gt;&lt;/pre&gt;不用想，一定變成0。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;那這時候，A的長度呢? 一般人可能會以為是1，&lt;br /&gt;在C++的觀念，的確如此，的確會是1，&lt;br /&gt;但在java不是...&lt;br /&gt;可以印出來看看!&lt;br /&gt;&lt;pre class="brush: java"&gt;System.out.println(A.size());&lt;br /&gt;&lt;/pre&gt;答案會是0!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這是為什麼呢? 為什麼只是修改了B的值，&lt;br /&gt;A也變了??&lt;br /&gt;&lt;br /&gt;這是因為，在java中，非primitive的資料型態，&lt;br /&gt;都屬於物件，都是參考!!! (&lt;a href="http://blog.kenyang.net/2011/11/c-reference.html"&gt;甚麼是參考? 可以去我先前PO的文章看看&lt;/a&gt;)&lt;br /&gt;簡單的說就是別名。&lt;br /&gt;但Java的參考概念就很像C++的pointer!!! (記錄著該物件的位址)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;下面用圖片來解釋，上面code的行為，&lt;br /&gt;下面圖一的行為就是，&lt;br /&gt;&lt;br /&gt;先宣告A，再設值進去。&lt;br /&gt;我們可以從圖發現，A是去參考記憶體位址為0000的物件!!!!&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-U2_4ISSIT8I/TwnkV2GNi6I/AAAAAAAAAlA/LHK5y-mMxcU/s1600/1.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-U2_4ISSIT8I/TwnkV2GNi6I/AAAAAAAAAlA/LHK5y-mMxcU/s320/1.png" width="310" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖一&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;那麼這時候，把A的值丟給B呢?&lt;br /&gt;在記憶體中的表現會是怎樣?&lt;br /&gt;A=B;&lt;br /&gt;如圖二。&lt;br /&gt;會發現B，也是去參考記憶體位址為0000的物件!!!&lt;br /&gt;A和B都是記錄著該物件的記憶體位址!!!&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-MEHF6mbBeSo/TwnkWXT0s5I/AAAAAAAAAlE/6fMbQ6iVgwQ/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="357" src="http://1.bp.blogspot.com/-MEHF6mbBeSo/TwnkWXT0s5I/AAAAAAAAAlE/6fMbQ6iVgwQ/s400/2.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖二&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;所以從圖中應該可以了解上面的行為了吧?&lt;br /&gt;為什麼B把第0項刪除，&lt;br /&gt;結果A也變了呢?&lt;br /&gt;就是因為在JAVA非primitive都是參考的關係!!!&lt;br /&gt;&lt;br /&gt;嗯! 那有人可能會疑問!!!&lt;br /&gt;咦? String 也是非primitive的資料型態阿&lt;br /&gt;可是為什麼下面的例子，B改，A卻沒改呢?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這就要用到先前某篇講解&lt;a href="http://blog.kenyang.net/2012/01/java-unboxingboxing.html"&gt;java拆箱(unboxing)、裝箱(boxing)&lt;/a&gt;的概念了!&lt;br /&gt;那關java拆箱(unboxing)、裝箱(boxing)的甚麼事呢?&lt;br /&gt;還是不了解為什麼兩個都是String的物件，怎麼B改，A卻沒改呢?&lt;br /&gt;來看下面的小例子，&lt;br /&gt;&lt;pre class="brush: java"&gt;String A = "ken";&lt;br /&gt;String B = A;&lt;br /&gt;B = "yang";&lt;br /&gt;System.out.println(A);&lt;br /&gt;&lt;/pre&gt;為什麼不是印出yang呢?&lt;br /&gt;都是primitive阿，&lt;br /&gt;原因就是自動裝箱(auto-boxing)，&lt;br /&gt;上面的行為，在Compiler中，&lt;br /&gt;B="yang" &lt;br /&gt;會被轉換成&lt;br /&gt;B = new String("yang");&lt;br /&gt;這時候他就是全新的物件了!&lt;br /&gt;因此不會改到原本的值!!!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在Java中的複製，&lt;br /&gt;想要做到真正的複製，&lt;br /&gt;得靠clone了。&lt;br /&gt;clone有機會再說吧!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-5018271437708650720?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/5018271437708650720/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2012/01/java.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5018271437708650720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5018271437708650720'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2012/01/java.html' title='Java 物件複製的問題'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-U2_4ISSIT8I/TwnkV2GNi6I/AAAAAAAAAlA/LHK5y-mMxcU/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-3315733830024002043</id><published>2012-01-08T23:19:00.000-08:00</published><updated>2012-01-08T23:45:36.001-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='boxing'/><category scheme='http://www.blogger.com/atom/ns#' term='unboxing'/><title type='text'>Java 拆箱(unboxing)、裝箱(boxing)</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這篇要講到java拆箱(unboxing)、裝箱(boxing)、自動裝箱(auto-boxing)、自動拆箱(auto-unboxing)的概念了，&lt;br /&gt;我舉個小例子來說明何謂拆箱(unboxing)、裝箱(boxing)、自動裝箱(auto-boxing))、自動拆箱(auto-unboxing)，&lt;br /&gt;我用Integer和int來說明。&lt;br /&gt;&lt;pre class="brush: java"&gt;Integer A = new Integer(10);  // 裝箱&lt;br /&gt;int B = A.intValue();   // 拆箱&lt;br /&gt;B = A;    // 自動拆箱&lt;br /&gt;A = 20;    // 自動裝箱&lt;/pre&gt;上面的行為在Compilr中，&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&lt;b&gt;A = 20;&lt;/b&gt;&lt;/span&gt; 會被自動轉換成 &lt;b&gt;&lt;span style="color: #38761d;"&gt;A = new Integer(20);&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;我們稱之為自動裝箱。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #38761d;"&gt;B=A; &lt;/span&gt;&lt;/b&gt;&amp;nbsp;會被自動轉換成&lt;b&gt;&lt;span style="color: #38761d;"&gt; B = A.intValue();&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;稱之為自動拆箱&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;簡單的說，&lt;br /&gt;把primitive轉成物件，稱之為裝箱，&lt;br /&gt;把物件轉乘primitive，稱之為拆箱。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-3315733830024002043?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/3315733830024002043/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2012/01/java-unboxingboxing.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3315733830024002043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3315733830024002043'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2012/01/java-unboxingboxing.html' title='Java 拆箱(unboxing)、裝箱(boxing)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1898992347214354083</id><published>2012-01-08T03:50:00.000-08:00</published><updated>2012-01-08T03:55:19.481-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook Login'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android：Facebook Login API</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;前面有介紹過怎麼在&lt;a href="http://blog.kenyang.net/2012/01/facebook-login.html"&gt;網站上，導入Facebook Login&lt;/a&gt;，&lt;br /&gt;&lt;div&gt;這篇要介紹如何在Android 裝置上，實作Facebook Login!!&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;【&lt;b&gt;第一步】&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;首先先來到&lt;a href="https://developers.facebook.com/apps"&gt;FB Developer後台&lt;/a&gt;，並點選Create New App(右上角)，&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;【第二步】&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://github.com/facebook/facebook-android-sdk/downloads"&gt;下載Facebook SDK&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;【第三步】&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;這步驟主要是在你的project中，include Facebook的lib，這裡大概分兩種方式，&lt;/div&gt;&lt;div&gt;第一種，就是在你已經create好的project上，點右鍵→點properties→選擇Android，&lt;/div&gt;&lt;div&gt;然後最下方有一個Library，然後就可以點選add，再去第二步驟下載的Facebook SDK中找到lib即可。&lt;/div&gt;&lt;div&gt;第二種就是在第二步驟下載的SDK中，&lt;/div&gt;&lt;div&gt;找到 &amp;nbsp;SDK\\facebook\src，&lt;/div&gt;&lt;div&gt;底下應該有一個com資料夾，把資料夾拉進去你的project即可，&lt;/div&gt;&lt;div&gt;（我比較喜歡第二種）&lt;/div&gt;&lt;div&gt;第二種的，你拉進去以後，會看到下面的畫面！（圖一）&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vFuxNuVQx6g/TwmBkQlhEXI/AAAAAAAAAk0/K2yBv6TaRjw/s1600/Capture.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="335" src="http://2.bp.blogspot.com/-vFuxNuVQx6g/TwmBkQlhEXI/AAAAAAAAAk0/K2yBv6TaRjw/s400/Capture.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;【第四步】&lt;/span&gt;&lt;/b&gt; &lt;/div&gt;&lt;div&gt;先去下載&lt;a href="http://sourceforge.net/projects/gnuwin32/files/openssl/0.9.8h-1/"&gt;OpenSSL&lt;/a&gt;，因為待會會用到它來encode hash key，&lt;/div&gt;&lt;div&gt;下載以後解壓縮出來。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;【第五步】&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;記得之前有教過大家，怎麼用keytool產生key吧?(在&lt;a href="http://blog.kenyang.net/2010/05/android-map-key.html"&gt;教學map&lt;/a&gt;的時候有講到)&lt;/div&gt;&lt;div&gt;這裡一樣得利用keytool工具，&lt;/div&gt;&lt;div&gt;大家先打開cmd，&lt;/div&gt;&lt;div&gt;並且切換目錄至你的java sdk資料夾底下的bin!!! (是java sdk唷)&lt;/div&gt;&lt;div&gt;底下就會有一個keytool.exe&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;【第六步】 &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;先看到下面的指令範例以及說明，&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;指令範例：&lt;/div&gt;&lt;div&gt;keytool -exportcert -alias &lt;span style="color: red;"&gt;your_key_alias&lt;/span&gt; -keystore&lt;span style="color: red;"&gt;&amp;nbsp;path_of_keystore&lt;/span&gt;&amp;nbsp;| &lt;span style="color: red;"&gt;path_of_OpenSSL&lt;/span&gt;&amp;nbsp;sha1 -binary |&amp;nbsp; &lt;span style="color: red;"&gt;path_of_OpenSSL&lt;/span&gt;&amp;nbsp;&amp;nbsp;base64 &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;指令說明：&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;your_key_alias&lt;/span&gt;&amp;nbsp;：是你key的alias&lt;/div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;path_of_keystore&lt;/span&gt;&amp;nbsp;：是你keystore的位置，如果這裡你是用.android底下預設的debug.keystore，那如果你Export Sign一個Android App時，是用另一把keystore，到時候如果上傳至market，你的FB登入可能就不能使用，所以必須用同一把，以Android App為主。&lt;/div&gt;&lt;div&gt;(但是!!!! 如果你是在本機開發測試，尚未上傳至market之前，大部分人應該都是直接點選eclipse上的綠色箭頭，然後部屬到Android裝置上吧? 如果是這樣，你的key，還是得用.android底下的預設keystore，因為按下Eclipse上的綠色箭頭，就是用預設的keystore打包的!!! 也就是說你得有兩把keysotre，一把是測試用，一把是正式上線用)&lt;/div&gt;&lt;div&gt;&lt;span style="color: red;"&gt;path_of_OpenSSL&lt;/span&gt;&amp;nbsp;：剛剛下載的OpenSSL位置&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;真實指令（這是我的喔，你複製貼上是沒用的，要改成自己的）&lt;/div&gt;&lt;div&gt;keytool -exportcert -alias &lt;span style="color: red;"&gt;helloKen&lt;/span&gt; -keystore &lt;span style="color: red;"&gt;E:\myProject\M@C\key.keystore&lt;/span&gt; | &lt;span style="color: red;"&gt;C:\openssl-0.9.8h-1-bin\bin\openssl&lt;/span&gt; sha1 -binary | &lt;span style="color: red;"&gt;C:\openssl-0.9.8h-1-bin\bin\openssl&lt;/span&gt; base64&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;完成上面以後，你應該會得到2個key，一個是測試用，一個是正式上線時用的！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;【第七步】&lt;/span&gt;&lt;/b&gt; &lt;/div&gt;&lt;div&gt;去Facebook Developer後台，輸入上面的2把key，&lt;/div&gt;&lt;div&gt;如下圖中的紅色框框，請於Native Android App中填入喔（圖二）&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TZRDzSaDacc/TwmBj-0c62I/AAAAAAAAAkw/tMRZeBopk-4/s1600/Captur2e.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="515" src="http://3.bp.blogspot.com/-TZRDzSaDacc/TwmBj-0c62I/AAAAAAAAAkw/tMRZeBopk-4/s640/Captur2e.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;【第八步】&lt;/span&gt;&lt;/b&gt; &lt;/div&gt;&lt;div&gt;開始寫程式了!!&lt;/div&gt;&lt;div&gt;首先必須加入一個permission，&lt;/div&gt;&lt;div&gt;如下&lt;/div&gt;&lt;div&gt;&lt;pre class="brush: xml"&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;接著宣告一個Facebook的物件!&lt;br /&gt;且必須是global的喔!&lt;br /&gt;如下：&lt;br /&gt;&lt;pre class="brush: java"&gt;Facebook facebook = new Facebook("YOUR_APP_ID");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;下面就是登入的code，看你要寫在哪，例如：按下按鈕去登入（btn.setOnClickListener)，或者一進畫面就登入（onCreate）&lt;br /&gt;&lt;pre class="brush: java"&gt;facebook.authorize(this, new DialogListener() {  &lt;br /&gt;       @Override&lt;br /&gt;       public void onComplete(Bundle values) {} //登入成功會返回至此method&lt;br /&gt;&lt;br /&gt;       @Override&lt;br /&gt;       public void onFacebookError(FacebookError error) {}&lt;br /&gt;&lt;br /&gt;       @Override&lt;br /&gt;       public void onError(DialogError e) {}&lt;br /&gt;&lt;br /&gt;       @Override&lt;br /&gt;       public void onCancel() {}&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最後還有一個步驟！因為上面的code會去trigger一個視窗出來，也就是換畫面，&lt;br /&gt;執行完，還會再返回，所以在原本的Actitivy中的onActivityResult中，必須加入下段code，&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;    @Override&lt;br /&gt;    public void onActivityResult(int requestCode, int resultCode, Intent data) {&lt;br /&gt;        super.onActivityResult(requestCode, resultCode, data);&lt;br /&gt;&lt;br /&gt;        facebook.authorizeCallback(requestCode, resultCode, data);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;這樣就完成了一個在Android上實作Facebook Login！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1898992347214354083?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1898992347214354083/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2012/01/androidfacebook-login-api.html#comment-form' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1898992347214354083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1898992347214354083'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2012/01/androidfacebook-login-api.html' title='Android：Facebook Login API'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-vFuxNuVQx6g/TwmBkQlhEXI/AAAAAAAAAk0/K2yBv6TaRjw/s72-c/Capture.JPG' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6698172694939587130</id><published>2012-01-06T09:34:00.000-08:00</published><updated>2012-01-08T02:39:04.151-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='edittext'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android EditText remove focus</title><content type='html'>只要頁面中有用到EditText&amp;nbsp;&lt;edittext&gt;的，&lt;/edittext&gt;&lt;br /&gt;只要跑到那個頁面，一定會被自動focus，也就是說鍵盤會自動彈開!&lt;br /&gt;要取消focus，只要在你layout中的root element加上下面兩個屬性，&lt;br /&gt;(root element就是最外圍的那個element，預設都是LinearLayout）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;android:focusable="true"&lt;br /&gt;android:focusableInTouchMode="true"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6698172694939587130?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6698172694939587130/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2012/01/android-edittext-remove-focus.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6698172694939587130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6698172694939587130'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2012/01/android-edittext-remove-focus.html' title='Android EditText remove focus'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-7915899893060997473</id><published>2012-01-05T09:20:00.000-08:00</published><updated>2012-01-05T09:53:21.559-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook Login'/><title type='text'>實作Facebook Login 【新版】</title><content type='html'>今天發現前陣子有使用到Facebook登入的案子，&lt;br /&gt;突然掛了! 不能使用Facebook登入了....&lt;br /&gt;去查了一下，原來Facebook API改版....&lt;br /&gt;老實說，我覺得這樣機制很差....應該也保留舊有機制，而不是連通知都沒有就改版了!&lt;br /&gt;&lt;br /&gt;Ok, fine! 其實也沒有太大差別!&lt;br /&gt;主要是改一些參數名稱!&lt;br /&gt;至於前面的註冊手續都相同! 可以來&lt;a href="http://blog.kenyang.net/2011/02/implement-facebook-login.html"&gt;前一篇&lt;/a&gt;看!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;至於coding實作如下，&lt;br /&gt;一樣得嵌入js檔，&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;script src="http://connect.facebook.net/en_US/all.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;接著一樣要init，但是多了一個參數，就是oauth，以及從以前的response.session改成response.authResponse&lt;br /&gt;&lt;pre class="brush: javascript"&gt;&amp;lt;script&amp;gt;&lt;br /&gt; //先做init的動作，輸入自己的app id&lt;br /&gt; FB.init({ &lt;br /&gt;    appId:'你自己的app id', &lt;br /&gt;    cookie:true, &lt;br /&gt;    status:true, &lt;br /&gt;    xfbml:true,&lt;br /&gt;    oauth : true // 多了這個參數&lt;br /&gt; });&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; //下面是實作一個登入的function&lt;br /&gt;function fnLoginFb(){&lt;br /&gt;    FB.login(function(response) {&lt;br /&gt;        //先判斷是否已經登入了，如果是，就直接&lt;br /&gt;        if (response.authResponse){  &lt;br /&gt;            FB.api('/me', function(response) {&lt;br /&gt;                alert(response.email);&lt;br /&gt;            });&lt;br /&gt;        //下面是沒有登入時才會做的，會去subscribe一個event，就是去監聽一個login event（也就是說login成功以後，會接收到訊息）&lt;br /&gt;        }else{&lt;br /&gt;            FB.Event.subscribe('auth.login', function(response) {&lt;br /&gt;                if (response.authResponse) {&lt;br /&gt;                    FB.api('/me', function(response) {&lt;br /&gt;                        alert(response.email);&lt;br /&gt;                    });          &lt;br /&gt;                }&lt;br /&gt;            }); &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }, {scope:'email'});&lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;然後下面就是實作FB登入的按鈕了!&lt;br /&gt;&lt;pre class="brush: html"&gt;&lt;div id="fb-root"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/blogger.g?blogID=866973865356001297#"&gt;&lt;img src="/images/fb_login.jpg" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-7915899893060997473?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/7915899893060997473/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2012/01/facebook-login.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7915899893060997473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7915899893060997473'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2012/01/facebook-login.html' title='實作Facebook Login 【新版】'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8018905766628051915</id><published>2011-12-30T06:25:00.000-08:00</published><updated>2011-12-30T06:46:53.506-08:00</updated><title type='text'>Galaxy Nexus 使用心得</title><content type='html'>Galaxy Nexus 購入了算是第二天！&lt;br /&gt;&lt;br /&gt;玩了兩天，來PO點心得!&lt;br /&gt;到底Android 4.0 ICS和先前Android 2.3以下的裝置，到底有甚麼差別!&lt;br /&gt;以及介紹ICS比較特殊的地方!&lt;br /&gt;&lt;br /&gt;這邊拿Nexus One做比較! &amp;nbsp;(恩，都原生機! 這樣才有比較介面差別的意義!)&lt;br /&gt;底下的照片主要是拿參加GOOGLE ADL送的Flyer拍的...&lt;br /&gt;畫質有點差，有些我沒有對焦，但能表達我要表達的意思就好了~"~&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-yox8rKgQO3I/Tv3NBYCIGmI/AAAAAAAAAg8/u_gJS7__zeg/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="346" src="http://4.bp.blogspot.com/-yox8rKgQO3I/Tv3NBYCIGmI/AAAAAAAAAg8/u_gJS7__zeg/s640/1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="text-align: center;"&gt;側面照，其實Nexus One(上)，比較厚! 以重量來說，Nexus One也比較重! 跟外殼材質也有相關! 畢竟Galaxy Nexus(下)並不是用金屬材質，但老實說，我還是覺得Nexus One摸起來的質感比較好!&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;接著來看Nexus One和Galaxy Nexus在我手上的樣子，因為不少人擔心Galaxy Nexus螢幕很大，一手無法掌握!!!&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;恩，我在男生中的手算大了，算是可以一手hold住Galaxy Nexus，&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;但老實說要一手Key 文字，跟Nexus One比起來，的確會有點ㄍㄧㄥ。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;下面是圖片，可以看一下實際拿起來的樣子!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-dpXQug1cD2U/Tv3M9CeCFPI/AAAAAAAAAgw/xb-_o50zypg/s1600/5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-dpXQug1cD2U/Tv3M9CeCFPI/AAAAAAAAAgw/xb-_o50zypg/s640/5.jpg" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;用右手拿Galaxy Nexus&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tgLb6p1dCTU/Tv3NHSmWPpI/AAAAAAAAAhE/LtrOR6f_ewE/s1600/6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-tgLb6p1dCTU/Tv3NHSmWPpI/AAAAAAAAAhE/LtrOR6f_ewE/s640/6.jpg" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;要去點最左邊的ㄅ鍵時，跟Nexus One相比，的確有點點ㄍㄧㄥ，更別說要碰到左上角了!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;下面是拿Nexus One的樣子&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DrvycCvQeG4/Tv3NMkBODII/AAAAAAAAAhM/tqXw7ExGeOg/s1600/7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-DrvycCvQeG4/Tv3NMkBODII/AAAAAAAAAhM/tqXw7ExGeOg/s640/7.jpg" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;恩，相較起來，Nexus One在我手中變小好多XD &amp;nbsp;應該是A CUP(誤) &amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9xbp5LNVemA/Tv3NY0VME6I/AAAAAAAAAhk/eNQ90Dtt6WI/s1600/8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/-9xbp5LNVemA/Tv3NY0VME6I/AAAAAAAAAhk/eNQ90Dtt6WI/s640/8.jpg" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;可以看到我輕易地碰到ㄅ鍵，也可以輕易地碰到左上角!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;下面要介紹ICS比較特別之處!!!&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;記得Android 2.3以下的裝置，想要擷取手機畫面，必須用Android SDK裡面的DDMS去擷取嗎? 這對一個不懂技術的人來說，的確是一大門檻! 而iPhone就不用，iPhone可以輕易地擷取手機畫面!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;但是!!!!! &lt;/span&gt;&lt;/b&gt;Android 4.0 ICS 有了這項功能了!!!!!!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;只要同時按下音量減少鍵(手機左方)，以及電源鍵(手機右方)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;下面是操作圖&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Y8Of4c5aQvA/Tv3M6gtgxoI/AAAAAAAAAgg/y-8Plp5OSw8/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-Y8Of4c5aQvA/Tv3M6gtgxoI/AAAAAAAAAgg/y-8Plp5OSw8/s400/2.jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;按下手機音量減少鍵(手機左方)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-c-Chrep96M4/Tv3M52cXkRI/AAAAAAAAAgc/aoJ9_o23dEQ/s1600/3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-c-Chrep96M4/Tv3M52cXkRI/AAAAAAAAAgc/aoJ9_o23dEQ/s400/3.jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;以及同時按下手機電源鍵(手機右方)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-g0j0aQwT4vI/Tv3M8W3WQaI/AAAAAAAAAgs/KKkC2jeOsow/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-g0j0aQwT4vI/Tv3M8W3WQaI/AAAAAAAAAgs/KKkC2jeOsow/s400/4.jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;同時按下以後，就會出現此圖，白色框框裡面就是你擷取的圖!! 此範例是擷取我的桌面XD 是Amanda Seyfried!!!!!!!!!!! &amp;gt;//////&amp;lt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;接下來要介紹ICS!!!&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-AJs_jgwPFaQ/Tv3NUtIP11I/AAAAAAAAAhc/rc6KA_bKYAo/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-AJs_jgwPFaQ/Tv3NUtIP11I/AAAAAAAAAhc/rc6KA_bKYAo/s640/9.png" width="360" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;看到上圖有三個框框，紅、橘、藍!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="color: red;"&gt;紅色框框&lt;/span&gt;是Android 2.3以下裝置沒有的!這是虛擬鍵盤，從左到右，分別是BACK, Home, Task，在Android 2.3以下的手機上面，通通都有實體按鍵(BACK,Home,Menu,Search)，偏偏這幾種按鍵，每一家廠商都放得不一樣，有些可能是HOME先，有些可能是BACK先，有些還沒有SEARCH，某支手機還很智障設置了facebook的按鍵..................... 老實說，這對Android系統來說，不是件好事，這樣的usability非常不好!!!! 拜託別荼毒這些end user，end user只會覺得，【靠，android很爛耶，怎都亂擺】! 殊不知，這些都是那些廠商搞得鬼.......所以ICS直接內建了虛擬按鍵，我想就是為了解決這些第三方廠商不統一設置按鍵的問題吧!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;(咦? 我很納悶，現在有實體鍵盤的裝置，將來要更新ICS時，那...不就有兩個鍵盤了嗎? 不過說不定這些廠商又去改Android Kernel，又把虛擬鍵盤改掉.....)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="color: orange;"&gt;橘色框框&lt;/span&gt;算是navigation bar了，有用過iPhone的都知道，使用者可以將APP拖曳到下方，這樣可以方便我們快速使用，現在ICS也有了! 等等會有圖說明!&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="color: blue;"&gt;藍色框框&lt;/span&gt;，哈! 我覺得這是ICS很失敗的地方耶! 這塊是search bar....是不能刪除的== 它永遠都在那!!&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-n9wK8rUc1g0/Tv3NZo9r36I/AAAAAAAAAhs/2Lsfs0a53sA/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-n9wK8rUc1g0/Tv3NZo9r36I/AAAAAAAAAhs/2Lsfs0a53sA/s640/10.png" width="360" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;這張圖，我們可以看到，我可以將APP拖曳到下方的navigation bar，方便我們快速使用!!! 超方便! 但可惜只能放四個!&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tsGYxpKPgRI/Tv3Nju98fLI/AAAAAAAAAh0/LBzzZz_fer0/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-tsGYxpKPgRI/Tv3Nju98fLI/AAAAAAAAAh0/LBzzZz_fer0/s640/11.png" width="360" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;喔，對了，iPhone有分類的功能，就是可以將2個以上的app放在一個資料夾裡面，現在ICS也有了!!! 可以看到這張圖，我把一個名稱為Utility的資料夾，放在navigation bar裏頭!! 點開以後就是圖中的樣子!!&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3ziKAy2ycgw/Tv3Nng869RI/AAAAAAAAAiA/XzQrij67H6M/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-3ziKAy2ycgw/Tv3Nng869RI/AAAAAAAAAiA/XzQrij67H6M/s640/12.png" width="360" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;可以看到這張圖的桌面，我就放了三個資料夾&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-UPPYZPdbRvs/Tv3NnnJCEwI/AAAAAAAAAh8/K3JB1jxCNPg/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/-UPPYZPdbRvs/Tv3NnnJCEwI/AAAAAAAAAh8/K3JB1jxCNPg/s640/13.png" width="360" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;點開某一個，展開來就是長這樣&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RE5fUIU8sfg/Tv3Npb4pKyI/AAAAAAAAAiM/lzA_9EURJhg/s1600/Screenshot_2011-12-30-22-20-43.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-RE5fUIU8sfg/Tv3Npb4pKyI/AAAAAAAAAiM/lzA_9EURJhg/s640/Screenshot_2011-12-30-22-20-43.png" width="360" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;喔，對了，上面有講到Task這個按鍵，在虛擬鍵盤中的最右方，它的作用就是，點了你可以看到最近執行過的程式!!!!&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;用的這幾天，我對ICS還算滿意瞜!!! 至少我很愛它的分類和navigation bar功能!!!&lt;br /&gt;可能是桌面是Amanda Seyfried...也因此讓我更愛它吧!(誤)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8018905766628051915?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8018905766628051915/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/galaxy-nexus_30.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8018905766628051915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8018905766628051915'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/galaxy-nexus_30.html' title='Galaxy Nexus 使用心得'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-yox8rKgQO3I/Tv3NBYCIGmI/AAAAAAAAAg8/u_gJS7__zeg/s72-c/1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1557687315690797071</id><published>2011-12-28T06:32:00.000-08:00</published><updated>2012-01-04T20:46:20.511-08:00</updated><title type='text'>Galaxy Nexus 不專業開箱文</title><content type='html'>&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="text-align: -webkit-auto;"&gt;&amp;nbsp;嘿!期待已久的Galaxy Nexus終於入手了!&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="text-align: -webkit-auto;"&gt;下面是開箱文喔! 相片是拿我去參加Google ADL送的Flyer照的!&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="text-align: -webkit-auto;"&gt;最後還有臉部解鎖的影片 (解鎖很快!!)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fOgQC_AQllw/TwUpCSaeY_I/AAAAAAAAAjI/c_sr1YLHTW4/s1600/IMAG0004.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="345" src="http://4.bp.blogspot.com/-fOgQC_AQllw/TwUpCSaeY_I/AAAAAAAAAjI/c_sr1YLHTW4/s640/IMAG0004.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;手機盒子，和贈送的Android公仔盒子&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-atMy6dWL7vM/TwUpIP8VGNI/AAAAAAAAAjQ/nd4co5kVNS8/s1600/IMAG0005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="346" src="http://2.bp.blogspot.com/-atMy6dWL7vM/TwUpIP8VGNI/AAAAAAAAAjQ/nd4co5kVNS8/s640/IMAG0005.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;打開以後才發現，裡面還有一個盒子，且竟然是第一代的&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-rrlUydg_0mA/TwUpNh5s2AI/AAAAAAAAAjY/SQ9G4thVWs8/s1600/IMAG0006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="346" src="http://2.bp.blogspot.com/-rrlUydg_0mA/TwUpNh5s2AI/AAAAAAAAAjY/SQ9G4thVWs8/s640/IMAG0006.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;在打開才發現，這隻我已經有了! 囧&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JViJOBLQV_w/TwUpS1GsHEI/AAAAAAAAAjg/oIsmvOGE-mc/s1600/IMAG0007.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="346" src="http://3.bp.blogspot.com/-JViJOBLQV_w/TwUpS1GsHEI/AAAAAAAAAjg/oIsmvOGE-mc/s640/IMAG0007.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;手機正面照&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-MeJxdMnzwDk/TwUpZeLl_YI/AAAAAAAAAjo/YK13GZu9IDE/s1600/IMAG0008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="346" src="http://4.bp.blogspot.com/-MeJxdMnzwDk/TwUpZeLl_YI/AAAAAAAAAjo/YK13GZu9IDE/s640/IMAG0008.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;手機背面照! 好有質感&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pa0S5t8PZL0/TwUpftqk66I/AAAAAAAAAjw/PJHrpF8p8CI/s1600/IMAG0009.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-pa0S5t8PZL0/TwUpftqk66I/AAAAAAAAAjw/PJHrpF8p8CI/s640/IMAG0009.jpg" width="346" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;配件(電池，耳機，USB傳輸線)&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lo12_cZQp94/TwUpk6YNxRI/AAAAAAAAAj4/1HHxjcfkChE/s1600/IMAG0010.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/-lo12_cZQp94/TwUpk6YNxRI/AAAAAAAAAj4/1HHxjcfkChE/s640/IMAG0010.jpg" width="346" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;電池轉接頭&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-15LhVOCylc4/TwUpqXgdGQI/AAAAAAAAAkA/ZN-FF_WuLKg/s1600/IMAG0011.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/-15LhVOCylc4/TwUpqXgdGQI/AAAAAAAAAkA/ZN-FF_WuLKg/s640/IMAG0011.jpg" width="346" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;拿在手上的樣子，原本以為會太大! 發現也還好!&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-OLaJS_thgTY/TwUpvBaWUKI/AAAAAAAAAkI/Un_UJwSiwwI/s1600/IMAG0012.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/-OLaJS_thgTY/TwUpvBaWUKI/AAAAAAAAAkI/Un_UJwSiwwI/s640/IMAG0012.jpg" width="346" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;開機照&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-34JajX74fxQ/TwUp0F747wI/AAAAAAAAAkQ/qrJe_sdMH-c/s1600/IMAG0013.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/-34JajX74fxQ/TwUp0F747wI/AAAAAAAAAkQ/qrJe_sdMH-c/s640/IMAG0013.jpg" width="346" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-oWaz4rpDcR4/TwUp5AQcIWI/AAAAAAAAAkY/69f4f62j_xY/s1600/IMAG0015.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-oWaz4rpDcR4/TwUp5AQcIWI/AAAAAAAAAkY/69f4f62j_xY/s640/IMAG0015.jpg" width="346" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;開機比N1快多了&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0ex63Y8YuSA/TwUp9hcsSVI/AAAAAAAAAkg/erbPCx7w2uk/s1600/IMAG0019.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="346" src="http://3.bp.blogspot.com/-0ex63Y8YuSA/TwUp9hcsSVI/AAAAAAAAAkg/erbPCx7w2uk/s640/IMAG0019.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;和它爺爺(Nexus One)的合照! 莫名感傷&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DG5lp931w8E/TwUqCz0ViBI/AAAAAAAAAko/0ZEXRID5-w0/s1600/IMAG0021.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="346" src="http://2.bp.blogspot.com/-DG5lp931w8E/TwUqCz0ViBI/AAAAAAAAAko/0ZEXRID5-w0/s640/IMAG0021.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;下面是臉部解鎖的影片! 解鎖很快! 不到一秒鐘!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-5af4af26afcbc42d" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v16.nonxt1.googlevideo.com/videoplayback?id%3D5af4af26afcbc42d%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331118255%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D65D33C7E46D67A8BD6CA1ACD98141360EA7E38CE.2A64461C139C079E7CBFD7A377B2928E51D0618E%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D5af4af26afcbc42d%26offsetms%3D5000%26itag%3Dw160%26sigh%3DOhz3m_ijbPZNqNXgqnpcd2zDdGk&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v16.nonxt1.googlevideo.com/videoplayback?id%3D5af4af26afcbc42d%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331118255%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D65D33C7E46D67A8BD6CA1ACD98141360EA7E38CE.2A64461C139C079E7CBFD7A377B2928E51D0618E%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D5af4af26afcbc42d%26offsetms%3D5000%26itag%3Dw160%26sigh%3DOhz3m_ijbPZNqNXgqnpcd2zDdGk&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最後可以來&lt;a href="http://blog.kenyang.net/2011/12/galaxy-nexus_30.html"&gt;這篇看我的使用心得&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1557687315690797071?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1557687315690797071/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/galaxy-nexus.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1557687315690797071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1557687315690797071'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/galaxy-nexus.html' title='Galaxy Nexus 不專業開箱文'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-fOgQC_AQllw/TwUpCSaeY_I/AAAAAAAAAjI/c_sr1YLHTW4/s72-c/IMAG0004.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-3299959220114668439</id><published>2011-12-27T04:56:00.000-08:00</published><updated>2011-12-27T04:56:11.022-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='htm'/><title type='text'>Android HttpURLConnection 上傳檔案 (multipart/form-data)</title><content type='html'>在Android實作(模擬)一個form，&lt;br /&gt;不管method是用POST或者GET傳遞普通參數(type="text/password/hidden")，都很簡單!&lt;br /&gt;&lt;br /&gt;那要傳遞type="fiile"的呢?&lt;br /&gt;也就是說要上傳一個檔案呢?&lt;br /&gt;在Android裡面就稍嫌複雜了一點點點點!&lt;br /&gt;&lt;br /&gt;這篇將會結合使用camera，將上傳照相完以後的相片!&lt;br /&gt;至於怎麼&lt;a href="http://blog.kenyang.net/2010/10/android-camera.html"&gt;取得camera的照完相的照片&lt;/a&gt;，可以去看我先前PO的教學! &lt;a href="http://blog.kenyang.net/2010/10/android-camera.html"&gt;來這看!&lt;/a&gt;&lt;br /&gt;這邊就不多說怎麼取得，就假設已經取得照片了!&lt;br /&gt;&lt;br /&gt;我們知道在HTML裡，要上傳含有file的參數，&lt;br /&gt;&amp;lt;form&amp;gt;必須加上enctype="multipart/form-data"&lt;br /&gt;&lt;br /&gt;在實作之前，必須說明一下發出這個form的request的格式會怎樣!&lt;br /&gt;&lt;pre class="brush: xml"&gt;--==============&lt;br /&gt;Content-Disposition: form-data; name="image"; filename="image.jpg"&lt;br /&gt;Content-Type: image/jpeg&lt;br /&gt;&lt;br /&gt;!@#!FAWE@#$!A=fj2j12r&lt;br /&gt;--==============--&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;第一行是&lt;span style="color: #38761d;"&gt;--==============&lt;/span&gt;，&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;是由--加上boundary組成的&lt;br /&gt;boundary很重要! 是用來區隔參數的!!&lt;br /&gt;也就是說，如果裡有很2個參數，&lt;br /&gt;那這2個參數前面都會有這一行!!!&lt;br /&gt;對了，boundary可以自己設定，但是前提是要告訴server你的boundary是甚麼!&lt;br /&gt;等等會說明到! 這裡的boundary假設是===========&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;第二行Content-Disposition: form-data; name="image"; filename="image.jpg"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;這是宣告你的參數名稱，以及他的當案名稱&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;第三行Content-Type: image/jpeg&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;是宣告你的file是甚麼型態，因為我們這邊是拿圖片說明，&lt;br /&gt;所以就是jpeg。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;第四行是空白行，&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;在你寫入參數之前，前面一定是一行空白行&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;第五行!@#!FAWE@#$!A=fj2j12r&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;這行就是資料行了，開始寫入資料，因為是上傳圖片，&lt;br /&gt;所以這樣看一定是亂碼!&lt;br /&gt;如果今天type不是file，是text，&lt;br /&gt;那麼就會是明文!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;第六行&lt;span style="color: #38761d;"&gt;--==============--&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;最後一個參數傳遞完，一定要加上這一行，&lt;br /&gt;告訴server，傳完了!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;了解格式後，現在就來實作，&lt;br /&gt;而在Android的實作如下，&lt;br /&gt;&lt;pre class="brush: java"&gt;	// 先取得圖片&lt;br /&gt;	// uriFilePath是當初設定照相完，要存在哪&lt;br /&gt;	// 如果忘記可以去看文章上面說的教學文&lt;br /&gt;	FileInputStream fileInputStream = new FileInputStream(new File(uriFilePath.getPath()));&lt;br /&gt;&lt;br /&gt;	final String BOUNDARY 	= "==================================";&lt;br /&gt;	final String HYPHENS 	= "--";&lt;br /&gt;	final String CRLF 		= "\r\n";&lt;br /&gt;	URL url 				= new URL("http://xxx.xxx.xxx/uploadImage");	&lt;br /&gt;	HttpURLConnection conn 	= (HttpURLConnection) url.openConnection();&lt;br /&gt;	conn.setRequestMethod("POST");						// method一定要是POST&lt;br /&gt;	conn.setDoOutput(true);&lt;br /&gt;	conn.setDoInput(true);&lt;br /&gt;	conn.setUseCaches(false);	&lt;br /&gt;	&lt;br /&gt;	// 把Content Type設為multipart/form-data&lt;br /&gt;	// 以及設定Boundary，Boundary很重要!&lt;br /&gt;	// 當你不只一個參數時，Boundary是用來區隔參數的	&lt;br /&gt;	conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);&lt;br /&gt;	&lt;br /&gt;	&lt;br /&gt;	// 下面是開始寫參數&lt;br /&gt;	String strContentDisposition = "Content-Disposition: form-data; name=\"image\"; filename=\"image\"";&lt;br /&gt;    String strContentType = "Content-Type: image/jpeg";&lt;br /&gt;	DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());&lt;br /&gt;	dataOS.writeBytes(HYPHENS+BOUNDARY+CRLF);		// 寫--==================================&lt;br /&gt;	dataOS.writeBytes(strContentDisposition+CRLF);	// 寫(Disposition)&lt;br /&gt;	dataOS.writeBytes(contentType+CRLF);			// 寫(Content Type)&lt;br /&gt;	dataOS.writeBytes(CRLF);		&lt;br /&gt;	&lt;br /&gt;	int iBytesAvailable = fileInputStream.available();&lt;br /&gt;	byte[] byteData = new byte[iBytesAvailable];&lt;br /&gt;    int iBytesRead = fileInputStream.read(byteData, 0, iBytesAvailable);&lt;br /&gt;	while (iBytesRead &amp;gt; 0) {&lt;br /&gt;		dataOS.write(byteData, 0, iBytesAvailable);	// 開始寫內容&lt;br /&gt;		iBytesAvailable = fileInputStream.available();&lt;br /&gt;		iBytesRead = fileInputStream.read(byteData, 0, iBytesAvailable);&lt;br /&gt;	}&lt;br /&gt;	dataOS.writeBytes(CRLF);	&lt;br /&gt;	dataOS.writeBytes(HYPHENS+BOUNDARY+HYPHENS);	// (結束)寫--==================================--		&lt;br /&gt;	file.close();&lt;br /&gt;	dataOS.flush();&lt;br /&gt;	dataOS.close();&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;這樣完成了!!&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-3299959220114668439?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/3299959220114668439/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/android-httpurlconnection-multipartform.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3299959220114668439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3299959220114668439'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/android-httpurlconnection-multipartform.html' title='Android HttpURLConnection 上傳檔案 (multipart/form-data)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6445582499441029944</id><published>2011-12-23T09:30:00.000-08:00</published><updated>2011-12-27T04:58:14.259-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android C2DM (二)：流程</title><content type='html'>&lt;br /&gt;Android C2DM的實作步驟大概分為下列三項：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Enabling C2DM &lt;/b&gt;：在Android Device上啟動C2DM準備receive訊息。&lt;/li&gt;&lt;li&gt;&lt;b&gt;Sending a message&lt;/b&gt;：Server傳遞訊息至Device&lt;/li&gt;&lt;li&gt;&lt;b&gt;Receiving a message&lt;/b&gt;：Android上收來自C2DM Server的訊息&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;下面是個三項的說明流程，&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;1. Enabling C2DM&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;首先要先啟動一個registration Intent到C2DM的SERVER (com.google.android.c2dm.intent.REGISTER)，且這Intent必須但兩個參數，第一個是&lt;span style="color: red;"&gt;SENDER ID&lt;/span&gt;，第二個是&lt;span style="color: red;"&gt;application ID&lt;/span&gt;。&lt;a href="http://blog.kenyang.net/2011/12/android-c2dm.html"&gt;參數說明請看這。&lt;/a&gt;&lt;/li&gt;&lt;li&gt;如果這個registration成功了，C2DM的Server會回傳(broadcast)一個&lt;span style="color: red;"&gt;registration ID&lt;/span&gt;，這時候Android applicaiton要把這&lt;span style="color: red;"&gt;registration ID&lt;/span&gt;先存起來，待會用。(Google可能會一段時間就去refresh這個registration ID）&lt;/li&gt;&lt;li&gt;完成註冊以及取得&lt;span style="color: red;"&gt;resgistration ID&lt;/span&gt;以後，Android App必須把此ID傳到自己的server上去。Server一樣得把這ID存起來。&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;註：register ID會存活直到你unregister，或者直到Google refresh為止。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;2. Sending a message&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;在send a message之前，必須確認&lt;b&gt;Android app&lt;/b&gt;和&lt;b&gt;Sever&lt;/b&gt;上已經有&lt;span style="color: red;"&gt;resgistration&amp;nbsp;&amp;nbsp;ID&lt;/span&gt;了，以及Sever必須有&lt;span style="color: red;"&gt;ClientLogin authorization token&lt;/span&gt;. 至於怎麼取得這個token，可以去看&lt;a href="http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html"&gt;Google官網說明&lt;/a&gt;&lt;/li&gt;&lt;li&gt;完成上面的以後，首先，Sever必須先send訊息至C2DM Sever上&lt;/li&gt;&lt;li&gt;Google收到以後，會先存起來，以免Android device是inactive的狀態。&lt;/li&gt;&lt;li&gt;當Device是online的狀態，Google就會send訊息至device上。&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;3. Receiving a Message&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;首先Android OS會先收到這則Message，&lt;/li&gt;&lt;li&gt;接著Android OS會把這則訊息，會根據package name發送到含有註冊com.google.android.c2dm.intent.RECEIVE的app上去&lt;/li&gt;&lt;li&gt;最後，該app就會從自己註冊的RECEIVER的Intent裡收到message，就可以處理資料了。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;下一篇會講如何去實作。&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6445582499441029944?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6445582499441029944/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/android-c2dm_22.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6445582499441029944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6445582499441029944'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/android-c2dm_22.html' title='Android C2DM (二)：流程'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-3142726754910041568</id><published>2011-12-23T08:59:00.000-08:00</published><updated>2011-12-27T04:58:26.210-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android C2DM (一)：元件參數說明</title><content type='html'>&lt;br /&gt;&lt;style type="text/css"&gt;table.sample { width: 600px; border-width: 1px; border-spacing: 2px; border-style: solid; border-color: black; border-collapse: collapse; background-color: white;}table.sample .header { width: 150px; text-align: left; border-width: 1px; padding: 1px; border-style: solid; border-color: black; background-color: white;}table.sample .content { border-width: 1px; padding: 1px; border-style: solid; border-color: black; background-color: white;}&lt;/style&gt;&lt;br /&gt;Android &lt;a href="http://code.google.com/android/c2dm/index.htm"&gt;C2DM &lt;/a&gt;(Android Cloud to Device Messaging)&lt;br /&gt;C2DM是一個framework，用來負責做messaging的，&lt;br /&gt;讓開發者可以從自己的web server傳遞訊息至Android的device上，&lt;br /&gt;是一種push的概念!&lt;br /&gt;詳細介紹就去官網看吧!&lt;br /&gt;這邊主要介紹如何實作，因為發現網路上幾乎都是大陸人在教學，&lt;br /&gt;沒有甚麼台灣人在PO教學，所以來PO一下。&lt;br /&gt;&lt;br /&gt;先介紹三個元件(腳色)&lt;br /&gt;&lt;table border="1" cellpadding="4" class="sample"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;th bgcolor="#99CCFF" colspan="2"&gt;Component&lt;/th&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="header"&gt;Mobile Device&lt;/td&gt;      &lt;td class="content"&gt;搭載著android 2.2以上的手機&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="header"&gt;Third-Party Application Server&lt;/td&gt;      &lt;td class="content"&gt;開發者自己建立的server，它將傳遞訊息給C2DM Server，C2DM再傳遞給Mobile Device。必須建立一個與C2DM Server溝通的管道&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="header"&gt;C2DM Servers &lt;/td&gt;      &lt;td class="content"&gt;屬於Mobile Device與Third-Party Application Server之間的中間腳色，負責與這兩個溝通&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;所需的憑證&lt;br /&gt;&lt;table border="1" cellpadding="4" class="sample"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;th bgcolor="#99CCFF" colspan="2"&gt;Credentials&lt;/th&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="header"&gt;Sender ID&lt;/td&gt;      &lt;td class="content"&gt;開發者的email帳號，這個email帳號會用來註冊一個C2DM的process&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="header"&gt;Application ID&lt;/td&gt;      &lt;td class="content"&gt;簡單的說是package name&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="header"&gt;Registration ID&lt;/td&gt;      &lt;td class="content"&gt;由C2DM servers所發行給device，device拿到此id，必須再傳給Third-Party Application Server(就是我們自己建立的)，server會根據此id判斷是否被認可。&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="header"&gt;Google User Account&lt;/td&gt;      &lt;td class="content"&gt;每隻device上，必須登入Google 帳號&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td class="header"&gt;Sender Auth Token&lt;/td&gt;      &lt;td class="content"&gt;上面四項都是和device相關的，這個是和server相關的，server必須存有ClientLogin Auth token，用來存取Google的service，至於怎麼取得token很簡單，只要向Google的server發出request，就會回傳給你，可以去&lt;a href="http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html#Using"&gt;Google ClientLogin的官網&lt;/a&gt;看，或者可以去我&lt;a href="http://blog.kenyang.net/2011/12/telnet-post.html"&gt;之前發的文&lt;/a&gt;看怎麼用telen發出一個request。這篇將不多做說明。&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-large;"&gt;&lt;b&gt;詳細的流程請看&lt;a href="http://blog.kenyang.net/2011/12/android-c2dm_22.html"&gt;下一篇&lt;/a&gt;。&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-3142726754910041568?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/3142726754910041568/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/android-c2dm.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3142726754910041568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3142726754910041568'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/android-c2dm.html' title='Android C2DM (一)：元件參數說明'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-2804858862369708797</id><published>2011-12-17T07:47:00.000-08:00</published><updated>2011-12-17T08:01:43.560-08:00</updated><title type='text'>Android Life Cycle （二）詳細講解</title><content type='html'>&lt;a href="http://blog.kenyang.net/2011/11/android-lifecycle.html"&gt;前一篇&lt;/a&gt;已經簡略的說明Android Activity Life Cycle，&lt;br /&gt;這篇將詳細說明Activity在Android 裡記憶體life cycle的呈現，&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;假設我有2個 Activity&amp;nbsp;，分別是A(主畫面)、B(子畫面)，&lt;br /&gt;A中有一個按鈕，可以換頁面到B&lt;br /&gt;&lt;pre class="brush: java"&gt;startActivity(new Intent(A.this, B.class));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;B中有一個按鈕，可以換頁面到A&lt;br /&gt;&lt;pre class="brush: java"&gt;startActivity(new Intent(B.this, A.class));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;且A為app進入點&lt;br /&gt;&lt;pre class="brush: java"&gt;&amp;lt;intent-filter &amp;gt;&lt;br /&gt;  &amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&lt;br /&gt;  &amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&lt;br /&gt;&amp;lt;/intent-filter&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;執行此app時，記憶體的表現會如下圖： &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-dlbPjhqBxWg/TuubZRYATLI/AAAAAAAAAaQ/fGxJXl8DYm8/s1600/a4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-dlbPjhqBxWg/TuubZRYATLI/AAAAAAAAAaQ/fGxJXl8DYm8/s320/a4.png" width="281" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pNjJbp9rEKM/TuuawgdQ18I/AAAAAAAAAZ4/KlNmWLLs2Wg/s1600/a1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-pNjJbp9rEKM/TuuawgdQ18I/AAAAAAAAAZ4/KlNmWLLs2Wg/s1600/a1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-pNjJbp9rEKM/TuuawgdQ18I/AAAAAAAAAZ4/KlNmWLLs2Wg/s1600/a1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-pNjJbp9rEKM/TuuawgdQ18I/AAAAAAAAAZ4/KlNmWLLs2Wg/s1600/a1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="326" src="http://3.bp.blogspot.com/-pNjJbp9rEKM/TuuawgdQ18I/AAAAAAAAAZ4/KlNmWLLs2Wg/s400/a1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;如果這時候在A畫面按下換頁面至B的按鈕，&lt;br /&gt;則記憶體的狀態如下圖&lt;br /&gt;A會先去call onPause-&amp;gt;onStop&lt;br /&gt;注意!!! 並沒有onDestroy，A這個物件是還存在的&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果這時候在B畫面按下手機上的"【返回】按鈕，&lt;br /&gt;則記憶體的狀態如下圖&lt;br /&gt;B會先去call onPause -&amp;gt; onStop -&amp;gt; &lt;span style="color: blue;"&gt;onDestroy&lt;/span&gt;&lt;br /&gt;注意!!! 這裡有onDestroy，此時B物件是被銷毀的，&lt;br /&gt;這個情況應該是正常的life cycle，&lt;br /&gt;可是有些人會用換頁的方式(startActivity)回到上一個畫面，&lt;br /&gt;在我的觀念裡，會不建議這樣的行為，繼續往下看!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qoMJj_xRCBc/TuuaxIEhKqI/AAAAAAAAAZ8/DCLpAMb1RSQ/s1600/a2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="276" src="http://1.bp.blogspot.com/-qoMJj_xRCBc/TuuaxIEhKqI/AAAAAAAAAZ8/DCLpAMb1RSQ/s400/a2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果這時候在B畫面，而且想要回到A畫面，&lt;br /&gt;B畫面(下圖)中左上角，有一個自己做的返回按鈕，&lt;br /&gt;則此時這返回按鈕的code為&lt;br /&gt;&lt;pre class="brush: java"&gt;startActivity(new Intent(B.this, A.class));&lt;/pre&gt;&lt;br /&gt;當使用者按下這個按鈕時！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-GIwwGSk0eqI/TuueLiXlvBI/AAAAAAAAAaY/eVsiQXL-Lqk/s1600/device-2011-12-17-033450.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-GIwwGSk0eqI/TuueLiXlvBI/AAAAAAAAAaY/eVsiQXL-Lqk/s400/device-2011-12-17-033450.png" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;則此時記憶體的狀態如下圖！&lt;br /&gt;B會進入到onStop的狀態！&lt;br /&gt;且會有一個新的A畫面（橘色）!!!&lt;br /&gt;則此時舊的A畫面（藍色）就會存在記憶體裡，暫時無法回收....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SjVEDlL6_8o/Tuuax056yzI/AAAAAAAAAaE/lgui8Dzhe0Y/s1600/a3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="281" src="http://1.bp.blogspot.com/-SjVEDlL6_8o/Tuuax056yzI/AAAAAAAAAaE/lgui8Dzhe0Y/s400/a3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;因此不建議用這種方式回到上一個畫面，&lt;br /&gt;會講這篇的原因，是為了稍後的另一篇，&lt;br /&gt;要講解Bitmap recycle和 Out of Memory (OOM)的問題！&lt;br /&gt;在做recycle時，得去考慮到整體life cycle的問題才行！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-2804858862369708797?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/2804858862369708797/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/android-life-cycle.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2804858862369708797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2804858862369708797'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/android-life-cycle.html' title='Android Life Cycle （二）詳細講解'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-dlbPjhqBxWg/TuubZRYATLI/AAAAAAAAAaQ/fGxJXl8DYm8/s72-c/a4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-7024116303736770928</id><published>2011-12-15T07:57:00.000-08:00</published><updated>2011-12-15T07:58:09.474-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='domain'/><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Googe App Engine (GAE) 設定 Domain</title><content type='html'>恩，最近蠻常在GAE上面綁一個DOMAIN，&lt;br /&gt;雖然蠻常操作，可是每次都還是要想一下，才想起來該怎麼用。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在GAE上大概分兩種設定domain，&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;透過Google Apps去買Domain (這種方式在綁domain很簡單)&lt;/li&gt;&lt;li&gt;自己已經有domain了，想要只到我的GAE上去&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;第一種很簡單，就不贅述，&lt;br /&gt;第二種也沒難到哪去，只是要在我們買domain(例如：xxx.com)的地方新增一筆cname&lt;br /&gt;且還要用我們的domain(例如：xxx.com)去申請Google Apps。&lt;br /&gt;然後再verify我們的擁有權！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;流程大概如下：&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-qEmR5Tyxz_Y/TuoWXEpiqkI/AAAAAAAAAYs/WcCJj8COmWU/s1600/1.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-qEmR5Tyxz_Y/TuoWXEpiqkI/AAAAAAAAAYs/WcCJj8COmWU/s400/1.PNG" width="127" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;【步驟一】&lt;br /&gt;先登入到你的ＧＡＥ後台，然後點選你要設定的那個application id，然後在去點選圖中紅色的框框（Application Settings）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-KTRHVJtpp20/TuoWX8OQx5I/AAAAAAAAAY0/nxKNCYtdeIQ/s1600/2.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="83" src="http://2.bp.blogspot.com/-KTRHVJtpp20/TuoWX8OQx5I/AAAAAAAAAY0/nxKNCYtdeIQ/s640/2.PNG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;【步驟二】&lt;br /&gt;點選以後，會看到此張圖，請再點選此圖中的Add Domain&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-MieCzRbjvew/TuoWYtq9HlI/AAAAAAAAAY4/Ge8dRcYBi54/s1600/3.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="192" src="http://4.bp.blogspot.com/-MieCzRbjvew/TuoWYtq9HlI/AAAAAAAAAY4/Ge8dRcYBi54/s640/3.PNG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;【步驟三】&lt;br /&gt;點完按鈕以後會看到此張圖，請先點選圖中的紅色框框（要先用自己的domain去註冊Google Apps）&lt;br /&gt;ps: 綠色框框等等會用到&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8iiXp1bzKxQ/TuoWZs9PFOI/AAAAAAAAAZA/xYSnfvTTIPg/s1600/4.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="252" src="http://2.bp.blogspot.com/-8iiXp1bzKxQ/TuoWZs9PFOI/AAAAAAAAAZA/xYSnfvTTIPg/s640/4.PNG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;【步驟四】&lt;br /&gt;點選以後會看到此圖，請在圖中的輸入框輸入您的domain，（例如：xxx.com）&lt;br /&gt;填寫完以後，請點選Submit按鈕&lt;br /&gt;點完按鈕以後，會要求你輸入資料&lt;br /&gt;輸入完就點選送出&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-dHi6mQ5lY4M/TuoWaklmzHI/AAAAAAAAAZM/2i4VjcDnr9U/s1600/5.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="266" src="http://1.bp.blogspot.com/-dHi6mQ5lY4M/TuoWaklmzHI/AAAAAAAAAZM/2i4VjcDnr9U/s640/5.PNG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;【步驟五】&lt;br /&gt;之後會看到此畫面，會要求您驗證domain&lt;br /&gt;有很多種驗證方式，這邊就不教了，因為很簡單。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xWMZNlkcZds/TuoXsWT16xI/AAAAAAAAAZs/RHOgXrSgADM/s1600/6.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="310" src="http://4.bp.blogspot.com/-xWMZNlkcZds/TuoXsWT16xI/AAAAAAAAAZs/RHOgXrSgADM/s400/6.PNG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;【步驟六】&lt;br /&gt;記得步驟三的綠色框框嗎？請回到那，並在那個框框輸入您的domain名稱（例如：xxx.com）&lt;br /&gt;接著就會看到這個畫面，就輸入步驟四時填入的管理者帳號資訊&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-aU7kdYBZpOQ/TuoWcGmszhI/AAAAAAAAAZY/fdXkABFfnxY/s1600/7.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="232" src="http://2.bp.blogspot.com/-aU7kdYBZpOQ/TuoWcGmszhI/AAAAAAAAAZY/fdXkABFfnxY/s640/7.PNG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;【步驟七】&lt;br /&gt;登入成功以後就會看到此畫面，就點選此圖中的紅色框框&lt;br /&gt;輸入您的sub-domain名稱，（例如：www）&lt;br /&gt;接著你就會有一列資料是www.xxx.com&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-FJQhQeOM4bo/TuoWc5xTM4I/AAAAAAAAAZg/vv1drEI-9lM/s1600/8.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="171" src="http://4.bp.blogspot.com/-FJQhQeOM4bo/TuoWc5xTM4I/AAAAAAAAAZg/vv1drEI-9lM/s640/8.PNG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;【步驟八】&lt;br /&gt;最後一步了，去到您購買domain的管理後台，這邊是以hinet為主，在後台上新增一筆cname，&lt;br /&gt;且value為ghs.google.com&lt;br /&gt;主機名稱（sub-domain）就是剛剛步驟七填寫的值&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-7024116303736770928?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/7024116303736770928/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/googe-app-engine-gae-domain.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7024116303736770928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7024116303736770928'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/googe-app-engine-gae-domain.html' title='Googe App Engine (GAE) 設定 Domain'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-qEmR5Tyxz_Y/TuoWXEpiqkI/AAAAAAAAAYs/WcCJj8COmWU/s72-c/1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-150831311090404858</id><published>2011-12-12T10:44:00.000-08:00</published><updated>2011-12-12T14:33:30.106-08:00</updated><title type='text'>如何用Telnet POST資料</title><content type='html'>有極少數的網站開發者，&lt;br /&gt;在處理有關input資料時，只會在client端進行validate（用Javascript），&lt;br /&gt;往往忽略了server端的驗證。&lt;br /&gt;&lt;br /&gt;如果這時候，hacker寫個小軟體利用telnet發送一個post到你的server，&lt;br /&gt;那就爆了!&lt;br /&gt;當然，hacker也可以直接寫個form，然後action是對你的server，&lt;br /&gt;這樣就避掉client端的js，只不過這邊要說明怎麼用telnet去發出一個request。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;假設對方做一個輸入mail的page，&lt;br /&gt;然後該page有驗證，如果你輸入不是mail的格式，&lt;br /&gt;就不會將資料傳到他的server，以及新增至DB。&lt;br /&gt;這時候我們就可以利用telnet，跳過他前端的驗證機制!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;首先打開你的cmd!&lt;br /&gt;&lt;br /&gt;接著輸入下圖中的指令：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-3Q5xiAZwjPY/TuZIO7ov11I/AAAAAAAAAYU/Q2RQKz0vGIg/s1600/1.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="48" src="http://4.bp.blogspot.com/-3Q5xiAZwjPY/TuZIO7ov11I/AAAAAAAAAYU/Q2RQKz0vGIg/s400/1.PNG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;恩，上圖中的網址，記得改成連線的網址，圖中只是範例，&lt;br /&gt;你連不到的！&lt;br /&gt;&lt;br /&gt;連到以後，按下鍵盤的&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: large;"&gt;CTRL+]&lt;/span&gt;　按鍵&lt;br /&gt;接著輸入下圖中的指令，set localecho，輸入完成，按2下enter，&lt;br /&gt;這段的目的是讓你等等輸入指令時看得到自己在輸入甚麼，&lt;br /&gt;如果沒有這段，等等輸入指令，你是看不到自己在打啥！&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-OipJ3-j6jOI/TuZIPZO6UBI/AAAAAAAAAYY/iCJeMLTTC1o/s1600/2.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="151" src="http://3.bp.blogspot.com/-OipJ3-j6jOI/TuZIPZO6UBI/AAAAAAAAAYY/iCJeMLTTC1o/s400/2.PNG" style="cursor: move;" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著就可以輸入發送POST的指令了！可以看下圖！&lt;br /&gt;建議你，先在記事本上打一打，再貼上，因為在CMD輸入錯了，&lt;br /&gt;是不能按DELETE或者Backspace的&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CjCQk5V-DRk/TuZIP39S0WI/AAAAAAAAAYg/RWNn_jH76UM/s1600/3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="169" src="http://1.bp.blogspot.com/-CjCQk5V-DRk/TuZIP39S0WI/AAAAAAAAAYg/RWNn_jH76UM/s640/3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;第一行，記得是POST，然後/yyyy，就是你要收資料的page，要改成自己的喔!&lt;br /&gt;第二行，HOST就是主機名稱，&lt;br /&gt;第三行，就是告訴server，會有表單的資料傳遞過來&lt;br /&gt;&lt;form&gt;第四行，content-lengh，就是你要傳的資料有多長，因為我們的資料是mail=88811，所以是10&lt;br /&gt;第五行，就是response完，連線就斷掉。&lt;br /&gt;&lt;br /&gt;上面都是http header，當然還有很多，你可以自己偽造!&lt;br /&gt;例如cookie、date等等之類的!&lt;br /&gt;記得header與data之間要空一行空白，&lt;br /&gt;接著才可以輸入資料&lt;br /&gt;就是圖中的mail=88811。&lt;br /&gt;這樣就完成了，你就輸入一個不是正確mail格式的mail給他!&lt;br /&gt;且如果他 server沒有進行驗證，這時候就錯誤了!&lt;br /&gt;當然你可以把mail的問題放大，可能是sql injection，或者是XSS之類的問題!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-150831311090404858?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/150831311090404858/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/telnet-post.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/150831311090404858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/150831311090404858'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/telnet-post.html' title='如何用Telnet POST資料'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-3Q5xiAZwjPY/TuZIO7ov11I/AAAAAAAAAYU/Q2RQKz0vGIg/s72-c/1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-7556462586220192804</id><published>2011-12-11T14:31:00.001-08:00</published><updated>2011-12-12T08:57:27.914-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><title type='text'>Chrome 防範XSS機制</title><content type='html'>&lt;span class="Apple-style-span" style="background-color: white; color: red; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;Refused to execute a JavaScript script. Source code of script found within request.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;恩，今天再做一個準備Demo何謂XSS攻擊的網頁，&lt;br /&gt;發現用Chrome開啟該網頁時，所有的攻擊都無效!!!!!!&lt;br /&gt;去看了一下Console，發現出現了下列的訊息&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; color: red; font-family: Consolas, 'Lucida Console', monospace; font-size: 12px; white-space: pre-wrap;"&gt;Refused to execute a JavaScript script. Source code of script found within request.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;才知道原來在Chrome裡面，只要request裡面含有JS code的，且只要有print出來的，都會被擋掉!!!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;不知道是在第幾版才有的，感覺Chrome太聰明也不是好事，&lt;/div&gt;&lt;div&gt;認為還是有些事情是developer該懂的，&lt;/div&gt;&lt;div&gt;當然!!! 這樣的機制對end user來說是好事! 至少不會被攻擊!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-7556462586220192804?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/7556462586220192804/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/chrome-xss.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7556462586220192804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7556462586220192804'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/chrome-xss.html' title='Chrome 防範XSS機制'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6440667903239768547</id><published>2011-12-08T03:50:00.001-08:00</published><updated>2011-12-11T14:31:42.886-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Hadoop DataNode 無法啟動</title><content type='html'>好久沒碰Hadoop，今天要重新跑一次project，&lt;br /&gt;發現怪怪的，怎麼連都連不上，&lt;br /&gt;就連到server上，&lt;br /&gt;下了指令jps，看一下是否都正常啟動，&lt;br /&gt;發現DataNode沒有啟動!&lt;br /&gt;&lt;br /&gt;找了一下解決方式，&lt;br /&gt;把預設的hadoop.tmr.dir資料夾先砍掉，假設我放在/appKen/hadoop/tmp&lt;br /&gt;那就下指令：rm -rf tmp (rf意思是底下所有資料都砍掉)&lt;br /&gt;&lt;br /&gt;再來就是重新format NameNode，&lt;br /&gt;指令：hadoop namenode -format&lt;br /&gt;&lt;br /&gt;接著就在啟動一次，&lt;br /&gt;指令：start-all.sh&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6440667903239768547?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6440667903239768547/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/hadoop-datanode.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6440667903239768547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6440667903239768547'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/hadoop-datanode.html' title='Hadoop DataNode 無法啟動'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-2706772206684782704</id><published>2011-12-08T01:04:00.000-08:00</published><updated>2011-12-11T14:31:55.372-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='list'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android ListView cacheColorHint</title><content type='html'>&lt;br /&gt;在Android中實作ListView的時候，&lt;br /&gt;如果要customize一個畫面比較漂亮的ListView，&lt;br /&gt;可能會用到Background，如下圖（圖一）&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-GDs-YW3SsIo/Tt6rsL-FQMI/AAAAAAAAAYE/JKRq0y4sLek/s1600/p1.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto; text-align: left;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-GDs-YW3SsIo/Tt6rsL-FQMI/AAAAAAAAAYE/JKRq0y4sLek/s400/p1.png" width="240" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖一&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;但是如果再做上下滾動的時候你會發現，背景圖片不見了!&lt;br /&gt;背景會變成黑色!　且還會有點卡卡的感覺。&lt;br /&gt;如下圖（圖二）。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3JAqS4L3IQc/Tt6rtFwR9CI/AAAAAAAAAYI/ueVgGYgFiSg/s1600/p2.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-3JAqS4L3IQc/Tt6rtFwR9CI/AAAAAAAAAYI/ueVgGYgFiSg/s400/p2.png" width="240" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖二&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;原因在於Android在ListView 的Background會做一個Optimization的動作，&lt;br /&gt;就是利用一個attributes，&lt;span class="Apple-style-span" style="background-color: white; color: #007000; font-family: monospace; font-size: 13px; line-height: 13px;"&gt;android:cacheColorHint&lt;/span&gt;&lt;br /&gt;default值就是現在的顏色dark，&lt;br /&gt;為了要關掉這個Optimization，只要把&lt;span class="Apple-style-span" style="background-color: white; color: #007000; font-family: monospace; font-size: 13px; line-height: 13px;"&gt;android:cacheColorHint&lt;/span&gt;改成如下，&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #007000; font-family: monospace; font-size: 13px; line-height: 13px;"&gt;android:cacheColorHint="#00000000"&lt;/span&gt;&lt;br /&gt;這樣就不會發生上述的問題了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-2706772206684782704?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/2706772206684782704/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/12/android-listview-cachecolorhint.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2706772206684782704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2706772206684782704'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/12/android-listview-cachecolorhint.html' title='Android ListView cacheColorHint'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-GDs-YW3SsIo/Tt6rsL-FQMI/AAAAAAAAAYE/JKRq0y4sLek/s72-c/p1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-2683103423884522050</id><published>2011-11-22T04:30:00.000-08:00</published><updated>2011-12-17T07:47:20.081-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Lifecycle （一）入門講解</title><content type='html'>每次都會有點忘記這個lifecycle，&lt;br /&gt;總是只記得大概，詳細都會忘記==&lt;br /&gt;然後就要自己用LOG來看甚麼情況下會進到這些狀態。&lt;br /&gt;這次就乾脆整理一下記錄起來。&lt;br /&gt;&lt;br /&gt;當activity進行換頁時，會先進入 &amp;nbsp; &amp;nbsp; &amp;nbsp;onPause() -&amp;gt; onStop()&lt;br /&gt;按下手機上返回按鈕時，會先進入&amp;nbsp;onPause()&amp;nbsp;-&amp;gt; onStop()&amp;nbsp;-&amp;gt; onDestroy()&lt;br /&gt;按下手機HOME按鈕時，會先進入&amp;nbsp;onPause()&amp;nbsp;-&amp;gt; onStop()&lt;br /&gt;&lt;br /&gt;當先前已經按過HOME鈕，再次點APP，會進入到 &amp;nbsp;onRestart()&lt;br /&gt;當先前換頁，再按下返回鈕，也會進入到&amp;nbsp;onRestart()&lt;br /&gt;當先前按下返回鈕，再點APP，則會進入到 onCreate()&lt;br /&gt;&lt;br /&gt;其實GOOGLE有一張自己的流程圖拉，&lt;br /&gt;只是我覺得光看流程圖，還是無法知道實際情況發生時，會進到那些狀態。&lt;br /&gt;但就搭配著圖看瞜!&lt;br /&gt;&lt;br /&gt;這篇是比較基本的，想看Activity在Memory中的流程可以看這篇，&lt;a href="http://blog.kenyang.net/2011/12/android-life-cycle.html"&gt;點我點我點我&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-HX46mAOTqII/Tsq4Bh4g6BI/AAAAAAAAAX8/QvddYPeG8fA/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-HX46mAOTqII/Tsq4Bh4g6BI/AAAAAAAAAX8/QvddYPeG8fA/s1600/Untitled.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-2683103423884522050?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/2683103423884522050/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/11/android-lifecycle.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2683103423884522050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2683103423884522050'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/11/android-lifecycle.html' title='Android Lifecycle （一）入門講解'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-HX46mAOTqII/Tsq4Bh4g6BI/AAAAAAAAAX8/QvddYPeG8fA/s72-c/Untitled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-4019396931989245299</id><published>2011-11-17T12:11:00.001-08:00</published><updated>2011-12-11T14:32:06.779-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java Thread: run() vs start()</title><content type='html'>Java Thread: run() vs start()&lt;br /&gt;&lt;br /&gt;剛在寫ANDROID，在使用到 audioRecord，所以用到了thread!&lt;br /&gt;突然忘記要用run呢? 還是要用start?&lt;br /&gt;查了一下資料，才找出差異性。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;使用run呢，他是循序性的，也就是說他會跑完run裡面的程式，才會跳脫。&lt;br /&gt;而start不是。&lt;br /&gt;用個簡單的範例說明一下：&lt;br /&gt;&lt;pre class="brush: java"&gt;Thread t1 = new Thread(new Runnable() {&lt;br /&gt; @Override&lt;br /&gt; public void run() {&lt;br /&gt;  for (int i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;   System.out.println("t1");&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;Thread t2 = new Thread(new Runnable() {&lt;br /&gt; @Override&lt;br /&gt; public void run() {&lt;br /&gt;  for (int i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;   System.out.println("t2");&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;上面我們宣告了2個thread，一個是t1，一個是t2。&lt;br /&gt;都做完一千次才會停止。&lt;br /&gt;他們分別會去印出自己是t1還是t2。&lt;br /&gt;&amp;nbsp;如果我們是使用run，如下：&lt;br /&gt;&lt;pre class="brush: java"&gt;t1.run();&lt;br /&gt;t2.run();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;那麼印出來的值一定是像下面一樣&lt;br /&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;t1 -&amp;gt; t1&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;-&amp;gt; t1 -&amp;gt; .........t1 -&amp;gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;nbsp;t2 -&amp;gt; t2 -&amp;gt; ......t2&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;　&lt;/span&gt;&lt;br /&gt;會先印完1000次的t1，才開始印1000次的t2。但如果我們是使用start，如下：&lt;br /&gt;&lt;pre class="brush: java"&gt;t1.start();&lt;br /&gt;t2.start();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;結果就會相互交叉，&lt;br /&gt;可能是&lt;span class="Apple-style-span" style="color: red;"&gt;t1&lt;/span&gt;-&amp;gt;&lt;span class="Apple-style-span" style="color: red;"&gt;t1&lt;/span&gt;-&amp;gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;t2&lt;/span&gt;-&amp;gt;&lt;span class="Apple-style-span" style="color: red;"&gt;t1&lt;/span&gt;-&amp;gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;t2&lt;/span&gt;..........&lt;br /&gt;以此類推。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-4019396931989245299?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/4019396931989245299/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/11/java-thread-run-vs-start.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4019396931989245299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4019396931989245299'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/11/java-thread-run-vs-start.html' title='Java Thread: run() vs start()'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-7857555924574928839</id><published>2011-11-16T08:40:00.001-08:00</published><updated>2011-11-16T09:45:45.622-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='reference'/><title type='text'>C++: Reference (參考)</title><content type='html'>C++: Reference (參考)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.kenyang.net/2011/11/c-pointer.html"&gt;前面一篇講了pointer&lt;/a&gt;，這篇要講只有C++才有的reference，&lt;br /&gt;C是沒有reference的，相較於pointer，reference顯得平易近人多了!&lt;br /&gt;reference有個很大的特性，它的意思是&lt;b&gt;別名(alias)&lt;/b&gt;的意思!&lt;br /&gt;reference不像pointer記錄著變數的記憶體位置，它只是變數的&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;別名&lt;/b&gt;&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;下面用個簡單的例子講解：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c++"&gt;int iValue = 2;&lt;br /&gt;int &amp;amp;iReference = iValue;&lt;br /&gt;cout &amp;lt;&amp;lt; iReference &amp;lt;&amp;lt; endl;   //會印出2&lt;br /&gt;cout &amp;lt;&amp;lt; &amp;amp;iReference &amp;lt;&amp;lt; endl;  //會印出iValue 的記憶體位置&lt;br /&gt;cout &amp;lt;&amp;lt; &amp;amp;iValue &amp;lt;&amp;lt; endl;　　　 //會印出iValue本身自己的記憶體位置&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上面的範例宣告了一個整數變數（iValue)，和一個參考變數（iReference)第一行會先印出2，&lt;br /&gt;因為前面說過參考只是別名，意思就是說iReference是iValue的別名，&lt;br /&gt;在白話一點iReference等於iValue，&lt;br /&gt;所以第二行會印出iReference(也就是iValue)的記憶體位置，假設印出0x28ff44（每台電腦都不一定是這個值）&lt;br /&gt;第三行就是印出iValue自己的記憶體位置，所以！！！它也會印出0x28ff44!! 跟第二行一樣!!&amp;nbsp;(因為他們兩個相等咩)&lt;br /&gt;&lt;br /&gt;reference跟pointer不一樣的還有幾點，&lt;br /&gt;reference一定要有初始值!!!&lt;br /&gt;取值不需要加上*!!&lt;br /&gt;&lt;br /&gt;不過其實參考使用的時機大部分是用在函數時，因為是別名，所以可以避免複製大量的變數到函數去(就算是pointer函數，也會複製)&lt;br /&gt;下面是一個簡單的參考函數範例：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c++"&gt;void fnReference(int &amp;amp;iValue){&lt;br /&gt;     iValue = iValue +1;&lt;br /&gt;     cout &amp;lt;&amp;lt; iValue &amp;lt;&amp;lt; endl;        &lt;br /&gt;}&lt;br /&gt;main(){  &lt;br /&gt;          &lt;br /&gt;     int iValue = 2;&lt;br /&gt;     fnReference(iValue);&lt;br /&gt;     cout &amp;lt;&amp;lt; iValue &amp;lt;&amp;lt; endl;&lt;br /&gt;        &lt;br /&gt;     system("pause");&lt;br /&gt;     return 0; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;在上面的範例我們宣告了一個函數（fnReference），其傳遞參數為參考型態（&amp;amp;iValue）&lt;br /&gt;在主程式中(main)，傳遞了單純的整數變數進去，&lt;br /&gt;跟pointer不一樣，pointer是傳記憶體位置進去，&lt;br /&gt;參考就直接傳普通的變數進去，&lt;br /&gt;我們在函數中把傳遞進去的參數+1，然後印出，會印出3，&lt;br /&gt;回到主程式以後，在印出iValue，一樣會印出3。&lt;br /&gt;因為我們是傳遞參考，這就是call by reference！&lt;br /&gt;&lt;br /&gt;最後，reference還有一個跟pointer不一樣的點！&lt;br /&gt;就是reference不能用來進行運算!!!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-7857555924574928839?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/7857555924574928839/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/11/c-reference.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7857555924574928839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7857555924574928839'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/11/c-reference.html' title='C++: Reference (參考)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-847626276780100795</id><published>2011-11-16T05:45:00.000-08:00</published><updated>2011-11-16T09:46:00.489-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='pointer'/><title type='text'>C++: pointer (指標)</title><content type='html'>學C/C++，我想pointer(指標)是最大的門檻吧!&lt;br /&gt;這也是大部分人學C/C++，最痛的東西吧!&lt;br /&gt;這篇就稍為的講解pointer!&lt;br /&gt;&lt;br /&gt;pointer是專門用來儲存&lt;b&gt;某變數&lt;/b&gt;的&lt;b&gt;記憶體位置&lt;/b&gt;!&lt;br /&gt;每宣告一個pointer時，就會配置一塊&lt;b&gt;4 bytes&lt;/b&gt;的記憶體空間，&lt;br /&gt;專門用來儲存某變數的記憶體位置。&lt;br /&gt;下面用簡單的code來說明，&lt;br /&gt;&lt;pre class="brush: c++"&gt;int iValue = 10;&lt;br /&gt;int *iPointer = &amp;amp;iValue;&lt;br /&gt;&lt;br /&gt;printf("iPointer的value=%d \r\n"            ,  *iPointer);      //取值要用* &lt;br /&gt;printf("iPointer儲存value的address=%X \r\n" ,  iPointer);       //沒有*就是印出本身儲存的記憶體位置   &lt;br /&gt;printf("iPointer本身的address=%X \r\n"      ,  &amp;amp;iPointer);      //取得記憶體位置都是用&amp;amp; &lt;br /&gt;printf("iValue  本身的address=%X \r\n"      ,  &amp;amp;iValue);        //取得記憶體位置都是用&amp;amp; &lt;br /&gt;printf("iPointer的size=%d \r\n"             ,  sizeof(iPointer));  &lt;br /&gt;printf("iValue的size=%d \r\n"               ,  sizeof(iValue));    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;下面為執行結果以及說明，：&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr style="background-color: grey; font-size: 16px; font-weight: bold;"&gt;           &lt;td align="center" width="35%"&gt;output&lt;/td&gt;           &lt;td align="center"&gt;&amp;nbsp;&amp;nbsp; 說明&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp; iPointer的value=10&lt;/td&gt;&lt;td&gt;印出儲存的記憶體位置本身的value，前面說過pointer是用來儲存記憶體位置，&lt;br /&gt;如果要取得該記憶體位置的value，就是利用*&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp; iPointer儲存value的address=28FF3C&lt;/td&gt;&lt;td&gt;印出iPointer儲存的資訊（記憶體位置）&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp; iPointer本身的address=28FF38&lt;/td&gt;&lt;td&gt;iPointer自己的記憶體起始位置在哪&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp; iValue &amp;nbsp;本身的address=28FF3C&lt;/td&gt;&lt;td&gt;第四行就是印出iValue本身的記憶體起始位置，會發現跟第二行一樣，因為iPointer就是儲存這個資訊&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp; iPointer的size=4&lt;/td&gt;&lt;td&gt;印出iPointer的大小，前面說過，每個pointer的大小都為4 bytes，不論型態為和&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp; iValue的size=4&lt;/td&gt;&lt;td&gt;印出iValue本身的大小，因為是interger，所以為4 bytes&lt;/td&gt;      &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;上面為基本用法。&lt;br /&gt;pointer也很常用來做字串的處理。&lt;br /&gt;原因是用指標處理字串較省記憶體空間，也比較彈性，&lt;br /&gt;我們可以宣告一個字串指標指向一個字串常數，&lt;br /&gt;下面是個簡單的範例：&lt;br /&gt;&lt;pre class="brush: c++"&gt;char *pValue[2]     = {"Ken","Yang"};&lt;br /&gt;char szValue[2][10] = {"Ken","Yang"};&lt;br /&gt;printf("szValue的value=%s \r\n"   ,  szValue[0]);     &lt;br /&gt;printf("pValue的value=%s \r\n"  ,  pValue[0]);    &lt;br /&gt;printf("szValue的size=%d \r\n"   ,  sizeof(szValue));     &lt;br /&gt;printf("pValue的size=%d \r\n"  ,  sizeof(pValue));    &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;下面為執行結果以及說明，顏色相同的為該對應的結果及說明：&lt;br /&gt;&lt;table border="1" 　width="70%"&gt;&lt;tbody&gt;&lt;tr style="background-color: grey; font-size: 16px; font-weight: bold;"&gt;           &lt;td align="center" width="35%"&gt;output&lt;/td&gt;           &lt;td align="center"&gt;&amp;nbsp;&amp;nbsp; 說明&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp;szValue的value=Ken&lt;/td&gt;&lt;td&gt;印出儲存在陣列0的value&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp;pValue的value=Ken&lt;/td&gt;&lt;td&gt;印出儲存在指標陣列0的value&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp;szValue的size=20&lt;/td&gt;&lt;td&gt;字元陣列的大小為20&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;&lt;td width="30%"&gt;&amp;nbsp;&amp;nbsp;pValue的size=8&lt;/td&gt;&lt;td&gt;指標陣列的大小為8&lt;/td&gt;      &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;可以發現陣列以及指標陣列的第0項，都是ken阿，可是大小卻都不一樣!&lt;br /&gt;陣列的大小為20，而指標陣列為8&lt;br /&gt;這就是為什麼使用指標會較為省空間的原因，且也較為彈性&lt;br /&gt;因為字串指標是可以更改值的，可是字元陣列是不行的。&lt;br /&gt;&lt;br /&gt;指標還有個特性，就是可以用來做運算，&lt;br /&gt;可以看下面簡單的範例，&lt;br /&gt;&lt;pre class="brush: c++"&gt;char *pString = "Ken";&lt;br /&gt;cout &amp;lt;&amp;lt; pString &amp;lt;&amp;lt; endl;&lt;br /&gt;cout &amp;lt;&amp;lt; *(pString+1) &amp;lt;&amp;lt; endl;&lt;br /&gt;cout &amp;lt;&amp;lt; sizeof(pString) &amp;lt;&amp;lt; endl;&lt;br /&gt;cout &amp;lt;&amp;lt; sizeof(*(pString+1)) &amp;lt;&amp;lt; endl;&lt;br /&gt;cout &amp;lt;&amp;lt; &amp;amp;pString &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上面的例子，第一行我們先宣告字串指標，然後指定一個字串常數給他，&lt;br /&gt;第二行就是印出value來(會印出Ken)&lt;br /&gt;第三行就是進行指標的運算(會印出e，如果我們改成+2，就變成n)&lt;br /&gt;第四行是印出大小，會印出4，因為說過指標的長度都固定為4&lt;br /&gt;第五行也是印出大小，差別是印出該位置的字元大小，那就一定是1了&lt;br /&gt;第六行就是印出該記憶體位置了，會發現字串指標跟前面講的變數指標(int, double..之類的)存取value或者存取記憶體的方式都不太同。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最後要講的是指標函數，用個簡單的範例來說明，&lt;br /&gt;&lt;pre class="brush: c++"&gt;void fnPointer(int *pValue){&lt;br /&gt;     *pValue=*pValue+1;&lt;br /&gt;     cout &amp;lt;&amp;lt; pValue &amp;lt;&amp;lt; endl;    //印出記憶體位置&lt;br /&gt;}&lt;br /&gt;main(){  &lt;br /&gt;     int iValue = 2; &lt;br /&gt;     cout &amp;lt;&amp;lt; &amp;amp;iValue &amp;lt;&amp;lt; endl;&lt;br /&gt;     fnPointer(&amp;amp;iValue);   //傳遞int變數的記憶體位置進去&lt;br /&gt;     cout &amp;lt;&amp;lt; iValue &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;我們先宣告一個函數，那個函數裡的參數是pointer型態，&lt;br /&gt;那麼使用方式就是傳遞某變數的記憶體位置進去即可，&lt;br /&gt;因為我們說過指標是用來存某變數的記憶體位置!!!&lt;br /&gt;所以就是傳遞記憶體位置進去。&lt;br /&gt;然後我們再函數fnPointer裡面對value進行+1的動作，&lt;br /&gt;然後在印出傳遞進來pointer的記憶體位置，&lt;br /&gt;而主程式則是先印出iValue的記憶體位置，&lt;br /&gt;在印出iValue的值。&lt;br /&gt;會發現，主程式跟函數印出來的記憶體位置都相同!!&lt;br /&gt;且在函數裡面進行+1以後，最後在煮成是印出的value會變成3。&lt;br /&gt;如果有些人可能會認為還是印出2，代表對pointer的概念還是不太了解(囧)，因為是pointer，還是存取到原本的變數啊!&lt;br /&gt;所以也是對原本的變數做操作!!!&lt;br /&gt;印出2的方式我們稱為call by value，&lt;br /&gt;但印出3的方式我們稱為call by address!&lt;br /&gt;還有一種是call by reference!&lt;br /&gt;後面一篇會講道!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上是pointer一些簡單的介紹!&lt;br /&gt;&lt;a href="http://blog.kenyang.net/2011/11/c-reference.html"&gt;下一篇會介紹c++才有的參考(reference)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-847626276780100795?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/847626276780100795/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/11/c-pointer.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/847626276780100795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/847626276780100795'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/11/c-pointer.html' title='C++: pointer (指標)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-3581004324481302839</id><published>2011-11-08T20:59:00.000-08:00</published><updated>2011-11-08T21:02:24.866-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android 強制安裝至 sd card</title><content type='html'>下指令讓"所有"&amp;nbsp;android app強制安裝到sd card中，&lt;br /&gt;其實這個指令我還蠻常用到的，蠻常幫朋友下的。&lt;br /&gt;但是每次都會稍微忘記!&lt;br /&gt;所以記錄一下。&lt;br /&gt;&lt;br /&gt;首先要先下載&lt;a href="http://dl.google.com/android/android-sdk_r15-windows.zip"&gt;android sdk&lt;/a&gt;，&lt;br /&gt;下載以後，解壓縮放置您要放的目錄，&lt;br /&gt;這裡假設放置在C槽，假設目錄名稱為android-sdk，&lt;br /&gt;然後將手機插上USB線!&lt;br /&gt;接著打開cmd (命令提示字元)，&lt;br /&gt;cd到C槽底下的android sdk目錄，在cd到platform-tools底下，&lt;br /&gt;完整指令為&lt;br /&gt;&lt;pre class="brush: java"&gt;cd android-sdk/platform-tools&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;接著利用底下的adb.exe去執行強制安裝至sd card的指令，&lt;br /&gt;指令如下：&lt;br /&gt;&lt;pre class="brush: java"&gt;adb shell pm setInstallLocation 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2：代表讓所有app可以安裝至sd card&lt;br /&gt;0：就是初始值，可以自己選擇&lt;br /&gt;1：強制安裝在ROM裡面&lt;br /&gt;&lt;br /&gt;所以如果要恢復初始值的話，指令如下：&lt;br /&gt;&lt;pre class="brush: java"&gt;adb shell pm setInstallLocation 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-3581004324481302839?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/3581004324481302839/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/11/android-sd-card.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3581004324481302839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3581004324481302839'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/11/android-sd-card.html' title='Android 強制安裝至 sd card'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-2309088355236145740</id><published>2011-10-26T09:53:00.000-07:00</published><updated>2011-11-08T21:02:39.781-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Integer.valueOf的Cache機制</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果有一個Integer的物件要宣告，&lt;br /&gt;大部分的人宣告方式會是如下&lt;br /&gt;&lt;pre class="brush: java"&gt;Integer a = new Integer(2);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;但如果其value是介於-128~127之間，&lt;br /&gt;某些時刻可以使用下面的宣告方式&lt;br /&gt;&lt;pre class="brush: java"&gt;Integer a = Integer.valueOf(2);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;在&lt;b&gt;&lt;u&gt;某些條件下&lt;/u&gt;&lt;/b&gt;，速度較快一點點點!!&lt;br /&gt;為什麼呢??  我們來看下面的例子!&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;/*&lt;br /&gt; * 如果不是用new Integer()去賦予值，&lt;br /&gt; * 如果是下方的宣告方式，都會去call Integer.valueOf()這個method&lt;br /&gt; * 也就是說下方的宣告方式，a=2 如同 a=Integer.valueOf(2)&lt;br /&gt; */&lt;br /&gt;Integer a = 3;&lt;br /&gt;Integer b = 3;&lt;br /&gt;System.out.println( a==b ); //印出來會是什麼? &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;如果你的答案是&lt;span class="Apple-style-span" style="color: purple; font-size: x-large;"&gt;false&lt;/span&gt;，只能說不完全錯&lt;br /&gt;因為你的想法，可能是認為==是用來比較2個物件的位址是否相同。&lt;br /&gt;如果你是這樣想，那你觀念對了，可是就是忽略掉了valueOf的cache機制。&lt;br /&gt;這算是一個陷阱。&lt;br /&gt;&lt;br /&gt;如果你的答案是&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: purple; font-size: x-large;"&gt;true&lt;/span&gt;&lt;/span&gt;，只能說不完全對&lt;br /&gt;因為得取決於你的想法，&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;如果你認為因為a是3，b也是3，3等於3阿，所以是true，那就大錯特錯了。你的觀念需要加強。因為==是比較2個物件的位置是否相同，也就說用來判斷是否為同個物件，並不是判斷value是否相同。&lt;/li&gt;&lt;li&gt;如果你是認為因為==是比較位置，且知道valueOf有cache機制，所以為true，那你答對了。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;因為在call valueOf這個method時，&lt;br /&gt;此method裡面會有判斷是否要調用cache的code，&lt;br /&gt;如下，&lt;br /&gt;&lt;pre class="brush: java"&gt;public static Integer valueOf(int i) {&lt;br /&gt;    if(i &amp;gt;= -128 &amp;amp;&amp;amp; i &amp;lt;= IntegerCache.high)&lt;br /&gt;        return IntegerCache.cache[i + 128];&lt;br /&gt;    else&lt;br /&gt;        return new Integer(i);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;也就是說如果value是介於-128~127之間，&lt;br /&gt;就會掉入到if裡面，而IntegerCache為一個class，&lt;br /&gt;在使用這個class時就會去new 256個Integer的物件，並放入cache中，&lt;br /&gt;所以在上面的例子a跟b的value都是3，&lt;br /&gt;自然會調用同一塊cache，所以用==在比較時，他們的記憶體位置自然為同一塊。&lt;br /&gt;因此答案為TRUE。&lt;br /&gt;&lt;br /&gt;最後!!!&lt;br /&gt;或許有人會覺得奇怪，cache會去new 256個Integer物件耶!!&lt;br /&gt;這樣用valueOf怎麼會比較快呢??&lt;br /&gt;上面有說到&lt;b style="text-decoration: underline;"&gt;某些條件下&lt;/b&gt;，該條件就是，&lt;br /&gt;如果是&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;大量&lt;/b&gt;&lt;/span&gt;宣告的話，此時調用valueOf比較快的條件就成立了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;我們可以寫一小段code來判斷執行時間，如下&lt;br /&gt;&lt;pre class="brush: java"&gt;long lStart = System.nanoTime();&lt;br /&gt;for (int i = 0; i &amp;lt; 1000000000 ; i++) {&lt;br /&gt; Integer a = new Integer(3);&lt;br /&gt;}&lt;br /&gt;long lEnd = System.nanoTime()-lStart;&lt;br /&gt;&lt;br /&gt;System.out.println((float) lEnd/1000000000);&lt;br /&gt;&lt;br /&gt;lStart = System.nanoTime();&lt;br /&gt;for (int i = 0; i &amp;lt; 1000000000 ; i++) {&lt;br /&gt; Integer a = Integer.valueOf(3);&lt;br /&gt;}&lt;br /&gt;lEnd = System.nanoTime()-lStart;&lt;br /&gt;System.out.println((float) lEnd/1000000000);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;可以發現上面的例子，&lt;br /&gt;用new Integer的方法大概都快要1秒鐘，差不多為0.6秒，&lt;br /&gt;但調用Integer.valueOf()的方法大概0.003秒，&lt;br /&gt;當然其實人感覺不太到差異啦。&lt;br /&gt;只是說硬要評比的話，valueOf的方法較為快。&lt;br /&gt;但記得!! 必須符合大量資料的前提才成立。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-2309088355236145740?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/2309088355236145740/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/10/integervalueofcache.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2309088355236145740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2309088355236145740'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/10/integervalueofcache.html' title='Integer.valueOf的Cache機制'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6385312929123913053</id><published>2011-10-24T00:00:00.000-07:00</published><updated>2011-10-23T09:08:14.679-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ip'/><title type='text'>切割子網域（subnet）</title><content type='html'>在&lt;a href="http://blog.kenyang.net/2011/01/ip.html"&gt;前一篇&lt;/a&gt;中，提到了&lt;a href="http://blog.kenyang.net/2011/01/ip.html"&gt;IP分級以及網域&lt;/a&gt;的概念。&lt;br /&gt;&lt;br /&gt;在這篇中，將說明切割子網域的概念！&lt;br /&gt;&lt;br /&gt;IP分級是為了管理方便，但今天假設我們有一個Class A的IP，&lt;br /&gt;&lt;br /&gt;我們不可能將一個Class A的IP僅僅設定一個區網！很浪費！&lt;br /&gt;&lt;br /&gt;且該區網底下也很容易發生壅塞的情形！效能會不好&lt;br /&gt;&lt;br /&gt;那麼這時候就得運用切割子網域的概念！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;假設我們有個Class C的IP（192.168.0.0～192.168.0.255），&lt;br /&gt;&lt;br /&gt;且我們要將該Class C的IP切割成4個子網域！&lt;br /&gt;&lt;br /&gt;那麼該怎麼做？&lt;br /&gt;&lt;br /&gt;我們知道Class C的IP的&lt;b&gt;net_id&lt;/b&gt;有24個！&lt;br /&gt;&lt;br /&gt;先假設我們要將一個Class C的IP細切割成4個子網域！&lt;br /&gt;&lt;br /&gt;那麼我們可以跟&lt;b&gt;host_id&lt;/b&gt;借&lt;span class="Apple-style-span" style="color: red;"&gt;2&lt;/span&gt;個bits！（2的&lt;span class="Apple-style-span" style="color: red;"&gt;2&lt;/span&gt;次方，所以是借&lt;span class="Apple-style-span" style="color: red;"&gt;2&lt;/span&gt;個）&lt;br /&gt;&lt;br /&gt;也就是說&lt;b&gt;net_id&lt;/b&gt;變成26個！&lt;br /&gt;&lt;br /&gt;如：11000000.101010000.00000000.&lt;span class="Apple-style-span" style="color: red;"&gt;0&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;0&amp;nbsp;&lt;/span&gt;000000（192.168.0.0）&lt;br /&gt;&lt;br /&gt;這樣就會有&lt;span class="Apple-style-span" style="color: red;"&gt;00, 01, 10, 11 &lt;/span&gt;這樣就會有4種組合，&lt;br /&gt;&lt;br /&gt;這樣就可以切成4個子網域了！！&lt;br /&gt;&lt;br /&gt;而每個子網域，就會剩下2的6次方個ip（64）。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6385312929123913053?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6385312929123913053/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/10/class-c.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6385312929123913053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6385312929123913053'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/10/class-c.html' title='切割子網域（subnet）'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8032624402235201780</id><published>2011-07-21T22:25:00.000-07:00</published><updated>2011-07-21T22:25:56.557-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='captcha'/><title type='text'>Integrate CAPTCHA to your site (without plugin)-【2】</title><content type='html'>在前一篇&lt;a href="http://blog.kenyang.net/2011/05/integrate-captcha-to-your-site-using.html"&gt;筆記&lt;/a&gt;有提到如何利用plugin去顯示一個驗證碼(captcha)的功能，&lt;br /&gt;&lt;br /&gt;而這篇是要教導大家如何用另一種方法(AJAX API)去顯示驗證碼，&lt;br /&gt;&lt;br /&gt;***記得*** 一樣要去申請api key，至於如何申請，請至&lt;a href="http://blog.kenyang.net/2011/05/integrate-captcha-to-your-site-using.html"&gt;前一篇&lt;/a&gt;檢閱。&lt;br /&gt;&lt;br /&gt;而使用AJAX API的優點，簡單來說，你在你的.jsp, .asp, .php....etc的頁面中，&lt;br /&gt;&lt;br /&gt;不會看到該language的語法，例如：&amp;lt;% %&amp;gt; ＜？　？＞, ...等等之類的。&lt;br /&gt;&lt;br /&gt;我們只要用簡單的javascript語法就可以顯示一個驗證碼。&lt;br /&gt;首先我們得在我們頁面中，這裡假設是captcha.html中，&lt;br /&gt;&lt;br /&gt;【第一步】加入 Google的js檔案，如下:&lt;br /&gt;&lt;pre class="brush: js"&gt;&amp;lt;script type="text/javascript" src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;【第二步】在captcha.html中加入一個div的element，如下:&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;div id="captcha"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;【第三步】開始create一個驗證碼，請加入下列javascript語法：&lt;br /&gt;&lt;pre class="brush: js"&gt;&amp;lt;script&amp;gt;&lt;br /&gt;     window.onload = function() {&lt;br /&gt;          Recaptcha.create(&lt;br /&gt;                   "xxxxxxx",  //你的api key&lt;br /&gt;                   "captcha",  //第二步驟中div的id&lt;br /&gt;                   {&lt;br /&gt;                        theme: "red",&lt;br /&gt;                        callback: Recaptcha.focus_response_field&lt;br /&gt;                   }&lt;br /&gt;          );&lt;br /&gt;  &lt;br /&gt;     }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;這樣就大功告成，至於如何驗證，&lt;br /&gt;其實驗證方式也是有兩種，&lt;br /&gt;兩種都是透過ajax，&lt;br /&gt;第一種是寫一隻程式，這隻程式是用來接收參數並且驗證資料&lt;br /&gt;並且用ajax向這隻程式傳遞參數。可以參考我前一篇的&lt;a href="http://blog.kenyang.net/2011/05/integrate-captcha-to-your-site-using.html"&gt;驗證方法&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;而第二種是直接向此連結&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: x-small; line-height: 16px;"&gt;http://www.google.com/recaptcha/api/verify&lt;/span&gt;發出request，&lt;br /&gt;但是大概懂ajax的人都知道""基本上""是無法跨domain進行request，&lt;br /&gt;當然有其他solution，但因為我先前已經有寫好上個方法的驗證方法，&lt;br /&gt;所以我就直接用第一種方式，也較簡易!&lt;br /&gt;但是還是建議大家直接用第二種方式，不然使用ajax api就失去了意義!&lt;br /&gt;&lt;br /&gt;而這篇是教導大家如何using ajax api去顯示一個驗證碼。&lt;br /&gt;所以就不詳細說明如何利用ajax去進行驗證。(反正用jQuery的ajax api很簡單，就不贅述了!）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8032624402235201780?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8032624402235201780/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/07/displaying-recaptcha-without-plugins.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8032624402235201780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8032624402235201780'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/07/displaying-recaptcha-without-plugins.html' title='Integrate CAPTCHA to your site (without plugin)-【2】'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8525396464425064923</id><published>2011-07-05T12:15:00.000-07:00</published><updated>2011-07-05T12:15:57.824-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Install Android Plugin for Eclipse</title><content type='html'>這篇主要是在教導大家如何在Eclipse中，安裝開發Android程式的plugin，&lt;div&gt;其實這類型的文章在網路上很多，但會打這篇主要是為了今年資管營的學生們，&lt;/div&gt;&lt;div&gt;為了讓他們能夠快速地找到安裝教學，因此打這篇。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;首先我們要先去下載&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html"&gt;JDK (請在下面選擇符合自己作業系統的版本)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/downloads/packages/eclipse-classic-37/indigor"&gt;Eclipse Classic 3.7 (請在右邊選單選擇符合自己的版本)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dl.google.com/android/android-sdk_r11-windows.zip"&gt;Android SDK&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;下載完成以後，請照著下面的步驟操作：&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;安裝第一個下載的檔案JDK&lt;/li&gt;&lt;li&gt;將第二個下載的檔案Eclipse解壓縮出來到一個目錄，無須安裝，即可使用&lt;/li&gt;&lt;li&gt;將第三個檔案Android SDK解壓縮出來到一個目錄即可。&lt;/li&gt;&lt;li&gt;開啟Eclipse&lt;/li&gt;&lt;li&gt;看到上方的選單，請點選【Help】→點選【Install New Software】→點選【Add】→在Name地方輸入android，Location地方輸入http://dl-ssl.google.com/android/eclipse &amp;nbsp;→點選下方按鈕【Next】進行安裝。&lt;/li&gt;&lt;li&gt;完成上步驟，應該會重新啟動Eclipse，應該會看到如圖中的紅色框框選項&lt;a href="http://2.bp.blogspot.com/-pTvVhox-Nn8/ThNhoprnIQI/AAAAAAAAAWU/AZSYV5Kv_DY/s1600/3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="66" src="http://2.bp.blogspot.com/-pTvVhox-Nn8/ThNhoprnIQI/AAAAAAAAAWU/AZSYV5Kv_DY/s320/3.PNG" width="320" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;此時再點選上方選單的【Window】→點選【Preferences】→點選【Android】→在右邊視窗的SDK Location選擇剛剛第三個檔案解壓縮的位置→點選【Apply】→點選【OK】&lt;/li&gt;&lt;li&gt;完成上步驟，再點選下圖中的紅色框框&lt;a href="http://2.bp.blogspot.com/-pTvVhox-Nn8/ThNhoprnIQI/AAAAAAAAAWU/AZSYV5Kv_DY/s1600/3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="66" src="http://2.bp.blogspot.com/-pTvVhox-Nn8/ThNhoprnIQI/AAAAAAAAAWU/AZSYV5Kv_DY/s320/3.PNG" width="320" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;點選【Available packages】→將兩個選項都打勾→點選【Install selected】→接著就一直按next或者finish即可。&lt;/li&gt;&lt;li&gt;按照上面9步驟即可完成安裝Android Plugin for Eclipse&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8525396464425064923?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8525396464425064923/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/07/install-android-plugin-for-eclipse.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8525396464425064923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8525396464425064923'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/07/install-android-plugin-for-eclipse.html' title='Install Android Plugin for Eclipse'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-pTvVhox-Nn8/ThNhoprnIQI/AAAAAAAAAWU/AZSYV5Kv_DY/s72-c/3.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1659095622176510810</id><published>2011-07-03T06:30:00.000-07:00</published><updated>2011-07-03T06:36:43.304-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='mapreduce'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Using Eclipse for Windows to connect to Hadoop</title><content type='html'>先前已經在&lt;a href="http://blog.kenyang.net/2011/06/how-to-install-hadoop-on-ubuntu-single.html"&gt;前一篇&lt;/a&gt;，教導大家如何&lt;a href="http://blog.kenyang.net/2011/06/how-to-install-hadoop-on-ubuntu-single.html"&gt;安裝hadoop&lt;/a&gt;在ubuntu上面了，&lt;br /&gt;這篇主要是在說明如何在windows的環境下，&lt;br /&gt;使用eclipse去&lt;b&gt;連結&lt;/b&gt;到ubuntu上的hadoop，&lt;br /&gt;將會在下一篇教導大家如何撰寫一個Map/Reduce程式。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在我連結成功之前，在Google上找了不知道多少資料。&lt;br /&gt;但沒有任何一篇是完完全全符合這個案例的!&lt;br /&gt;大部分找到的案例都是，在Windows環境下安裝cygwin，&lt;br /&gt;利用cygwin來模擬出unix環境，然後再unix中架設hadoop，&lt;br /&gt;&lt;br /&gt;問題是這樣的案例...根本沒有太大意義，因為是模擬，就只是單純玩玩而已，&lt;br /&gt;所以才打這篇教學，如何在windows真的連結到一台實體的linux server上。&lt;br /&gt;&lt;br /&gt;我的本機基本環境如下：&lt;br /&gt;Eclipse 3.6&lt;br /&gt;Windows 7 64bits&lt;br /&gt;&lt;br /&gt;實體linux server環境如下：&lt;br /&gt;ubuntu 10.10&lt;br /&gt;hadoop 0.20.2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;【步驟一】首先我們得去下載三個檔案，&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&lt;a href="https://issues.apache.org/jira/secure/attachment/12460491/hadoop-eclipse-plugin-0.20.3-SNAPSHOT.jar"&gt;hadoop-eclipse-plugin-0.20.3-SNAPSHOT.jar&lt;/a&gt;&amp;nbsp;先下載這個jar檔，並放在eclipse資料夾底下的/plugin資料夾裡面，有人可能會發現，為什麼我們實體server上的hadoop版本是0.20.2，可是我們用的eclipse plugin版本卻是0.20.3，而不是用0.20.2，這是因為0.20.2有問題。（稍後會說明甚麼問題）&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cygwin.com/"&gt;cygwin&lt;/a&gt;　第二個下載這個並且安裝起來，安裝過程很簡單，恕不贅述，但或許有人會納悶..為什麼要安裝這個? 這個不是模擬unix嗎? 我們不是要連結到實體的linux server上嗎? 如果懂MapReduce原理的人，可能就會稍微理解，大家可以去看由2位Google Fellow所提出的&lt;a href="http://labs.google.com/papers/mapreduce-osdi04.pdf"&gt;paper&lt;/a&gt;。簡單的說Reduce最後會將結果輸出到本機硬碟上，而這裡的本機是linux，所以會用到一些相關指令是windows沒有的，例如:chown，所以我們得利用&lt;a href="http://www.cygwin.com/"&gt;cygwin&lt;/a&gt;安裝好後裡面/bin資料夾的一些linux指令。&lt;/li&gt;&lt;li&gt;&lt;a href="http://labs.renren.com/apache-mirror/hadoop/core/hadoop-0.20.2/hadoop-0.20.2.tar.gz"&gt;hadoop 0.20.2&lt;/a&gt;&amp;nbsp;第三個下載hadoop，原因是再eclipse for windows中開發hadoop專案，會用到一些hadoop的jar檔案，並且解壓縮出來，在這篇，還不需要用到，在下一篇進行程式開發，將會用到!&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;【步驟二】設定環境變數&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;下載以及安裝完成以後，&lt;br /&gt;請記得設定環境變數，&lt;br /&gt;設定方式如下（不好意思，我的OS是英文版，請大家自行對照自己電腦）&lt;br /&gt;在我的電腦上點選右鍵→點選內容，&lt;br /&gt;會看到下圖(圖一)，請點選Change Setting，&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9ShbMycRvbE/ThBk69JEuSI/AAAAAAAAAVY/82hNym9ipiY/s1600/1.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="183" src="http://3.bp.blogspot.com/-9ShbMycRvbE/ThBk69JEuSI/AAAAAAAAAVY/82hNym9ipiY/s400/1.PNG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖一&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;點選完後，會看到下圖（圖二），再點選Advanced，&lt;br /&gt;點選以後再點選Environment Variables&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ZhTkYNhlITU/ThBk7DL-xGI/AAAAAAAAAVc/dMdvsjZMCgI/s1600/2.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-ZhTkYNhlITU/ThBk7DL-xGI/AAAAAAAAAVc/dMdvsjZMCgI/s400/2.PNG" width="362" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖二&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;點選完成後，會看到下圖（圖三），請先找到Path這個系統變數，&lt;br /&gt;並按下Edit按鈕。&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-tQPDVBmS-qg/ThBk7snYgUI/AAAAAAAAAVg/bdMYffeg5T0/s1600/3.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-tQPDVBmS-qg/ThBk7snYgUI/AAAAAAAAAVg/bdMYffeg5T0/s400/3.PNG" width="370" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖三&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;點選完以後，會看到下圖（圖四），&lt;br /&gt;請在最後面增加";c:\cygwin\bin"，&lt;br /&gt;不需要雙引號喔！增加完成以後按下OK，請先重開機!&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-U8Z1mxxbLq8/ThBk8ANAPbI/AAAAAAAAAVk/EvHGJFxRF1Q/s1600/4.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="168" src="http://3.bp.blogspot.com/-U8Z1mxxbLq8/ThBk8ANAPbI/AAAAAAAAAVk/EvHGJFxRF1Q/s400/4.PNG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖四&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【步驟三】設定Eclipse&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;設定完成以後，並且有把.jar檔放入eclipse/plugin以後，&lt;br /&gt;請開啟Eclipse，&lt;br /&gt;並點選Eclipse視窗中的右上角，如下圖(圖五)上方的框框，再點選other，&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tS4hDiqTA9s/ThBp_D58STI/AAAAAAAAAVo/EECA6iRvAs4/s1600/5.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-tS4hDiqTA9s/ThBp_D58STI/AAAAAAAAAVo/EECA6iRvAs4/s1600/5.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖五&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;點選完以後，會看到下圖(圖六)&lt;br /&gt;請選擇Map/Reduce，&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xVD-BpIrFyI/ThBp_rMi-AI/AAAAAAAAAVs/B1_HOzMg_mY/s1600/6.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-xVD-BpIrFyI/ThBp_rMi-AI/AAAAAAAAAVs/B1_HOzMg_mY/s320/6.PNG" width="262" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖六&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【步驟四】新增Map/Reduce Location&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;點選完成會看到下圖(圖七)，&lt;br /&gt;應該會有個Map/Reduce Locations的視窗，如左邊紅色框框，&lt;br /&gt;此時請點選右邊紅色框框來新增一個Location&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-wXrmpAnShWA/ThBp_9CCzVI/AAAAAAAAAVw/azZU2RCNgws/s1600/7.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-wXrmpAnShWA/ThBp_9CCzVI/AAAAAAAAAVw/azZU2RCNgws/s1600/7.PNG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖七&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;點選完成會看到下圖(圖八)，&lt;br /&gt;就根據你們自己的位置輸入相關資訊吧!&lt;br /&gt;那個user name並無大礙，填寫完成以後按下Finish。&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ShVMxBNCeSw/ThBqAdQxdLI/AAAAAAAAAV0/Na7XiyPlaQA/s1600/8.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="480" src="http://3.bp.blogspot.com/-ShVMxBNCeSw/ThBqAdQxdLI/AAAAAAAAAV0/Na7XiyPlaQA/s640/8.PNG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖八&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;點選完成以後，會看到下圖(圖九)&lt;br /&gt;會發現多了一個選項了，但是還沒完成喔，&lt;br /&gt;我們在這個選項上點選右鍵，並點選Edit，&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-jRZOl52CGhA/ThBrZ_3eFZI/AAAAAAAAAWA/zqMcGX2iFQU/s1600/9.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="80" src="http://2.bp.blogspot.com/-jRZOl52CGhA/ThBrZ_3eFZI/AAAAAAAAAWA/zqMcGX2iFQU/s640/9.PNG" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖九&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【步驟五】設定Map/Reduce Location的參數&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;再點選上圖，圖八中的Advanced Parameters，來修改一些參數，&lt;br /&gt;有些人可能會問，為什麼不一開始就修改，因為有些參數，必須先建立好第一步，&lt;br /&gt;然後再進行修改它才會出現。&lt;br /&gt;&lt;br /&gt;此時我們先找兩個參數，&lt;br /&gt;&lt;br /&gt;第一個是dfs.permissions.supergroup，請修改成你能對server上的hadoop進行存取的群組，我的server上群組是hadoop，所以我會在這欄修改成【hadoop】。&lt;br /&gt;第二個是hadoop.job.ugi，跟上面一樣，但請修改成【hadoop,Tardis】。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;完成上面的步驟以後，&lt;br /&gt;看到eclipse左邊的視窗，並點開DFS Locations，&lt;br /&gt;會見到下圖(圖十)，會發現你已經連線成功了，如果你是根據我這篇的&lt;a href="http://blog.kenyang.net/2011/06/how-to-install-hadoop-on-ubuntu-single.html"&gt;安裝教學&lt;/a&gt;，你看到的資料夾名稱應該會是app，而不是appKen。&lt;br /&gt;且不會看到user/hadoop/input這個資料夾，這個資料夾的功用是放置，程式將要讀取的資料。&lt;br /&gt;將在下一篇，教導大家如何建立一個Map/Reduce專案。&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4yR7A3a2A9k/ThBqA1XDszI/AAAAAAAAAV8/JTLbVjeR23Q/s1600/10.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-4yR7A3a2A9k/ThBqA1XDszI/AAAAAAAAAV8/JTLbVjeR23Q/s1600/10.PNG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖十&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;相關文章：&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.kenyang.net/2011/06/how-to-install-hadoop-on-ubuntu-single.html"&gt;如何安裝Hadoop&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1659095622176510810?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1659095622176510810/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/07/using-eclipse-for-windows-to-connect-to.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1659095622176510810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1659095622176510810'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/07/using-eclipse-for-windows-to-connect-to.html' title='Using Eclipse for Windows to connect to Hadoop'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-9ShbMycRvbE/ThBk69JEuSI/AAAAAAAAAVY/82hNym9ipiY/s72-c/1.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-5772387692156576981</id><published>2011-06-30T09:29:00.000-07:00</published><updated>2011-06-30T14:11:17.986-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mapreduce'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>How to install Hadoop on Ubuntu (single-node cluster)</title><content type='html'>這篇主要教導大家如何在ubuntu上架起single-node的hadoop。&lt;br /&gt;會在其他篇教導大家如何架設multi-node。&lt;br /&gt;因為架設multi-node的前提是先得架設single-node。&lt;br /&gt;所以先教導大家如何架設。&lt;br /&gt;至於如何執行一個MapReduce的project將在下一篇教導大家。&lt;br /&gt;&lt;br /&gt;我的環境如下：&lt;br /&gt;ubuntu版本：10.10&lt;br /&gt;hadoop：0.20.2&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【1】要架設hadoop起來的前提是必須安裝Sun的java-jdk&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【1.1】首先先增加Canonical Partner Repository到我們的repositories，語法如下：&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"&lt;/pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【1.2】更新我們的source.list，語法如下：&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;sudo apt-get update&lt;/pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【1.3】安裝sun java sdk，語法如下：&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;sudo apt-get install sun-java6-jdk&lt;/pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【1.4】因為linux的jdk預設為open-jdk，所以語法如下：&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【2】建立一個Hadoop系統的專屬使用者&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;sudo addgroup hadoop&lt;br /&gt;sudo adduser --ingroup hadoop hadoop&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【3】設定SSH，因為hadoop利用ssh去管理node&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【3.1】首先先產生一個SSH key給hadoop user，語法如下：&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;su - hadoop&lt;br /&gt;ssh-keygen -t rsa -P "" &amp;nbsp;&lt;/pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【3.2】利用新產生的key去accees本機上的機器，語法如下：&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;su - hadoop&lt;br /&gt;cat $HOME/.ssh/id_rsa.pub &amp;gt;&amp;gt; $HOME/.ssh/authorized_keys&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【4】關閉IPv6&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【4.1】利用vim去開啟設定檔，語法如下：&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;vim /etc/sysctl.conf&amp;nbsp;&lt;/pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【4.2】將檔案中的設定改&lt;/b&gt;&lt;b&gt;如下：&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;#disable ipv6&lt;br /&gt;net.ipv6.conf.all.disable_ipv6 = 1&lt;br /&gt;net.ipv6.conf.default.disable_ipv6 = 1&lt;br /&gt;net.ipv6.conf.lo.disable_ipv6 = 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;上面都是為了安裝Hadoop的先前作業&lt;/b&gt;&lt;br /&gt;&lt;b&gt;下面是正式進行下載以及安裝Hadoop&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【5】下載Hadoop並且解壓縮&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;cd /usr/local&lt;br /&gt;wget http://apache.ntu.edu.tw/hadoop/core/hadoop-0.20.2/hadoop-0.20.2.tar.gz&lt;br /&gt;tar zxvf hadoop-0.20.2.tar.gz&lt;br /&gt;sudo mv hadoop-0.20.2 hadoop&lt;br /&gt;sudo chown -R hadoop:hadoop hadoop&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【6】更新$HOME/.bashrc(注意!是以hadoop身分執行語法)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【6.1】利用vim去開啟.bashrc，語法如下：&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;sudo vim $HOME/.bashrc&amp;nbsp;&lt;/pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【6.2】將檔案中的設定更改成如下：&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;# Set Hadoop-related environment variables&lt;br /&gt;export HADOOP_HOME=/usr/local/hadoop&lt;br /&gt;&lt;br /&gt;# Add Hadoop bin/ directory to PATH&lt;br /&gt;export PATH=$PATH:$HADOOP_HOME/bin&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【7】Hadoop的設定&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;nbsp;接著是一連串的Hadoop設定檔，設定檔的位置都位於/usr/local/hadoop/conf/底下，&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;&amp;nbsp;都是先利用vim去開啟設定檔案做編輯，故下面就省略vim的語法&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【7.1】hadoop-env.sh，語法如下：&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;把預設的JAVA_HOME位置更改掉&lt;br /&gt;&lt;pre class="brush: java"&gt;# The java implementation to use.  Required.&lt;br /&gt;export JAVA_HOME=/usr/lib/jvm/java-6-sun&amp;nbsp;&lt;/pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;【7.2】core-site.xml，語法如下：&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;紀錄Hadoop將資料存在哪&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;先建立一個Hadoop的暫存資料夾，並設定權限及擁有人&lt;br /&gt;&lt;pre class="brush: java"&gt;sudo mkdir /app/hadoop/tmp&lt;br /&gt;sudo chown hadoop:hadoop /app/hadoop/tmp&lt;br /&gt;sudo chmod 750 /app/hadoop/tmp&amp;nbsp;&lt;/pre&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;接著就是打開設定檔更改設定，注意!請填自己的ip，改成如下:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;property&gt;&lt;br /&gt;  &lt;name&gt;hadoop.tmp.dir&lt;/name&gt;&lt;br /&gt;  &lt;value&gt;/app/hadoop/tmp&lt;/value&gt;&lt;br /&gt;  &lt;description&gt;A base for other temporary directories.&lt;/description&gt;&lt;br /&gt;&lt;/property&gt;&lt;br /&gt;&lt;br /&gt;&lt;property&gt;&lt;br /&gt;  &lt;name&gt;fs.default.name&lt;/name&gt;&lt;br /&gt;  &lt;value&gt;hdfs://140.133.xxx.xxx:54310&lt;/value&gt;&lt;br /&gt;  &lt;description&gt;The name of the default file system.  A URI whose&lt;br /&gt;  scheme and authority determine the FileSystem implementation.  The&lt;br /&gt;  uri's scheme determines the config property (fs.SCHEME.impl) naming&lt;br /&gt;  the FileSystem implementation class.  The uri's authority is used to&lt;br /&gt;  determine the host, port, etc. for a filesystem.&lt;/description&gt;&lt;br /&gt;&lt;/property&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;【7.3】mapred-site.xml，語法如下：&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;打開設定檔更改設定，注意!請填自己的ip，改成如下:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;property&gt;&lt;br /&gt;  &lt;name&gt;mapred.job.tracker&lt;/name&gt;&lt;br /&gt;  &lt;value&gt;140.133.xxx.xxx:54311&lt;/value&gt;&lt;br /&gt;  &lt;description&gt;The host and port that the MapReduce job tracker runs&lt;br /&gt;  at.  If "local", then jobs are run in-process as a single map&lt;br /&gt;  and reduce task.&lt;br /&gt;  &lt;/description&gt;&lt;br /&gt;&lt;/property&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;【7.4】hdfs-site.xml，語法如下：&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;打開設定檔更改設定，此檔案紀錄著檔案被複製的數量，改成如下:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;property&gt;&lt;br /&gt;  &lt;name&gt;dfs.replication&lt;/name&gt;&lt;br /&gt;  &lt;value&gt;1&lt;/value&gt;&lt;br /&gt;  &lt;description&gt;Default block replication.&lt;br /&gt;  The actual number of replications can be specified when the file is created.&lt;br /&gt;  The default is used if replication is not specified in create time.&lt;br /&gt;  &lt;/description&gt;&lt;br /&gt;&lt;/property&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【8】對我們的namenode格式化&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;/usr/local/hadoop/bin/hadoop namenode -format&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;出來的output應該會如下：&lt;br /&gt;&lt;pre class="brush: xml"&gt;11/06/30 16:59:56 INFO namenode.NameNode: STARTUP_MSG:&lt;br /&gt;/************************************************************&lt;br /&gt;STARTUP_MSG: Starting NameNode&lt;br /&gt;STARTUP_MSG:   host = ubuntu/140.133.xxx.xxx&lt;br /&gt;STARTUP_MSG:   args = [-format]&lt;br /&gt;STARTUP_MSG:   version = 0.20.2&lt;br /&gt;STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20 -r 911707; compiled by 'chrisdo' on Fri Feb 19 08:07:34 UTC 2010&lt;br /&gt;************************************************************/&lt;br /&gt;10/05/08 16:59:56 INFO namenode.FSNamesystem: fsOwner=hadoop,hadoop&lt;br /&gt;10/05/08 16:59:56 INFO namenode.FSNamesystem: supergroup=supergroup&lt;br /&gt;10/05/08 16:59:56 INFO namenode.FSNamesystem: isPermissionEnabled=true&lt;br /&gt;10/05/08 16:59:56 INFO common.Storage: Image file of size 96 saved in 0 seconds.&lt;br /&gt;10/05/08 16:59:57 INFO common.Storage: Storage directory .../hadoop-hadoop/dfs/name has been successfully formatted.&lt;br /&gt;10/05/08 16:59:57 INFO namenode.NameNode: SHUTDOWN_MSG:&lt;br /&gt;/************************************************************&lt;br /&gt;SHUTDOWN_MSG: Shutting down NameNode at ubuntu/140.133.xxx.xxx&lt;br /&gt;************************************************************/&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;【9】啟動我們的single-node cluster&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;/usr/local/hadoop/bin/start-all.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: arial, sans-serif; line-height: 24px;"&gt;這將會啟動機器上的Namenode, Datanode, Jobtracker and a Tasktracker!!&lt;/span&gt;&lt;br /&gt;出來的output應該會如下：&lt;br /&gt;&lt;pre class="brush: java"&gt;starting namenode, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-namenode-ubuntu.out&lt;br /&gt;localhost: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-datanode-ubuntu.out&lt;br /&gt;localhost: starting secondarynamenode, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-secondarynamenode-ubuntu.out&lt;br /&gt;starting jobtracker, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-jobtracker-ubuntu.out&lt;br /&gt;localhost: starting tasktracker, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-tasktracker-ubuntu.out&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;如果要檢查是否有啟動成功，可以打入下列語法:&lt;br /&gt;&lt;pre class="brush: java"&gt;jps&lt;/pre&gt;&lt;br /&gt;正確出來的output應該會如下：&lt;br /&gt;&lt;pre class="brush: java"&gt;2287 TaskTracker&lt;br /&gt;2149 JobTracker&lt;br /&gt;1938 DataNode&lt;br /&gt;2085 SecondaryNameNode&lt;br /&gt;2349 Jps&lt;br /&gt;1788 NameNode&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-5772387692156576981?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/5772387692156576981/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/06/how-to-install-hadoop-on-ubuntu-single.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5772387692156576981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5772387692156576981'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/06/how-to-install-hadoop-on-ubuntu-single.html' title='How to install Hadoop on Ubuntu (single-node cluster)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6269825691483385999</id><published>2011-05-29T17:18:00.000-07:00</published><updated>2011-05-29T17:18:31.640-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='captcha'/><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Integrate CAPTCHA to your site (using plugin)-【1】</title><content type='html'>CAPTCHA，相信大家不陌生，&lt;br /&gt;是驗證碼的意思(如圖)，&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RIWB8_DEW-A/TeLTZ0tI0_I/AAAAAAAAAT4/vkgx2JFD2iw/s1600/Captu3re.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="134" src="http://1.bp.blogspot.com/-RIWB8_DEW-A/TeLTZ0tI0_I/AAAAAAAAAT4/vkgx2JFD2iw/s320/Captu3re.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;原本我是在Google App Engine中，自己畫出那些驗證碼的數字!&lt;br /&gt;在local端可以繪出圖形來，但是deploy上去GAE以後，&lt;br /&gt;就失敗了，原因是因為有個class並不被GAE支援。&lt;br /&gt;因此無法繪圖。&lt;br /&gt;&lt;br /&gt;我也懶得找其他的solution，第一個念頭就是找是否有相關的API。&lt;br /&gt;找到了&lt;a href="http://code.google.com/intl/zh-TW/apis/recaptcha/intro.html"&gt;reCAPTCHA&lt;/a&gt;(被Google買的)。&lt;br /&gt;&lt;br /&gt;接下來就來說明&lt;a href="http://code.google.com/intl/zh-TW/apis/recaptcha/intro.html"&gt;reCAPTCHA&lt;/a&gt;如何整合及運作。&lt;br /&gt;reCAPTCHA提供了兩種方法，讓開發者將reCAPTCHA整合至自己的網站中，&lt;br /&gt;1) using plugin.&lt;br /&gt;2)&amp;nbsp;writing code to communicate with our servers.&lt;br /&gt;第一種就是Google已經以大部分的程式語言撰寫出一個套件讓開發者使用。&lt;br /&gt;第二種就是寫一些簡單的code和他們的server進行溝通(驗證) &lt;br /&gt;兩種其實都不難，都很簡單。&lt;br /&gt;&lt;br /&gt;但這裡我就先教大家第一種。&lt;br /&gt;1)&amp;nbsp;首先請大家先至&lt;a href="https://www.google.com/recaptcha/admin/create"&gt;此網站&lt;/a&gt;進行申請，輸入您要使用reCAPTCHA的domain。&amp;nbsp;如圖一&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xB0EYR4EvuU/TeLVYAbWTGI/AAAAAAAAAT8/1vBqAiTurPs/s1600/1.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="235" src="http://4.bp.blogspot.com/-xB0EYR4EvuU/TeLVYAbWTGI/AAAAAAAAAT8/1vBqAiTurPs/s400/1.PNG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖一&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;2) 輸入完成以後，會得到兩組key，一組是public，一組是private。&lt;br /&gt;&lt;br /&gt;3) 申請完成以後，就選擇你要以哪種程式語言進行整合。(這裡選JAVA)&lt;br /&gt;&lt;br /&gt;4) 來&lt;a href="http://code.google.com/p/recaptcha/downloads/list?q=label:java-Latest"&gt;此處&lt;/a&gt;下載lib(recaptcha4j-0.0.7.jar)，並且放進去project。&lt;br /&gt;&lt;br /&gt;5) 接著就開始coding。&lt;br /&gt;&lt;br /&gt;先撰寫client端要顯示CAPTCHA圖片的code&lt;br /&gt;&lt;br /&gt;1) 首先先撰寫client端的code，先import需要的class&lt;br /&gt;&lt;pre class="brush: java"&gt;&amp;lt;%@ page import="net.tanesha.recaptcha.ReCaptcha" %&amp;gt;&lt;br /&gt;&amp;lt;%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2) 建立一個intance以準備create一個captcha，記得填入自己的public、private key。&lt;br /&gt;第三個參數在官方文件中並沒有說明，但是去看source code，是"includeNoscript"的意思，&lt;br /&gt;意思是說此instance(object)是否包含Noscript，而這邊是沒有，所以是false&lt;br /&gt;&lt;pre class="brush: java"&gt;ReCaptcha c = ReCaptchaFactory.newReCaptcha("your_public_key", "your_private_key", false);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3) 利用剛剛object的顯示出CAPTCHA來。&lt;br /&gt;第一個參數(errorMessage)是指當有錯誤時要顯示甚麼樣的訊息&lt;br /&gt;第二個參數(options)是指一些要給此object的一些特別屬性(如:theme)&lt;br /&gt;&lt;pre class="brush: java"&gt;c.createRecaptchaHtml(null, null)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接下來就寫server端驗證的code!&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;String remoteAddr = request.getRemoteAddr();&lt;br /&gt;ReCaptchaImpl reCaptcha = new ReCaptchaImpl();&lt;br /&gt;reCaptcha.setPrivateKey("your_private_key");&lt;br /&gt;&lt;br /&gt;String challenge = request.getParameter("recaptcha_challenge_field"); //這個參數是要給server要求驗證的&lt;br /&gt;String uresponse = request.getParameter("recaptcha_response_field"); //這個參數是使用者輸入的參數!&lt;br /&gt;ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse);&lt;br /&gt;&lt;br /&gt;if (reCaptchaResponse.isValid()) {&lt;br /&gt; out.print("Answer was entered correctly!");&lt;br /&gt;} else {&lt;br /&gt; out.print("Answer is wrong");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這樣就大功告成了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6269825691483385999?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6269825691483385999/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/05/integrate-captcha-to-your-site-using.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6269825691483385999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6269825691483385999'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/05/integrate-captcha-to-your-site-using.html' title='Integrate CAPTCHA to your site (using plugin)-【1】'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-RIWB8_DEW-A/TeLTZ0tI0_I/AAAAAAAAAT4/vkgx2JFD2iw/s72-c/Captu3re.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-4804014777526773076</id><published>2011-05-17T00:29:00.000-07:00</published><updated>2011-05-17T00:35:27.171-07:00</updated><title type='text'>a tutorial on install GAE plugin on eclipse</title><content type='html'>因為學弟妹需要在GAE上使用Google Analytics，&lt;br /&gt;因此打這篇安裝流程給學弟妹。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;主要分成兩大步驟，&lt;br /&gt;(一) 先去註冊Google App Engine&lt;br /&gt;(二) 在Eclipse上安裝GAE Plugin&lt;br /&gt;&lt;br /&gt;(一)在上課時就請大家申請好了，這邊就不多做說明。&lt;br /&gt;主要講解(二)&amp;nbsp;步驟，&lt;br /&gt;&lt;br /&gt;(二)的逐步步驟如下：&lt;br /&gt;&lt;br /&gt;1) 先來到這個網址&amp;nbsp;&lt;a href="http://www.eclipse.org/downloads/"&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&amp;nbsp;,接著下載 "&lt;b&gt;Eclipse Classic 3.6.2, 171 MB"&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;2) 下載完成，就進行解壓縮，不需要進行安裝的動作就可以使用&lt;b&gt;Eclipse&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;3) 接著就打開&lt;b&gt;Eclipse &lt;/b&gt;，點選工具列上的Help（如圖一）&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2uHTaYtQqbE/TdIeGIs6C0I/AAAAAAAAATQ/k6VcFVWwP18/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="328" src="http://4.bp.blogspot.com/-2uHTaYtQqbE/TdIeGIs6C0I/AAAAAAAAATQ/k6VcFVWwP18/s640/1.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖一&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;4) 並點選Install New Software，會見到以下畫面（圖二）&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-PX1srSNbOmA/TdIegvqn7aI/AAAAAAAAATs/nk256EBGKqA/s1600/Capture.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="357" src="http://4.bp.blogspot.com/-PX1srSNbOmA/TdIegvqn7aI/AAAAAAAAATs/nk256EBGKqA/s400/Capture.PNG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖二&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;5) 請點選上圖（圖二）中的Add按鈕，點選以後會出現下圖（圖三）&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-g5K_tDAvlj4/TdIeGbZ0pfI/AAAAAAAAATU/-PPfLv99aws/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="115" src="http://3.bp.blogspot.com/-g5K_tDAvlj4/TdIeGbZ0pfI/AAAAAAAAATU/-PPfLv99aws/s320/2.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖三&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;6) 請在圖三中的兩個欄位（Name、Location）輸入這些資訊&lt;br /&gt;Name：隨意取，但盡量取相關名稱&lt;br /&gt;Location：告訴Eclipse你要安裝的plugin在哪個位置&lt;br /&gt;&lt;br /&gt;7) 輸入完成後請按OK，並稍等一下，會見到下圖（圖四）&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/--1cvKtn_gTI/TdIeG0KWAiI/AAAAAAAAATY/1_-C7ujlU2g/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="362" src="http://2.bp.blogspot.com/--1cvKtn_gTI/TdIeG0KWAiI/AAAAAAAAATY/1_-C7ujlU2g/s400/3.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖四&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;8) 出現上圖（圖四）以後，請勾選Plugin以及SDKs，勾選以後點選Next即可進行安裝。&lt;br /&gt;&lt;br /&gt;9) 安裝完成，會發現工具列上多了四個按鈕（如圖五）&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xxJAyRvgZ2Q/TdIeHXulnFI/AAAAAAAAATc/Xt1yVWNUIlo/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="48" src="http://1.bp.blogspot.com/-xxJAyRvgZ2Q/TdIeHXulnFI/AAAAAAAAATc/Xt1yVWNUIlo/s400/4.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖五&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;以上是安裝GAE Plugin 的步驟。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接下來說明建立一個project的步驟。&lt;br /&gt;&lt;br /&gt;1) 點選下圖（圖六）中的藍色圈圈，並點選New Web Application Project&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5kL69U7nfT0/TdIeHrSq9XI/AAAAAAAAATg/7pdezICVwoA/s1600/5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-5kL69U7nfT0/TdIeHrSq9XI/AAAAAAAAATg/7pdezICVwoA/s1600/5.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖六&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;2) 點選以後，會見到下圖（圖七），並輸入相關資訊&lt;br /&gt;&lt;b&gt;Project Name：&lt;/b&gt;專案名稱（需英文）。EX: test&lt;br /&gt;&lt;b&gt;Package：　　&lt;/b&gt;之後建立的class都會在此package名稱底下，package名稱由兩個以上的英文組成，並且英文之間須以句號(.)來進行分隔。 EX: com.ken&lt;br /&gt;&lt;b&gt;Location：　　&lt;/b&gt;此project會存在哪裡，預設是存在workspace，當然也可以更改儲存路徑&lt;br /&gt;&lt;b&gt;Google SDKs：&lt;/b&gt;這邊有兩個選項(1) Use Google Web Toolkit、(2) Use Google App Engine，在這邊我們只需要勾選(2)就好，不需要勾選(1)GWT。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ao77qEkl_yE/TdIeH0Cfg4I/AAAAAAAAATk/SfXvfE7PlUw/s1600/6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-ao77qEkl_yE/TdIeH0Cfg4I/AAAAAAAAATk/SfXvfE7PlUw/s400/6.png" width="321" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖七&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;3) 輸入相關資訊後，按下Finish即可完成建立。&lt;br /&gt;&lt;br /&gt;4) 接著就可以安插Google&amp;nbsp;Analytics的js code。（這邊以前上JSP/Servlet過的話應該都會了，就不進行說明）這裡就是普通的JSP/Servlet，GAE較不同且較精華的是Database的部分，GAE是採用datastore(big table)，它是屬於物件式資料庫，並不是傳統在學校學的關聯式資料庫。這邊學弟妹只需要上傳Google&amp;nbsp;Analytics的code，因此就不深入講解datastore。&lt;br /&gt;&lt;br /&gt;5) 安插以後，按下圖八中的飛機按鈕進行deploy的動作。&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-pz9pWu8WnHg/TdIeIZFkfEI/AAAAAAAAATo/TdgnQzEBu5A/s1600/7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-pz9pWu8WnHg/TdIeIZFkfEI/AAAAAAAAATo/TdgnQzEBu5A/s1600/7.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖八&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;6) 按下以後會見到下圖（圖九），按下按鈕Deploy之前！！！！請先點選圖九中的App Engine project settings&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-O4i07K7XfMg/TdIiQWqDJeI/AAAAAAAAATw/9Dh3J78g1aQ/s1600/Capture1.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="176" src="http://3.bp.blogspot.com/-O4i07K7XfMg/TdIiQWqDJeI/AAAAAAAAATw/9Dh3J78g1aQ/s320/Capture1.PNG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖九&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;7) 點選以後會見到下圖（圖十），請記得填寫自己的Application ID。填寫完成按下按鈕OK，就會回到圖九，此時再按下按鈕Deploy，就完成了&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7hJhZtLiTbU/TdIiQrPaaRI/AAAAAAAAAT0/dCdXQovfsaA/s1600/Capture2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://1.bp.blogspot.com/-7hJhZtLiTbU/TdIiQrPaaRI/AAAAAAAAAT0/dCdXQovfsaA/s320/Capture2.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-4804014777526773076?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/4804014777526773076/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/05/tutorial-on-install-gae-plugin-on.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4804014777526773076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4804014777526773076'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/05/tutorial-on-install-gae-plugin-on.html' title='a tutorial on install GAE plugin on eclipse'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-2uHTaYtQqbE/TdIeGIs6C0I/AAAAAAAAATQ/k6VcFVWwP18/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6768254923118919137</id><published>2011-04-27T19:53:00.000-07:00</published><updated>2011-04-27T19:53:37.334-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jstl'/><title type='text'>JSTL problem of Import with param</title><content type='html'>我有一個set of entity，&lt;br /&gt;我想要把這entity的資料，redirect到另一個page（footer.jsp），&lt;br /&gt;我用了JSTL的&lt;c:import&gt;&lt;/c:import&gt;&lt;br /&gt;如下：&lt;br /&gt;&lt;pre class="brush: html"&gt; &lt;br /&gt;&amp;lt;c:import url = "/footer.jsp"  charEncoding="utf-8"&amp;gt;&lt;br /&gt; &amp;lt;c:param name="com"&amp;gt;${requestScope.company }&amp;lt;/c:param&amp;gt;&lt;br /&gt;&amp;lt;/c:import&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;但是http在request&amp;nbsp;parameters時會當作string來對待，&lt;br /&gt;但在這個例子中，我傳的是一個object，&lt;br /&gt;所以在接收頁時會有錯誤，因為該object已經被轉成string，&lt;br /&gt;所以會找不到該property，&lt;br /&gt;因為在&lt;c:param&gt;會自行把value轉換成string，&lt;/c:param&gt;&lt;br /&gt;如同String.valueOf()。&lt;br /&gt;&lt;br /&gt;所以我改用另一個方法，如下&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;c:set var="com" value="${requestScope.company}" scope="request" /&amp;gt;    &lt;br /&gt;&amp;lt;c:import url = "/footer.jsp"  charEncoding="utf-8" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6768254923118919137?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6768254923118919137/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/04/jstl-problem-of-import-with-param.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6768254923118919137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6768254923118919137'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/04/jstl-problem-of-import-with-param.html' title='JSTL problem of Import with param'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8644811849298953896</id><published>2011-03-30T18:50:00.000-07:00</published><updated>2011-03-30T18:50:16.359-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ftp'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>ubuntu install vsftpd</title><content type='html'>今天剛灌好ubuntu server，順便把vsftpd裝起來，&lt;br /&gt;但是發現一直找不到該package，&lt;br /&gt;結果發現其實只是沒有更新sources.list，&lt;br /&gt;只要下&lt;br /&gt;&lt;div style="background: #E3F0FA; border: 1px dashed #89A6C6; margin-left: 10px; margin-top: 10px; padding-left: 10px; width: 200px;"&gt;sudo apt-get update&lt;/div&gt;&lt;br /&gt;更新完以後，就可以找到了。&lt;br /&gt;只要下&lt;br /&gt;&lt;div style="background: #E3F0FA; border: 1px dashed #89A6C6; margin-left: 10px; margin-top: 10px; padding-left: 10px; width: 200px;"&gt;sudo apt-get install vsftpd&lt;/div&gt;就可以安裝起來。&lt;br /&gt;安裝完成以後，就針對設定檔進行一些微調&lt;br /&gt;像是我不希望我的ftp server可以匿名登入，&lt;br /&gt;那麼我就要去設定檔把匿名登入關掉，&lt;br /&gt;首先先用編輯器開啟設定檔&lt;br /&gt;&lt;div style="background: #E3F0FA; border: 1px dashed #89A6C6; margin-left: 10px; margin-top: 10px; padding-left: 10px; width: 200px;"&gt;sudo vim /etc/vsftpd.conf&lt;/div&gt;打開以後，把&lt;br /&gt;&lt;br /&gt;anonymous_enable=YES&lt;br /&gt;改成&lt;br /&gt;&lt;br /&gt;anonymous_enable=no&lt;br /&gt;&lt;br /&gt;接著存檔離開。&lt;br /&gt;並重新啟動&lt;br /&gt;&lt;div style="background: #E3F0FA; border: 1px dashed #89A6C6; margin-left: 10px; margin-top: 10px; padding-left: 10px; width: 300px;"&gt;sudo /etc/init.d/vsftpd restart&lt;/div&gt;&lt;br /&gt;這樣即可。&lt;br /&gt;詳細設定檔可以去鳥哥看&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8644811849298953896?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8644811849298953896/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/03/ubuntu-install-vsftpd.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8644811849298953896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8644811849298953896'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/03/ubuntu-install-vsftpd.html' title='ubuntu install vsftpd'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-2333198344058763642</id><published>2011-03-17T14:25:00.000-07:00</published><updated>2011-03-17T14:25:42.666-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='gae/j'/><title type='text'>GAE/J DatastoreNeedIndexException: no matching index found解決方式</title><content type='html'>今天在實作一對多的relation，&lt;br /&gt;&lt;br /&gt;在部署上去以後，一直覺得出錯，&lt;br /&gt;&lt;br /&gt;錯誤訊息是：&lt;b&gt;com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found..&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;原因當然是因為沒有建立index，可是覺得很怪，&lt;br /&gt;&lt;br /&gt;因為之前記得會自動幫我建立index，&lt;br /&gt;&lt;br /&gt;找了一下solution，&lt;br /&gt;&lt;br /&gt;發現只要在local端run一次，就會自動幫我建立好index，&lt;br /&gt;&lt;br /&gt;並且會放在project_path\war\WEB-INF\appengine-generated資料夾底下，&lt;br /&gt;&lt;br /&gt;檔名為datastore-indexes-auto.xml&lt;br /&gt;&lt;br /&gt;裡面就是幫你建立相關的index語法。&lt;br /&gt;&lt;br /&gt;當然你也可以自己建立index。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-2333198344058763642?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/2333198344058763642/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/03/gaej-datastoreneedindexexception-no.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2333198344058763642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2333198344058763642'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/03/gaej-datastoreneedindexexception-no.html' title='GAE/J DatastoreNeedIndexException: no matching index found解決方式'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6556552846886765617</id><published>2011-03-09T18:53:00.000-08:00</published><updated>2011-03-09T18:53:25.570-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo login'/><title type='text'>Implement Yahoo Login (Using BBAuth)</title><content type='html'>想讓自己網站上的使用者不用註冊就可以使用自己的網站，&lt;br /&gt;&lt;br /&gt;只要有Yahoo帳號就可以登入自己的網站的話，&lt;br /&gt;&lt;br /&gt;可以導入Yahoo Login API，&lt;br /&gt;&lt;br /&gt;而Yahoo Login API主要分成三種，&lt;br /&gt;&lt;br /&gt;可以用下列三種認證/授權方式，&lt;br /&gt;&lt;br /&gt;1. OAuth&lt;br /&gt;&lt;br /&gt;2. OpenID&lt;br /&gt;&lt;br /&gt;3. BBAuth&lt;br /&gt;&lt;br /&gt;這邊選用第三種BBAuth，&lt;br /&gt;&lt;br /&gt;首先要先去註冊你的appid，&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.apps.yahoo.com/wsregapp/"&gt;點這裡來註冊&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;點開以後，會看到如下圖（圖一）的表格，&lt;br /&gt;&lt;br /&gt;第一格Yahoo ID：不用自己填，會幫你填好&lt;br /&gt;&lt;br /&gt;第二格Authentication method：點選第二個（Browser Based Authentication）&lt;br /&gt;&lt;br /&gt;第三格Developer/Company Name：填寫自己的名稱或公司名稱&lt;br /&gt;&lt;br /&gt;第四格Product Name：填寫產品名稱&lt;br /&gt;&lt;br /&gt;第五格Web Application URL：是指你網站的網址（不能IP喔）&lt;br /&gt;&lt;br /&gt;&lt;b&gt;第六格BBAuth Success URL：這格很重要，意思是當使用者登入成功以後，下個頁面要轉到哪個頁面&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;第七格Contact Email：填入自己的信箱就好&lt;br /&gt;&lt;br /&gt;第八格Phone Number：填入電話，這格為optional，可以不填&lt;br /&gt;&lt;br /&gt;第九格Description of application：敘述&lt;br /&gt;&lt;br /&gt;&lt;b&gt;第十格Require Access Scope：這格也很重要！意思是說這個認證可以在Yahoo的哪些服務進行存取，這邊我們先勾選Single Sign On, no user data can be accessed就好&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;填寫完成以後就點選Continue，&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-Xzu1Zal2Yrc/TXgz2F15ZFI/AAAAAAAAARs/6U5eGC00EhM/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="628" src="https://lh6.googleusercontent.com/-Xzu1Zal2Yrc/TXgz2F15ZFI/AAAAAAAAARs/6U5eGC00EhM/s640/1.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖一&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;點完按鈕Continue以後，會看到下圖（圖二）&lt;br /&gt;&lt;br /&gt;這頁主要是要進行認證的動作，Yahoo要check這個domain是屬於你的！&lt;br /&gt;&lt;br /&gt;做法是在自己的domain的根目錄底下放置一個.html檔案，&lt;br /&gt;&lt;br /&gt;檔名yahoo會提供給你，這邊的檔名是ydnv6nnxP.html。&lt;br /&gt;&lt;br /&gt;將此檔案放置在domain根目錄底下，&lt;br /&gt;&lt;br /&gt;然後按下圖中的按鈕Check Domain，&lt;br /&gt;&lt;br /&gt;此時Yahoo就會去request該.html檔，如果有放置上去，&lt;br /&gt;&lt;br /&gt;就會通過驗證。就會如圖中的Result: &lt;span class="Apple-style-span" style="color: #38761d;"&gt;Pass&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;如果是Pass，就繼續往下一步，按下按鈕Continue&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-Ti8XoBygyGE/TXgzHJLVt0I/AAAAAAAAARc/0CUUXbJLaDY/s1600/1.5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="304" src="https://lh6.googleusercontent.com/-Ti8XoBygyGE/TXgzHJLVt0I/AAAAAAAAARc/0CUUXbJLaDY/s640/1.5.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖二&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;點完Continue按鈕以後，會看到下圖（圖三）的畫面&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: -webkit-auto;"&gt;代表申請成功，Yahoo會給你app id和secret&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-U7J5MM21LMY/TXgzHz4HlTI/AAAAAAAAARk/bLcaZyaNerU/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="262" src="https://lh3.googleusercontent.com/-U7J5MM21LMY/TXgzHz4HlTI/AAAAAAAAARk/bLcaZyaNerU/s640/2.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖三&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;申請完成以後就開始來寫code了！！&lt;br /&gt;&lt;br /&gt;這邊我以JSP/SERVLET為主，&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;try{&lt;br /&gt;     final String strAppId = "appID"; //應用程式碼&lt;br /&gt;     final String strSecrect = "secect"; //驗證用&lt;br /&gt;     String strTimeStamp = String.valueOf(new Date().getTime()/1000); //把毫秒轉成秒數&lt;br /&gt;             &lt;br /&gt;     //接下來這段主要是在做md5，&lt;br /&gt;     MessageDigest Signature = MessageDigest.getInstance("MD5");&lt;br /&gt;     //下面這行是Yahoo要求要進行md5的參數&lt;br /&gt;     String tempMD5 = String.format("/WSLogin/V1/wslogin?appid=%s&amp;amp;.intl=tw&amp;amp;send_userhash=1&amp;amp;ts=%s%s", strAppId, strTimeStamp, strSecrect);&lt;br /&gt;     Signature.update(tempMD5.getBytes());&lt;br /&gt; &lt;br /&gt;     byte[] Bt = Signature.digest();&lt;br /&gt;     StringBuffer buffer = new StringBuffer();&lt;br /&gt;     for (int i = 0; i &amp;lt; Bt.length; ++i) {&lt;br /&gt;          byte b = Bt[i];&lt;br /&gt;          int value = (b &amp;amp; 0x7F) + (b &amp;lt; 0 ? 128 : 0);&lt;br /&gt;          buffer.append(value &amp;lt; 16 ? "0" : "");&lt;br /&gt;          buffer.append(Integer.toHexString(value));&lt;br /&gt;     }&lt;br /&gt;     //md5 結束&lt;br /&gt;           &lt;br /&gt;     //進行完md5以後，就進行Redirect&lt;br /&gt;     resp.sendRedirect(String.format("https://api.login.yahoo.com/WSLogin/V1/wslogin?appid=%s&amp;amp;.intl=tw&amp;amp;send_userhash=1&amp;amp;ts=%s&amp;amp;sig=%s", strAppId, strTimeStamp, buffer.toString()));&lt;br /&gt;  &lt;br /&gt;}catch (Exception e) {&lt;br /&gt;     //MD5 Exception&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;在進行完redirect以後，就會轉向Yahoo登入的頁面，&lt;br /&gt;&lt;br /&gt;登入完成就會將頁面導向之前&lt;b&gt;第六格BBAuth Success&lt;/b&gt;的URL&lt;br /&gt;&lt;br /&gt;接下來有比較重要的幾點，&lt;br /&gt;&lt;br /&gt;由於Yahoo Login是無法取得使用者的資訊，&lt;br /&gt;&lt;br /&gt;它不同於Facebook、Goolge Login，&lt;br /&gt;&lt;br /&gt;可是一般的網站不是都要記住session嗎?&lt;br /&gt;&lt;br /&gt;可能是將使用者帳號之類的資訊存在session裡面，&lt;br /&gt;&lt;br /&gt;可是Yahoo卻無法存取到使用者相關資訊，&lt;br /&gt;&lt;br /&gt;但是!Yahoo會回傳一個userhash，到&lt;b&gt;第六格BBAuth Success&lt;/b&gt;的URL中，&lt;br /&gt;&lt;br /&gt;而這個userhash是唯一的，不會有重複!&lt;br /&gt;&lt;br /&gt;所以我們一樣可以利用此userhash存在session裡面，&lt;br /&gt;&lt;br /&gt;還會回傳appid、token、appdata、ts、sig這些參數回來。&lt;br /&gt;&lt;br /&gt;但比較重要的是userhash，因為這個是Unique的identifier!!&lt;br /&gt;&lt;br /&gt;大致上這樣就完成一個Yahoo Login了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.yahoo.com/bbauth/user.html"&gt;參考來源&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6556552846886765617?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6556552846886765617/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/03/implement-yahoo-login-using-bbauth.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6556552846886765617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6556552846886765617'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/03/implement-yahoo-login-using-bbauth.html' title='Implement Yahoo Login (Using BBAuth)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-Xzu1Zal2Yrc/TXgz2F15ZFI/AAAAAAAAARs/6U5eGC00EhM/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8655100324102828052</id><published>2011-03-09T14:52:00.000-08:00</published><updated>2011-03-09T14:52:09.096-08:00</updated><title type='text'>Java static,final 基本概念</title><content type='html'>從很久以前我就了解到，&lt;br /&gt;&lt;br /&gt;不僅僅要知道know how，&lt;br /&gt;&lt;br /&gt;還要知道know why，&lt;br /&gt;&lt;br /&gt;舉個例子，當我派工作給底下的人做時，&lt;br /&gt;&lt;br /&gt;例如要他做出一個發送mail的功能出來，&lt;br /&gt;&lt;br /&gt;恩，拜Google大神所賜，通常很快都可以找到發送mail的code。&lt;br /&gt;&lt;br /&gt;但是當我細下去問每一行code的用途時，&lt;br /&gt;&lt;br /&gt;大多是...."恩...不知道"。&lt;br /&gt;&lt;br /&gt;我覺得此風不可長。&lt;br /&gt;&lt;br /&gt;甚至有些學弟們搞不清楚何時要用static、final。&lt;br /&gt;&lt;br /&gt;也不懂甚麼是interface、abstract等等之類的。&lt;br /&gt;&lt;br /&gt;因為他們也不知道這些東西的作用。&lt;br /&gt;&lt;br /&gt;所以用這篇文章來稍微解說一下。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;static：&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;靜態的意思&lt;br /&gt;&lt;br /&gt;可以用來宣告一個函數或者變數，&lt;br /&gt;&lt;br /&gt;只要記得當一個函數或者變數被宣告為static時，&lt;br /&gt;&lt;br /&gt;他就具有唯一值的概念！！&lt;br /&gt;&lt;br /&gt;他就永遠只佔著那一組記憶體空間。&lt;br /&gt;&lt;br /&gt;不管該類別被new幾個object，該值永遠都會是一樣的！&lt;br /&gt;&lt;br /&gt;舉個例子！&lt;br /&gt;&lt;br /&gt;我們看到下面code的例子&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;class test{&lt;br /&gt;     static int iValue = 0;&lt;br /&gt;     public test() {&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;public class main {&lt;br /&gt;     public static void main(String[] argv)  {&lt;br /&gt;          test test1 = new test();&lt;br /&gt;          test test2 = new test();&lt;br /&gt;          System.out.println(test1.iValue);&lt;br /&gt;          test2.iValue  = 10;&lt;br /&gt;          System.out.println(test2.iValue);&lt;br /&gt;          System.out.println(test1.iValue);&lt;br /&gt;     } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;我們把test這個類別裡的資料成員iValue宣告為static，&lt;br /&gt;&lt;br /&gt;然後再main裡面分別去new兩個object出來。&lt;br /&gt;&lt;br /&gt;分別是test1, test2，&lt;br /&gt;&lt;br /&gt;然後先印出test1的iValue出來，（印出0，當然！一開始是0）&lt;br /&gt;&lt;br /&gt;接著我們用test2這個object去將iValue設值設為10，&lt;br /&gt;&lt;br /&gt;接著再去印出test2的iValue出來，（印出10出來，當然！因為設成10了阿）&lt;br /&gt;&lt;br /&gt;重點來了！&lt;br /&gt;&lt;br /&gt;這時候再印出test1的iValue出來！&lt;br /&gt;&lt;br /&gt;大部分的人會覺得，應該是印出0阿，&lt;br /&gt;&lt;br /&gt;但是印出的是10。&lt;br /&gt;&lt;br /&gt;原因是因為我們將iValue宣告成static了。&lt;br /&gt;&lt;br /&gt;而iValue成為一個共同的變數。&lt;br /&gt;&lt;br /&gt;這就是static 的一個特性！&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;特性一：永遠會是一個唯一值！！&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;且static 還有一個特性，&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;特性二：static可以透過類別直接存取使用！&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;意思是我們其實不需要new 一個object出來。&lt;br /&gt;&lt;br /&gt;也可以透過類別直接去存取該變數&lt;br /&gt;&lt;br /&gt;例子如下！&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;class test{&lt;br /&gt;     static int iValue = 0;&lt;br /&gt;     public test() {&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;public class main {&lt;br /&gt;     public static void main(String[] argv)  {&lt;br /&gt;          System.out.println(test.iValue);&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;你會發現在main中，我們並沒有new一個object出來！！&lt;br /&gt;&lt;br /&gt;也可以存取到test這個類別中的資料成員（iValue）&lt;br /&gt;&lt;br /&gt;static的介紹大概到這，&lt;br /&gt;&lt;br /&gt;接著介紹final&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;final：&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;相較於static，final的概念就容易了解許多！&lt;br /&gt;&lt;br /&gt;可以用來宣告一個類別、函數、或者變數。&lt;br /&gt;&lt;br /&gt;類別：當宣告在類別上時，該類別就無法被繼承！&lt;br /&gt;&lt;br /&gt;函數：當一個函數被宣告為final時，則繼承他的子類別無法覆寫&lt;br /&gt;&lt;br /&gt;變數：當一個變數被宣告為final時，意思是他是一個常數，是無法被修改的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;注意！&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;使用static final需要注意一點！！&lt;br /&gt;&lt;br /&gt;如上面所述說的，當我們有一個常數要宣告時，&lt;br /&gt;&lt;br /&gt;會宣告如下&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public static final String strValue = "ken";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;為什麼宣告這樣會有個風險呢？&lt;br /&gt;&lt;br /&gt;因為java在進行compile的時候，&lt;br /&gt;&lt;br /&gt;會將宣告成static final的變數，直接包進去程式裡面。&lt;br /&gt;&lt;br /&gt;什麼意思呢？&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;System.out.println(strValue);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;當你有類似存取strValue的code時，&lt;br /&gt;&lt;br /&gt;我們去把java會把compile成的class，decompile來看&lt;br /&gt;&lt;br /&gt;會發現它變成如下的code&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;System.out.println("ken");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;好啊好啊，那到底風險又在哪？&lt;br /&gt;&lt;br /&gt;當然啦，如果你今天有用一些好用的IDE進行開發，&lt;br /&gt;&lt;br /&gt;應該是不會遇到這樣的風險，&lt;br /&gt;&lt;br /&gt;以Eclipse為例，只要你一儲存或者執行，Eclipse就會幫你進行compile！&lt;br /&gt;（如果有勾選Build Automatically的話）&lt;br /&gt;&lt;br /&gt;可是如果你今天是徒法煉鋼！&lt;br /&gt;&lt;br /&gt;自己下指令進行compile的時候...&lt;br /&gt;&lt;br /&gt;又剛好你程式改了，把strValue的值改為"yang"，&lt;br /&gt;&lt;br /&gt;又剛好你忘記進行compile....&lt;br /&gt;&lt;br /&gt;這時候...如果有人去存取strValue就會出錯!!&lt;br /&gt;&lt;br /&gt;那怎麼解決???&lt;br /&gt;&lt;br /&gt;我們可以利用static block來進行宣告的動作!!!&lt;br /&gt;&lt;br /&gt;如下：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;static String strValue;&lt;br /&gt;static{&lt;br /&gt;     strValue = "ken";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;如果用這樣的宣告方式，即可避免上面述說的問題！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;原諒我，太累了。&lt;br /&gt;&lt;br /&gt;今天就先講解static,final 基本概念&lt;br /&gt;&lt;br /&gt;下篇在講解interface, abstract!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8655100324102828052?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8655100324102828052/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/03/java-staticfinal.html#comment-form' title='6 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8655100324102828052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8655100324102828052'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/03/java-staticfinal.html' title='Java static,final 基本概念'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-512245379382105298</id><published>2011-02-08T06:02:00.000-08:00</published><updated>2012-01-05T09:22:45.275-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook Login'/><title type='text'>實作 Facebook Login【舊版】</title><content type='html'>這篇主要是在GAE上整合Facebook Login。&lt;br /&gt;&lt;br /&gt;在整合之前得先做一些準備!&lt;br /&gt;&lt;br /&gt;先講解三個基本運作條件。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;User Authentication. 首先Facebook會先去認證這個user，判斷它的帳密是否有誤。&lt;/li&gt;&lt;li&gt;App Authorization. 第二步Facebook會先去認證你的網站，這可以保證user給予的&lt;b&gt;&lt;u&gt;基本&lt;/u&gt;&lt;/b&gt;資訊是給你的網站，而不是其他的。&lt;/li&gt;&lt;li&gt;App Authentication. 第三步是可以保證user知道有那些較&lt;b&gt;&lt;u&gt;詳細&lt;/u&gt;&lt;/b&gt;的資料可以被你的網站挖掘。&lt;/li&gt;&lt;/ol&gt;知道基本運作條件以後，&lt;br /&gt;&lt;br /&gt;請先至&lt;a href="http://www.facebook.com/developers/"&gt;http://www.facebook.com/developers/&lt;/a&gt;此網站，&lt;br /&gt;&lt;br /&gt;進去以後會看到下圖（圖一），並且點選圖中紅色方框中的按鈕&lt;b&gt;Set Up New App。&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6SxqtkJQECI/TVCjnQAGoHI/AAAAAAAAAQ8/OwvpFu4z9zQ/s1600/0.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="304" src="http://4.bp.blogspot.com/_6SxqtkJQECI/TVCjnQAGoHI/AAAAAAAAAQ8/OwvpFu4z9zQ/s640/0.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖一&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;點選以後， 如果先前並沒有開發過Facebook相關app的developer，&lt;br /&gt;&lt;br /&gt;會見到下圖（圖二），告知您並沒有驗證過，請透過mobile phone or credit card驗證。（免費的）&lt;br /&gt;&lt;br /&gt;這裡我們選擇moblie phone做驗證。&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6SxqtkJQECI/TVCjpmh7OEI/AAAAAAAAARE/UioJ7P0QYpU/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="136" src="http://4.bp.blogspot.com/_6SxqtkJQECI/TVCjpmh7OEI/AAAAAAAAARE/UioJ7P0QYpU/s640/2.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖二&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&amp;nbsp;點選圖二中的mobile phone以後，會見到下圖（圖三），會要求您輸入您的電話號碼，&lt;br /&gt;&lt;br /&gt;記得要選取為台灣的國籍碼886，還有一點很重要！！！！&lt;br /&gt;&lt;br /&gt;在Phone Number欄位中，填寫的手機號碼，記得把0拿掉！！！&lt;br /&gt;&lt;br /&gt;如：963123123（不要加上0）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TVCjqCQF2JI/AAAAAAAAARI/v2YA5iFiRC0/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="498" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TVCjqCQF2JI/AAAAAAAAARI/v2YA5iFiRC0/s640/3.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖三&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;點下圖三中的Confirm按鈕以後，Facebook會回傳一組verify code至您的手機，&lt;br /&gt;&lt;br /&gt;請將verify code輸入。並按下按鈕OK。驗證成功後會出現下圖（圖四）&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TVCjqt16p4I/AAAAAAAAARM/xdXuA-Ixzbk/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="490" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TVCjqt16p4I/AAAAAAAAARM/xdXuA-Ixzbk/s640/4.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖四&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&amp;nbsp;當驗證完成以後，再去點選圖一中紅色方框中的按鈕&lt;b&gt;Set Up New App。&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;並且輸入App名稱，然後再點選圖五中的按鈕Create App。&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6SxqtkJQECI/TVCjq3MipXI/AAAAAAAAARQ/4STQTHXX5js/s1600/5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="306" src="http://4.bp.blogspot.com/_6SxqtkJQECI/TVCjq3MipXI/AAAAAAAAARQ/4STQTHXX5js/s640/5.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖五&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;完成以後，Facebook 會給予你這個app一些基本資訊（App ID、API Key、App Secret....etc）&lt;br /&gt;&lt;br /&gt;接著得做一些設定，點選圖六中的方框中的連結&lt;b&gt;Edit Settings&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TVCjrb8GEFI/AAAAAAAAARU/QOU3IqlhIcY/s1600/6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="396" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TVCjrb8GEFI/AAAAAAAAARU/QOU3IqlhIcY/s640/6.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖六&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;點選以後，會進到如下圖(圖七)的畫面，請先點選左方的Web Site ，接著就輸入一些相關資訊！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Site URL：輸入您的網址（如：www.google.com）&lt;/li&gt;&lt;li&gt;Site Domain：輸入您的domain（如：google.com）&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TVCjrw869kI/AAAAAAAAARY/SAYS614DJZg/s1600/7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="340" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TVCjrw869kI/AAAAAAAAARY/SAYS614DJZg/s640/7.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;圖七&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;完成上述設定步驟以後，就可以來寫code了喔！！！&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red; font-size: x-large;"&gt;注意!!! 底下的code已經不能使用了! 因為FB改版了!&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; font-size: x-large;"&gt;所以請至&lt;a href="http://blog.kenyang.net/2012/01/facebook-login.html"&gt;另一篇來看如何實作&lt;/a&gt;!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;首先，請在你的加入facebook的script。&lt;br /&gt;&lt;br /&gt;如底下：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;script src="http://connect.facebook.net/en_US/all.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著就輸入下段code！&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: javascript"&gt;&amp;lt;script&amp;gt;&lt;br /&gt; //先做init的動作，輸入自己的app id&lt;br /&gt; FB.init({ &lt;br /&gt;  appId:'你自己的app id', &lt;br /&gt;  cookie:true, &lt;br /&gt;  status:true, &lt;br /&gt;  xfbml:true &lt;br /&gt; });&lt;br /&gt; &lt;br /&gt; //接著去subscribe一個event，就是去監聽一個event&lt;br /&gt; //這邊去監聽有關login的event。（也就是說login成功以後，會接收到訊息）&lt;br /&gt; FB.Event.subscribe('auth.login', function(response) {&lt;br /&gt;  if (response.session) {&lt;br /&gt;   alert('login success');//登入成功 &lt;br /&gt;  } else {&lt;br /&gt;   alert('login fail');&lt;br /&gt;  }&lt;br /&gt; });&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;完成以後就在你的頁面上，xfbml語法放置一個Facebook登入的button&lt;br /&gt;&lt;br /&gt;如下：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;fb:login-button&amp;gt;Login with Facebook&amp;lt;/fb:login-button&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這樣就大功告成了！！！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-512245379382105298?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/512245379382105298/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/02/implement-facebook-login.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/512245379382105298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/512245379382105298'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/02/implement-facebook-login.html' title='實作 Facebook Login【舊版】'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6SxqtkJQECI/TVCjnQAGoHI/AAAAAAAAAQ8/OwvpFu4z9zQ/s72-c/0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6979452360151108531</id><published>2011-01-15T14:05:00.000-08:00</published><updated>2011-01-15T14:05:34.974-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='adb'/><title type='text'>Android emulator install apk</title><content type='html'>今天要把某個app套入中華電信hami的SDK...&lt;br /&gt;&lt;br /&gt;因為一定要手機裝上Hami Store...但我不想在我手機上裝上這種東西....&lt;br /&gt;&lt;br /&gt;所以就用emulator...&lt;br /&gt;&lt;br /&gt;所以就利用指令在emulator上install Hami Store App!&lt;br /&gt;&lt;br /&gt;首先先切換至&lt;b&gt;Android_SDK&lt;/b&gt;目錄底下!&lt;br /&gt;&lt;br /&gt;在切換至底下的&lt;b&gt;platform-tools(在某個版本之前是在tools底下，如果找不到的話，可以去tools底下找找)，&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;利用底下的adb.exe去執行安裝apk&lt;br /&gt;&lt;br /&gt;指令如下：&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;adb install &lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;path\your_apk_name.apk&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;指令如圖：&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TTIZ5QC6YtI/AAAAAAAAAQg/JC6lg7FNglQ/s1600/%25E6%2593%25B7%25E5%258F%2596.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="80" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TTIZ5QC6YtI/AAAAAAAAAQg/JC6lg7FNglQ/s640/%25E6%2593%25B7%25E5%258F%2596.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;輸入指令完以後，&lt;br /&gt;&lt;br /&gt;如果安裝成功，則會顯示success字樣的訊息！！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6979452360151108531?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6979452360151108531/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/01/android-emulator-install-apk.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6979452360151108531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6979452360151108531'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/01/android-emulator-install-apk.html' title='Android emulator install apk'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6SxqtkJQECI/TTIZ5QC6YtI/AAAAAAAAAQg/JC6lg7FNglQ/s72-c/%25E6%2593%25B7%25E5%258F%2596.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8548553617361833958</id><published>2011-01-13T08:11:00.000-08:00</published><updated>2011-01-13T08:11:19.755-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='paper'/><title type='text'>碩一上報過的Paper</title><content type='html'>把碩一上報過的paper都記錄一下好了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;From Niches to Riches: Anatomy of the Long Tail&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Erik Brynjolfsson, Yu "Jeffery" Hu and Michael D. Smith-&lt;b&gt;MIS Sloan Management &amp;nbsp;Reveiw&lt;/b&gt;&lt;/li&gt;&lt;li&gt;主要是在講長尾理論在資訊科技業的影響&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;MapReduce: Simplified Data Processing&amp;nbsp;on Large Clusters&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Jeffrey Dean and Sanjay Ghemawat-&lt;b&gt;COMMUNICATIONS OF THE ACM January &amp;nbsp;2008/Vol. 51, No. 1&lt;/b&gt;&lt;/li&gt;&lt;li&gt;這篇是由Google Fellow提出的，主要是在講運用MapReduce(Master-Slaver架構)去處理大量的資料&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;CLOUD COMPUTING&amp;nbsp;FOR MOBILE USERS:&amp;nbsp;CAN OFFLOADING&amp;nbsp;COMPUTATION &amp;nbsp;SAVE ENERGY?&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Karthik Kumar and Yung-Hsiang Lu, Purdue University-&lt;b&gt;IEEE Computer Society&lt;/b&gt;&lt;/li&gt;&lt;li&gt;這篇是在探討將computation offloading到cloud上面的效益，以及告知我們什麼時候該把computation offloading&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Adaptive Computation Offloading for Energy Conservation on&amp;nbsp;Battery-Powered Systems&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Changjiu Xian,&amp;nbsp;Yung-Hsiang Lu,&amp;nbsp;Zhiyuan Li-&lt;b&gt;IEEE&lt;/b&gt;&lt;/li&gt;&lt;li&gt;這篇也是在探討computation offloading的問題，但是是探討offloading到普通的server上去，且告知我們五種offloading的時機，會帶來的效益，以及能省多少電&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;A View&amp;nbsp;of Cloud&amp;nbsp;Computing&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Michael Armbrust, Armando Fox, Rean Griffith, Anthony D. Josephi, Randy Katz, Andy Konwinski, Gunho Lee, David Patterson, Ariel Rabkin, Ion Stoica, Matei Zaharia-&lt;b&gt;&amp;nbsp;Communications of the ACM &amp;nbsp; | &amp;nbsp;April 2010 &amp;nbsp;| &amp;nbsp;VOL. 53 &amp;nbsp;| &amp;nbsp;NO. 4&lt;/b&gt;&lt;/li&gt;&lt;li&gt;這篇在介紹Cloud&amp;nbsp;Computing的概念，以及介紹幾種Cloud 平台(GAE, Azure, AWS)，以及介紹十種Cloud Computing 的障礙&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;to be continued....&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8548553617361833958?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8548553617361833958/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/01/paper.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8548553617361833958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8548553617361833958'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/01/paper.html' title='碩一上報過的Paper'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-4040332615317386853</id><published>2011-01-09T11:22:00.000-08:00</published><updated>2011-01-09T11:22:41.718-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ip'/><title type='text'>IP的分級和網域的概念</title><content type='html'>記得以前大二上網路概論的課有講到，&lt;br /&gt;&lt;br /&gt;但都忘光了，今天去把它惡補回來。&lt;br /&gt;&lt;br /&gt;並做點筆記!&lt;br /&gt;&lt;br /&gt;IP類似現實世界房子門牌的概念，&lt;br /&gt;&lt;br /&gt;而IP是由32個bits所組成&lt;br /&gt;&lt;br /&gt;而32個bits中包含了&lt;span class="Apple-style-span" style="color: red;"&gt;Net_id&lt;/span&gt;和&lt;span class="Apple-style-span" style="color: red;"&gt;Host_id&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;什麼是Net_id?&lt;br /&gt;&lt;br /&gt;Net_id意思是一個網域&lt;br /&gt;&lt;br /&gt;而Host_id意思是該網域底下的主機編號&lt;br /&gt;&lt;br /&gt;以現實例子來想，Net_id可以想像成一個大樓（台北市XX路）&lt;br /&gt;&lt;br /&gt;而一棟大樓裡面一定有很多戶人家，Host_id就是該大樓裡面所有的門牌號碼&lt;br /&gt;&lt;br /&gt;而有幾個bits是&lt;span class="Apple-style-span" style="color: red;"&gt;Net_id&lt;/span&gt;呢? 又有幾個bits是&lt;span class="Apple-style-span" style="color: red;"&gt;Host_id&lt;/span&gt;呢?&lt;br /&gt;&lt;br /&gt;就要講到IP分級了，&lt;br /&gt;&lt;br /&gt;IP主要分為五級(A、B、C、D、E)&lt;br /&gt;&lt;br /&gt;Class A網域的IP&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;０&lt;/b&gt;ｘｘｘｘｘｘｘ&lt;/span&gt;．ｘｘｘｘｘｘｘｘ．ｘｘｘｘｘｘｘｘ．ｘｘｘｘｘｘｘｘ&lt;div&gt;&lt;br /&gt;Net_id有8個bits，&lt;span class="Apple-style-span" style="color: red;"&gt;可是！&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;第一個bits一定要為0，&lt;br /&gt;&lt;br /&gt;所以就剩下7個bits，也就是2的7次方。&lt;br /&gt;&lt;br /&gt;也就是說&lt;br /&gt;&lt;br /&gt;Class A網域的IP範圍為０．ｘ．ｘ．ｘ～１２７．ｘ．ｘ．ｘ&lt;br /&gt;&lt;br /&gt;以此類推，&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Class B網域的IP&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;１０&lt;/b&gt;ｘｘｘｘｘｘ&lt;/span&gt;．&lt;span class="Apple-style-span" style="color: red;"&gt;ｘｘｘｘｘｘ&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;ｘｘ&lt;/span&gt;．ｘｘｘｘｘｘｘｘ．ｘｘｘｘｘｘｘｘ&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Net_id有16個bits，&lt;span class="Apple-style-span" style="color: red;"&gt;可是！&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;前二個bits一定要為１０，&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;也就是說&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Class B的IP範圍為１２８．ｘ．ｘ．ｘ～１９１．ｘ．ｘ．ｘ&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Class&amp;nbsp;C網域的IP&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;１１０&lt;/b&gt;ｘｘｘｘｘ&lt;/span&gt;．&lt;span class="Apple-style-span" style="color: red;"&gt;ｘｘｘｘｘｘ&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;ｘｘ&lt;/span&gt;．&lt;span class="Apple-style-span" style="color: red;"&gt;ｘｘｘｘｘｘ&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;ｘｘ&lt;/span&gt;．ｘｘｘｘｘｘｘｘ&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Net_id有24個bits，&lt;span class="Apple-style-span" style="color: red;"&gt;可是！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;前二個bits一定要為１&lt;/span&gt;&lt;/span&gt;１０，&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;也就是說&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Class C網域的IP範圍為１９２．ｘ．ｘ．ｘ～２２３．ｘ．ｘ．ｘ&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Class D E都被保留，這裡就不詳談。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;注意！！！&lt;br /&gt;&lt;br /&gt;&lt;b&gt;網域&lt;/b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;不等於&lt;/span&gt;&lt;b&gt;網段&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;網段的定義是，該網段底下的ip的net_id都相同，那麼就屬於同一網段！&lt;br /&gt;&lt;br /&gt;將在下一篇進行解說subnet的概念。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-4040332615317386853?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/4040332615317386853/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2011/01/ip.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4040332615317386853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4040332615317386853'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2011/01/ip.html' title='IP的分級和網域的概念'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1151284300161604383</id><published>2010-12-23T11:02:00.000-08:00</published><updated>2010-12-23T11:02:08.708-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='market'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Market改版內容</title><content type='html'>今天又收到android market的更新來信，&lt;br /&gt;&lt;br /&gt;內容大致如下：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;* The purchase refund period is now 15 minutes, and the maximum size for .apk files is now 50MB.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;以後charge back的時間從一天縮短為15分鐘，且上傳的.apk最大容量提升到50MB&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;* The details page for every app now displays the app’s “Promotional Graphic” assets at the top.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;然後如果您的APP有宣傳影片，則會在detail page上播放&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;* Market is now capable of filtering based on screen sizes and densities. NOTE: Filtering based on GL texture compression formats is not active at this time, but will be available in early January 2011.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;然後將來market會根據螢幕尺寸解析度來過濾內容。最快會在2011年一月實現。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;* Applications are now automatically added to new Live Wallpapers and Widgets categories, as appropriate.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;然後以後App有牽涉到桌布或者widget的，會自動歸類到那兩個類別。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;* The maximum size of the description field for an application is raised to 4000 characters.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;以後app的描述可以達到四千字！！！&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;* A minimum of two screen shots is now required for all applications. You can supply up to eight screenshots for each application.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;每個app至少需要兩個screen shot，最高可以到八個！！&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1151284300161604383?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1151284300161604383/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/12/android-market.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1151284300161604383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1151284300161604383'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/12/android-market.html' title='Android Market改版內容'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6427693113851177552</id><published>2010-12-19T23:52:00.000-08:00</published><updated>2010-12-19T23:52:04.240-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='menu'/><title type='text'>Android menu &amp; onCreateOptionsMenu和onPrepareOptionsMenu的差別</title><content type='html'>其實要實作android menu很簡單，&lt;br /&gt;&lt;br /&gt;這裡會快速的帶過，&lt;br /&gt;&lt;br /&gt;主要會講一下&lt;b&gt;onCreateOptionsMenu&lt;/b&gt;和&lt;b&gt;onPrepareOptionsMenu&lt;/b&gt;的差別&lt;br /&gt;&lt;br /&gt;首先先在/res/資料夾底下，開立一個資料夾/menu&lt;br /&gt;&lt;br /&gt;然後再/res/menu/資料夾底下，建立一個menu_option.xml的檔案&lt;br /&gt;&lt;br /&gt;檔案內容如下&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;&lt;br /&gt; &amp;lt;item android:id="@+id/menuOption1" android:title="option1"&amp;gt;&amp;lt;/item&amp;gt;&lt;br /&gt; &amp;lt;item android:id="@+id/menuOption2" android:title="option2"&amp;gt;&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;lt;/menu&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;建立完成以後，&lt;br /&gt;&lt;br /&gt;就在activity中加入menu的code如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class main extends Activity {&lt;br /&gt; &lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.main);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    //當menu option被點選以後的反應&lt;br /&gt;    @Override&lt;br /&gt;    public boolean onMenuItemSelected(int featureId, MenuItem item) {&lt;br /&gt;     Toast.makeText(this, String.valueOf(item.getItemId()), Toast.LENGTH_LONG).show();&lt;br /&gt;     return super.onMenuItemSelected(featureId, item);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    //建立option menu，等等會講解和onPrepareOptionsMenu的差別&lt;br /&gt;    @Override&lt;br /&gt;    public boolean onCreateOptionsMenu(Menu menu) {&lt;br /&gt;     MenuInflater inflater = getMenuInflater();&lt;br /&gt;     inflater.inflate(R.menu.menu_option, menu);&lt;br /&gt;     return super.onCreateOptionsMenu(menu);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    //一樣是建立option menu，等等會講解和onCreateOptionsMenu的差別&lt;br /&gt;    @Override&lt;br /&gt;    public boolean onPrepareOptionsMenu(Menu menu) {     &lt;br /&gt;     MenuInflater inflater = getMenuInflater();&lt;br /&gt;     inflater.inflate(R.menu.menu_option, menu);&lt;br /&gt;     return super.onPrepareOptionsMenu(menu);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這樣MENU就會建立完成，&lt;br /&gt;&lt;br /&gt;但是&lt;b&gt;onCreateOptionsMenu&lt;/b&gt;和&lt;b&gt;onPrepareOptionsMenu&lt;/b&gt;的差別在哪呢?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;onCreateOptionsMenu&lt;/b&gt;&lt;br /&gt;&lt;b&gt;　　只會&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;呼叫&lt;/b&gt;&lt;/span&gt;一次，他只會在MENU顯示之前，去做一次！！！之後就不會再去呼叫！&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;onPrepareOptionsMenu&lt;/b&gt;&lt;br /&gt;&lt;b&gt;　　&lt;/b&gt;&lt;b&gt;onPrepareOptionsMenu是每次在display menu之前，都會去呼叫，&lt;/b&gt;&lt;br /&gt;&lt;b&gt;　　只要按一次menu按鍵，就會呼叫一次。&lt;/b&gt;&lt;br /&gt;&lt;b&gt;　　所以你會發現每次只要按一次menu按鍵，&lt;/b&gt;&lt;br /&gt;&lt;b&gt;　　menu選單就會多兩個（因為我們預設是兩個）&lt;/b&gt;&lt;br /&gt;&lt;b&gt;　　你可以利用&lt;/b&gt;&lt;b&gt;onPrepareOptionsMenu來做update menu狀態的動作&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;如果你要把menu現有的option清空，&lt;br /&gt;&lt;br /&gt;就是下面那行ＣＯＤＥ&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;menu.clear();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6427693113851177552?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6427693113851177552/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/12/android-menu-oncreateoptionsmenuonprepa.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6427693113851177552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6427693113851177552'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/12/android-menu-oncreateoptionsmenuonprepa.html' title='Android menu &amp; onCreateOptionsMenu和onPrepareOptionsMenu的差別'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-2109987089957619817</id><published>2010-12-18T13:39:00.000-08:00</published><updated>2010-12-18T13:39:52.483-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='preference'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android SharedPreferences</title><content type='html'>如果想要做到儲存資訊，&lt;br /&gt;&lt;br /&gt;且又是少量的，&lt;br /&gt;&lt;br /&gt;如果用到sqllite又會太過於麻煩(且也會較慢)&lt;br /&gt;&lt;br /&gt;這裡就可以用到SharedPreferences，&lt;br /&gt;&lt;br /&gt;假設我們要做個登入介面&lt;br /&gt;&lt;br /&gt;有個Email的欄位，&lt;br /&gt;&lt;br /&gt;且使用者可以勾選是否要記憶住帳號及密碼，&lt;br /&gt;&lt;br /&gt;我們就可以用SharedPreferences來做&lt;br /&gt;&lt;br /&gt;首先我們先來做&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;儲存&lt;/span&gt;&lt;/b&gt;資訊的function&lt;br /&gt;&lt;br /&gt;如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;/*&lt;br /&gt; * 用來把mail存在preference裡面&lt;br /&gt; */&lt;br /&gt; private final void fnStorePrefs(){&lt;br /&gt;  //先取得preference，且名稱為STR_PREF 的prefernce，STR_PREF 請自行宣告&lt;br /&gt;  final SharedPreferences settings = getSharedPreferences(STR_PREF , 0);  &lt;br /&gt;  &lt;br /&gt;  //然後再取得editor，為了儲存資訊 &lt;br /&gt;  final Editor editor = settings.edit();&lt;br /&gt;&lt;br /&gt;  //把資料存進去&lt;br /&gt;  editor.putString(STR_PREF_EMAIL , edEmail.getText().toString());&lt;br /&gt;     &lt;br /&gt;  //然後一定要commit，才會存進去&lt;br /&gt;   editor.commit();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;然後再做&lt;b style="color: red;"&gt;取得&lt;/b&gt;資訊的function&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;/*&lt;br /&gt; * 用來把mail從preference抓回來&lt;br /&gt; */&lt;br /&gt; private final void fnRestorePrefs(){&lt;br /&gt;  //先取得preference，且名稱為STR_PREF 的prefernce，STR_PREF 請自行宣告&lt;br /&gt;  final SharedPreferences settings = getSharedPreferences(STR_PREF , 0);&lt;br /&gt;&lt;br /&gt;  //然後直接取得資料&lt;br /&gt;  final String strEmail            = settings.getString(STR_PREF_EMAIL ,"");&lt;br /&gt;&lt;br /&gt;  //然後再放進去EditText裡面去&lt;br /&gt;  edEmail.setText(strEmail);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;基本上就這二種基本的運用，一個儲存的function、一個取得的function&lt;br /&gt;&lt;br /&gt;就看什麼時候要&lt;b&gt;存&lt;/b&gt;，什麼時候要&lt;b&gt;取&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-2109987089957619817?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/2109987089957619817/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/12/android-sharedpreferences.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2109987089957619817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2109987089957619817'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/12/android-sharedpreferences.html' title='Android SharedPreferences'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-7220957436703278358</id><published>2010-12-15T14:46:00.000-08:00</published><updated>2010-12-15T14:47:19.290-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='picasa'/><category scheme='http://www.blogger.com/atom/ns#' term='gae/j'/><title type='text'>Google App Engine (GAE/J) 使用 Picasa API 取得相簿列表</title><content type='html'>不管你在哪裡(GAE、Java Application)要使用Picasa&lt;br /&gt;&lt;br /&gt;都一定要reference 4個jar檔，&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;gdata-core-1.0.jar&lt;/li&gt;&lt;li&gt;gdata-media-1.0.jar&lt;/li&gt;&lt;li&gt;gdata-photos-2.0.jar&lt;/li&gt;&lt;li&gt;google-collect-1.0-rc1.jar&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;可是Google Code的說明文件卻少說一個，&lt;br /&gt;&lt;br /&gt;文件上並沒有叫人家reference第四個，&lt;br /&gt;&lt;br /&gt;但是要reference進來才不會有錯&lt;br /&gt;&lt;br /&gt;reference進去以後就開始撰寫程式碼了&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這邊是以一個&lt;b&gt;固定帳號&lt;/b&gt;去做登入&lt;br /&gt;&lt;br /&gt;跟之前&lt;a href="http://blog.kenyang.net/search/label/google%20calendar"&gt;在GAE中使用行事曆&lt;/a&gt;的例子&lt;b&gt;不一樣&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;那個例子是會有Google登入畫面讓使用者輸入自己的帳號密碼，&lt;br /&gt;&lt;br /&gt;然後去存取使用者自己本身的行事曆&lt;br /&gt;&lt;br /&gt;不過這個例子不是，這個例子是用寫死的帳號密碼登入&lt;br /&gt;&lt;br /&gt;(&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;如果妳一樣要讓使用者填選，那麼也是要用&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; line-height: 16px;"&gt;AuthSub來認證，可以去行事曆那個例子看，差不&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;多)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;開始撰寫程式碼了&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package edu.chao.lab.servlet;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import javax.servlet.ServletException;&lt;br /&gt;import javax.servlet.http.HttpServlet;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpServletResponse;&lt;br /&gt;&lt;br /&gt;import com.google.gdata.client.photos.PicasawebService;&lt;br /&gt;import com.google.gdata.data.photos.AlbumFeed;&lt;br /&gt;import com.google.gdata.data.photos.GphotoEntry;&lt;br /&gt;import com.google.gdata.util.ServiceException;&lt;br /&gt;&lt;br /&gt;public class test extends HttpServlet {&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {&lt;br /&gt;  super.doGet(req, resp);&lt;br /&gt; try {&lt;br /&gt;  String strAcc = "你的帳號";&lt;br /&gt;  String strPwd = "你的密碼";&lt;br /&gt;  &lt;br /&gt;  PicasawebService service = new PicasawebService("sample");&lt;br /&gt;  service.setUserCredentials(strAcc, strPwd);    //登入&lt;br /&gt;  URL feedUrl = new URL("https://picasaweb.google.com/data/feed/api/user/"+strAcc+"?kind=album");&lt;br /&gt;  AlbumFeed myUserFeed = service.getFeed(feedUrl, AlbumFeed.class); //取得所有相簿烈表&lt;br /&gt;  List&amp;lt;GphotoEntry&amp;gt; lAlbum = myUserFeed.getEntries();&lt;br /&gt;  &lt;br /&gt;  for (GphotoEntry myAlbum : lAlbum) {&lt;br /&gt;   resp.getWriter().println(myAlbum.getTitle().getPlainText());//印出相簿名稱&lt;br /&gt;   resp.getWriter().println(myAlbum.getGphotoId());   //印出相簿編號&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;  }&lt;br /&gt; } catch (ServiceException e) {&lt;br /&gt;   // TODO Auto-generated catch block&lt;br /&gt;   e.printStackTrace();&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;這樣就完成了讀取相簿列表&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-7220957436703278358?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/7220957436703278358/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/12/google-app-engine-gaej-picasa-api.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7220957436703278358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7220957436703278358'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/12/google-app-engine-gaej-picasa-api.html' title='Google App Engine (GAE/J) 使用 Picasa API 取得相簿列表'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-4702508936818480257</id><published>2010-12-07T18:16:00.000-08:00</published><updated>2010-12-07T18:34:08.674-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><title type='text'>如何撰寫一個Chrome App</title><content type='html'>今早才看到&lt;a href="https://chrome.google.com/webstore"&gt;Chrome Web Store&lt;/a&gt;的Chrome App&lt;br /&gt;&lt;br /&gt;就覺得這個跟 Chrome Extension一樣&lt;br /&gt;&lt;br /&gt;先做先贏，&lt;br /&gt;&lt;br /&gt;就想說趕緊來做一個，&lt;br /&gt;&lt;br /&gt;去看了一下API，&lt;br /&gt;&lt;br /&gt;其實我對Chrome App有點失望...&lt;br /&gt;&lt;br /&gt;我覺得根本就只是轉址而已(個人愚見)&lt;br /&gt;&lt;br /&gt;爆發點應該會是在Google TV上的應用!&lt;br /&gt;&lt;br /&gt;不過對廠商來說，的確是多了一個管道銷售。(更何況是Google幫它銷售)&lt;br /&gt;&lt;br /&gt;對廠商來說，有利無弊。&lt;br /&gt;&lt;br /&gt;但是對我這種開發者而言，似乎沒有什麼太大意義。&lt;br /&gt;&lt;br /&gt;畢竟你還是得先有一個服務(不管是game、小工具)&lt;br /&gt;&lt;br /&gt;然後透過Chorme App轉址過去....&lt;br /&gt;&lt;br /&gt;好吧，費話不多說，&lt;br /&gt;&lt;br /&gt;就直接教學了，&lt;br /&gt;&lt;br /&gt;其實Chrome App和Chrome Extension差不多&lt;br /&gt;&lt;br /&gt;都是利用json來部屬。&lt;br /&gt;&lt;br /&gt;我這裡就直接PO範例了&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: jscript"&gt;{&lt;br /&gt;  "name": "App的名稱",&lt;br /&gt;  "version": "2",&lt;br /&gt;  "description": "打你要描述的內容.",&lt;br /&gt;  "app": {&lt;br /&gt;    "launch": {&lt;br /&gt;      "web_url": "http://www.google.com.tw/"&lt;br /&gt;    }&lt;br /&gt;  },&lt;br /&gt;  "icons": {&lt;br /&gt;     "128": "icon.png"&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;而上傳方式就跟上傳Chrome Extension一樣，&lt;br /&gt;&lt;br /&gt;大家可以去參考&lt;a href="http://blog.kenyang.net/2010/07/chrome-app.html"&gt;這篇&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-4702508936818480257?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/4702508936818480257/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/12/chrome-app.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4702508936818480257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4702508936818480257'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/12/chrome-app.html' title='如何撰寫一個Chrome App'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6188597508759326839</id><published>2010-12-07T00:25:00.000-08:00</published><updated>2010-12-07T00:25:55.749-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JML'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android connect to MSN (JML)</title><content type='html'>Android connect to MSN (JML)&lt;br /&gt;&lt;br /&gt;在Android用Java MSN Messenger Library(JML)登入&lt;br /&gt;&lt;br /&gt;其實JML是一個很好用的lib，&lt;br /&gt;&lt;br /&gt;在J2SE的環境下使用非常好整合，&lt;br /&gt;&lt;br /&gt;BUT...要整合至ANDROID中會有幾個小問題。&lt;br /&gt;&lt;br /&gt;第一：會少了一個GetPropertyAction的CLASS&lt;br /&gt;&lt;br /&gt;第二：JML裡用的SSL是採取SSLv3，但是android只能支援TLS&lt;br /&gt;&lt;br /&gt;第三：一樣會少了一個DatatypeFactory這個CLASS&lt;br /&gt;&lt;br /&gt;解決方法就是&lt;br /&gt;&lt;br /&gt;直接去找到JML的source code，&lt;br /&gt;&lt;br /&gt;直接拿它來做修改，而不是直接去拿jar來用。&lt;br /&gt;&lt;br /&gt;為了解決第一部，&lt;br /&gt;&lt;br /&gt;我們可以在網路上找到人家寫好的這個class（GetPropertyAction）&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jcs.mobile-utopia.com/jcs/2154_GetPropertyAction.java"&gt;來這下載&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;下載好以後，記得放在package名稱為sun.security.action的底下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;解決第二個方法就是&lt;br /&gt;&lt;br /&gt;去下載JML的SOURCE CODE&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/java-jml/files/java-jml/jml-1.0b4/"&gt;來這下載&lt;/a&gt;　（是載.ZIP檔案喔，這樣才會有SOURCE CODE）&lt;br /&gt;&lt;br /&gt;下載完成後，把src資料夾底下的net通通拉進來我們的project裡面&lt;br /&gt;&lt;br /&gt;拉進來後，畫面會如下&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6SxqtkJQECI/TP3tUVeF0VI/AAAAAAAAAPw/kYI6uJ-n4mk/s1600/%25E6%259C%25AA%25E5%2591%25BD%25E5%2590%258D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_6SxqtkJQECI/TP3tUVeF0VI/AAAAAAAAAPw/kYI6uJ-n4mk/s320/%25E6%259C%25AA%25E5%2591%25BD%25E5%2590%258D.png" width="217" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;拉進來以後，&lt;br /&gt;&lt;br /&gt;找到package名稱為net.sf.jml.protocol.soap，&lt;br /&gt;&lt;br /&gt;點兩下展開以後，&lt;br /&gt;&lt;br /&gt;點選class名稱為ContactList的class&lt;br /&gt;&lt;br /&gt;打開以後找到下面那行CODE&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;    SSLContext sc = SSLContext.getInstance("SSLv3");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;把它改成下面那行CODE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;    SSLContext sc = SSLContext.getInstance("TLS");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;這樣第二部就解決了。&lt;br /&gt;&lt;br /&gt;至於第三個解決方式，&lt;br /&gt;&lt;br /&gt;目前是先把ANDROID SDK設為2.2，&lt;br /&gt;&lt;br /&gt;2.2就有支援DatatypeFactory，&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著來寫連結至msn的code了。&lt;br /&gt;&lt;br /&gt;其實很簡單，你只要克服上面的問題，&lt;br /&gt;&lt;br /&gt;CODE應該就難不倒你，&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;    try {&lt;br /&gt;        final String email = "msn帳號";&lt;br /&gt;        final String password = "您的密碼";&lt;br /&gt;        final MsnMessenger messenger = MsnMessengerFactory.createMsnMessenger(email,&lt;br /&gt;                 password);&lt;br /&gt;&lt;br /&gt;        messenger.getOwner().setInitStatus(MsnUserStatus.ONLINE);&lt;br /&gt;&lt;br /&gt;        //這邊一定要用thread去執行登入&lt;br /&gt;        Thread thread = new Thread(new Runnable() {&lt;br /&gt;                public void run() {&lt;br /&gt;                    messenger.login();&lt;br /&gt;                }&lt;br /&gt;        });&lt;br /&gt; &lt;br /&gt;        thread.start();  &lt;br /&gt;&lt;br /&gt;         &lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;        Log.d("msn",e.toString());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這樣就完成了MSN登入了。&lt;br /&gt;&lt;br /&gt;至於怎麼截取聯絡人清單，只要您解決上面那三個問題&lt;br /&gt;&lt;br /&gt;則擷取連絡人，就不是問題了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6188597508759326839?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6188597508759326839/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/12/android-connect-to-msn-jml.html#comment-form' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6188597508759326839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6188597508759326839'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/12/android-connect-to-msn-jml.html' title='Android connect to MSN (JML)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6SxqtkJQECI/TP3tUVeF0VI/AAAAAAAAAPw/kYI6uJ-n4mk/s72-c/%25E6%259C%25AA%25E5%2591%25BD%25E5%2590%258D.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8799130125853581448</id><published>2010-12-06T09:02:00.000-08:00</published><updated>2010-12-06T09:02:49.058-08:00</updated><title type='text'>Android 2.3 SDK released!!!</title><content type='html'>等了好久&lt;br /&gt;&lt;br /&gt;Android 2.3 SDK 終於釋放了&lt;br /&gt;&lt;br /&gt;&lt;a href="http://android-developers.blogspot.com/2010/12/android-23-platform-and-updated-sdk.html"&gt;來這看相關說明!!!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;看說明影片，不知道裡面那隻手機是不是Nexus 2....&lt;br /&gt;&lt;br /&gt;希望不要啊!!&lt;br /&gt;&lt;br /&gt;好醜!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;然後2.3還有新增ProGuard的支援!!!&lt;br /&gt;&lt;br /&gt;真的是太棒了，我在想應該是想解決前陣子一直被人詬病的破解問題!&lt;br /&gt;&lt;br /&gt;至少可以提高一些門檻了!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;快去更新來玩玩吧!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8799130125853581448?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8799130125853581448/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/12/android-23-sdk-released.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8799130125853581448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8799130125853581448'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/12/android-23-sdk-released.html' title='Android 2.3 SDK released!!!'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-4095924172213147686</id><published>2010-11-26T23:36:00.000-08:00</published><updated>2010-12-20T20:33:33.756-08:00</updated><title type='text'>thinkpad t410 換8G記憶體</title><content type='html'>記得一個月前，一條4G的記憶體一條大概要快3000!!&lt;br /&gt;&lt;br /&gt;但是在兩個禮拜前，好像突然降到一條大概2000，&lt;br /&gt;&lt;br /&gt;最近還有1700的。&lt;br /&gt;&lt;br /&gt;但是我在Y拍上面買 19xx多的。&lt;br /&gt;&lt;br /&gt;買了兩條。&lt;br /&gt;&lt;br /&gt;這裡就順便教人家怎麼拆解T410，&lt;br /&gt;&lt;br /&gt;通常筆電的兩個記憶體插槽都在背部，&lt;br /&gt;&lt;br /&gt;T410一樣也是，但是T410的背部記憶體插槽只有一個!!&lt;br /&gt;&lt;br /&gt;另一個在鍵盤底下，&lt;br /&gt;&lt;br /&gt;這邊就順便教大家怎麼拆鍵盤&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TPCwVIJ4jNI/AAAAAAAAAOc/-uO1m0gKkyM/s1600/IMG_20101126_231940.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TPCwVIJ4jNI/AAAAAAAAAOc/-uO1m0gKkyM/s320/IMG_20101126_231940.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;金士頓 1333 4G*2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TPCy-5cGYhI/AAAAAAAAAPM/_PBfrSl0pr0/s1600/IMG_20101126_232054.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TPCy-5cGYhI/AAAAAAAAAPM/_PBfrSl0pr0/s320/IMG_20101126_232054.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;首先翻到背面，看到圖中的紅色圈圈，把那顆螺絲卸下來&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TPCzIFYWC3I/AAAAAAAAAPQ/gswaRrGpWOQ/s1600/IMG_20101126_232447.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TPCzIFYWC3I/AAAAAAAAAPQ/gswaRrGpWOQ/s320/IMG_20101126_232447.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;打開以後，會看到背部的第二個記憶體插槽，可以將一條記憶體插上&lt;br /&gt;然後圖中一樣有個紅色圈圈的螺絲點，一樣要把他卸下來&lt;br /&gt;那顆螺絲是鍵盤的螺絲&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TPCxv6uqrxI/AAAAAAAAAPI/AnpOl9PiJck/s1600/IMG_20101127_000009.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TPCxv6uqrxI/AAAAAAAAAPI/AnpOl9PiJck/s320/IMG_20101127_000009.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;卸下螺絲後，回到正面，然後稍微用一點力，把鍵盤往上推，&lt;br /&gt;可以利用一字螺絲起子，插入鍵盤最下方的細縫，稍微往上推，鍵盤就起來了&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TPCxCf-JtfI/AAAAAAAAAO0/flgmmkrqlb4/s1600/IMG_20101126_235440.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TPCxCf-JtfI/AAAAAAAAAO0/flgmmkrqlb4/s320/IMG_20101126_235440.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TPCxLjYDT_I/AAAAAAAAAO4/w7fQ5_dk4jQ/s1600/IMG_20101126_235449.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TPCxLjYDT_I/AAAAAAAAAO4/w7fQ5_dk4jQ/s320/IMG_20101126_235449.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;鍵盤底下會有一塊黑色的東西，把它掀起來(別撕掉喔)&lt;br /&gt;第一個記憶體插槽就在這!&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TPCxUPrVkKI/AAAAAAAAAO8/QyMj1PCB-Qk/s1600/IMG_20101126_235458.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TPCxUPrVkKI/AAAAAAAAAO8/QyMj1PCB-Qk/s320/IMG_20101126_235458.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-4095924172213147686?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/4095924172213147686/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/11/thinkpad-t410-8g.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4095924172213147686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4095924172213147686'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/11/thinkpad-t410-8g.html' title='thinkpad t410 換8G記憶體'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6SxqtkJQECI/TPCwVIJ4jNI/AAAAAAAAAOc/-uO1m0gKkyM/s72-c/IMG_20101126_231940.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-7734306963612713414</id><published>2010-11-18T23:06:00.000-08:00</published><updated>2010-11-18T23:06:37.401-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsp'/><category scheme='http://www.blogger.com/atom/ns#' term='springmvc'/><title type='text'>RequestDispatcher和springmvc的差別</title><content type='html'>&lt;br /&gt;今天就在想RequestDispatcher和springmvc的差別&lt;br /&gt;&lt;br /&gt;通常會用springmvc，是因為想要做到MVC的架構，&lt;br /&gt;&lt;br /&gt;如果單單透過servlet，是無法達到該效果。&lt;br /&gt;&lt;br /&gt;但是如果透過servlet的RequestDispatcher是可以的!&lt;br /&gt;&lt;br /&gt;我就突然想到，那這樣我通通用RequestDispatcher不就好了&lt;br /&gt;&lt;br /&gt;但再仔細想想兩者間的差別，大概的想法如下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果透過RequestDispatcher&lt;br /&gt;&lt;br /&gt;譬如說我要看會員列表(/action/member/list)&lt;br /&gt;&lt;br /&gt;就得在web.xml中部屬一個mapping&lt;br /&gt;&lt;br /&gt;mapping到某隻 servlet（讀取會員清單的操作）&lt;br /&gt;&lt;br /&gt;再透過RequestDispatcher把會員清單資料傳到應對應到的頁面&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果要新增一個會員(/action/member/insert)&lt;br /&gt;&lt;br /&gt;一樣得在web.xml中mapping到某個servlet&lt;br /&gt;&lt;br /&gt;這時候在web.xml會有2個serlvet mapping&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果是透過springmvc&lt;br /&gt;&lt;br /&gt;是先透過在web.xml中springmvc設定的DispatcherServlet&lt;br /&gt;&lt;br /&gt;然後再透過該DispatcherServlet定義的config檔案&lt;br /&gt;&lt;br /&gt;看要Dispatch到哪個Controller&lt;br /&gt;&lt;br /&gt;看到這，似乎兩者之間看起來差不多?&lt;br /&gt;&lt;br /&gt;但是如果我們同樣需要兩個功能&lt;br /&gt;&lt;br /&gt;一個是新增會員，一個是讀取會員列表&lt;br /&gt;&lt;br /&gt;我們不需要像上面一樣定義到兩個servlet&lt;br /&gt;&lt;br /&gt;我們只需要定義一個專門在處理會員的controller&lt;br /&gt;&lt;br /&gt;然後透過controller去控制&lt;br /&gt;&lt;br /&gt;該controller裡面就會有兩個method&lt;br /&gt;&lt;br /&gt;public ModelAndView &lt;span class="Apple-style-span" style="color: red;"&gt;list&lt;/span&gt;(HttpServletRequest req, HttpServletResponse resp)&lt;br /&gt;public ModelAndView &lt;span class="Apple-style-span" style="color: red;"&gt;insert&lt;/span&gt;(HttpServletRequest req, HttpServletResponse resp)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這是我想到的地方，&lt;br /&gt;&lt;br /&gt;如果有誤，歡迎更正。謝謝&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-7734306963612713414?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/7734306963612713414/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/11/requestdispatcherspringmvc.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7734306963612713414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7734306963612713414'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/11/requestdispatcherspringmvc.html' title='RequestDispatcher和springmvc的差別'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-5351268268537529462</id><published>2010-11-18T09:29:00.000-08:00</published><updated>2010-11-18T09:29:12.772-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>css固定footer</title><content type='html'>介紹一個&lt;a href="http://ryanfait.com/sticky-footer/"&gt;stick footer&lt;/a&gt;，&lt;br /&gt;&lt;br /&gt;什麼是stick footer，&lt;br /&gt;&lt;br /&gt;可以打開&lt;a href="http://www.techbang.com.tw/pages/t_mobile"&gt;T客邦的網站&lt;/a&gt;，&lt;br /&gt;&lt;br /&gt;然後看到最下面那條，那條就是footer，&lt;br /&gt;&lt;br /&gt;通常都會在那塊放至版權的宣告、合作方式...等等之類的。&lt;br /&gt;&lt;br /&gt;通常我們html的設計方式大概如下&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;html&amp;gt;&lt;br /&gt; &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;div id="header"&amp;gt;通常放置在網頁上的最上方區塊，通常是顯示LOGO或者登入、註冊連結之類的&amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;div id="wrapper"&amp;gt;就是放置內文了&amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;div id="footer"&amp;gt;就是版權宣告的區塊&amp;lt;/div&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;如果你沒有對footer作特殊的設計，那麼出來的版面可能會有點醜。&lt;br /&gt;&lt;br /&gt;如下圖，你會發現在版權宣告區的最下方會有一大塊白白的東西，還蠻醜的:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TOVhLqrmKJI/AAAAAAAAAMs/HnilRohKBsw/s1600/test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="384" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TOVhLqrmKJI/AAAAAAAAAMs/HnilRohKBsw/s640/test.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果你想要把下面那塊固定在最下方，如下圖，&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TOViL16LVWI/AAAAAAAAAMw/Qx8YbXE2nHs/s1600/tes1t.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="384" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TOViL16LVWI/AAAAAAAAAMw/Qx8YbXE2nHs/s640/tes1t.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;就可以透過sticky footer來實作，&lt;br /&gt;&lt;br /&gt;至於css的code就去看&lt;a href="http://ryanfait.com/sticky-footer/"&gt;http://ryanfait.com/sticky-footer/&lt;/a&gt;這個站看&lt;br /&gt;&lt;br /&gt;因為太簡單了，就不PO教學了啦。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-5351268268537529462?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/5351268268537529462/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/11/cssfooter.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5351268268537529462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5351268268537529462'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/11/cssfooter.html' title='css固定footer'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6SxqtkJQECI/TOVhLqrmKJI/AAAAAAAAAMs/HnilRohKBsw/s72-c/test.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-9103318705837556481</id><published>2010-11-08T00:14:00.000-08:00</published><updated>2010-11-08T00:16:43.978-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ApacheBench'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>ApacheBench 進行stress testing</title><content type='html'>&lt;br /&gt;Apache提供了一個&lt;b&gt;免費&lt;/b&gt;的工具(ApacheBench )來讓我們測試網站的承受壓力程度，&lt;br /&gt;&lt;br /&gt;不過ApacheBench 僅能提供對單一URL進行測試，但是真正的情況下，&lt;br /&gt;&lt;br /&gt;可能是同時很多個user連結不同的url，ApacheBench 並不能做到這樣的test&lt;br /&gt;&lt;br /&gt;但可以利用它來test會耗費較多效能的程式，來看看該網頁程式的承受程度。&lt;br /&gt;&lt;br /&gt;所以其實ApacheBench 是無法去模擬真實的狀況，沒辦法，It's free！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ＯＫ，來開始說明吧。&lt;br /&gt;&lt;br /&gt;只要您有安裝Apache，那麼也一定會有ApacheBench ，&lt;br /&gt;&lt;br /&gt;就在&lt;b&gt;／&lt;/b&gt;&lt;b&gt;apache安裝目錄／bin&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;／&lt;/b&gt;&lt;/span&gt;ab.exe&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://httpd.apache.org/docs/2.2/programs/ab.html"&gt;我們可以到官網來看使用說明&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;也可以直接下個command來看所有的使用參數說明&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #eeeeee;"&gt;&amp;nbsp;&amp;nbsp;ab.exe -h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;這裡就不作詳細的參數說明，大家可以到官網觀看。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這裡舉個例子&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #eeeeee;"&gt;&amp;nbsp;&amp;nbsp; ab -n 100 &amp;nbsp;http://www.google.com&lt;span class="Apple-style-span" style="color: red;"&gt;/&lt;/span&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;注意: &amp;nbsp;如果不是指定某page，一定要以&lt;span class="Apple-style-span" style="color: red;"&gt;/&lt;/span&gt;為結尾，如果是指定到page就不用了。&lt;br /&gt;&lt;br /&gt;參數-n意思是&amp;nbsp;對該網站發出幾次request&lt;br /&gt;&lt;br /&gt;下了該command以後&lt;br /&gt;&lt;br /&gt;會response一長串的資訊&lt;br /&gt;&lt;br /&gt;我們只要看到幾個重要性的指標就好&lt;br /&gt;&lt;br /&gt;首先先看到兩個指標Complete requests、Failed requests&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Complete requests &amp;nbsp;：完成的request次數&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Failed requests　　：失敗的次數&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;如果失敗的次數太高，代表著該網站同一時間能承受的request數量不能太高。&lt;br /&gt;&lt;br /&gt;然後再看到&lt;b&gt;Connection Times：進行stress testing時的處理時間&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Connection Times (ms)&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;min &amp;nbsp;mean[+/-sd] median &amp;nbsp; max&lt;/blockquote&gt;&lt;blockquote&gt;Connect: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;17 &amp;nbsp; &amp;nbsp; &amp;nbsp;33 &amp;nbsp;62.9 &amp;nbsp; &amp;nbsp; &amp;nbsp;22 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;421&lt;/blockquote&gt;&lt;blockquote&gt;Processing: &amp;nbsp; 20 &amp;nbsp; &amp;nbsp; &amp;nbsp;40 &amp;nbsp;86.1 &amp;nbsp; &amp;nbsp; &amp;nbsp;25 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;688&lt;/blockquote&gt;&lt;blockquote&gt;Waiting: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 19 &amp;nbsp; &amp;nbsp; &amp;nbsp;35 &amp;nbsp;71.8 &amp;nbsp; &amp;nbsp; &amp;nbsp;25 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;688&lt;/blockquote&gt;&lt;blockquote&gt;Total: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 39 &amp;nbsp; &amp;nbsp; &amp;nbsp;73 104.9 &amp;nbsp; &amp;nbsp; 47 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;709&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;connect：是我們發出request，一直到server收到request的時間&lt;br /&gt;&lt;br /&gt;processing：是request後，一直到server response這期間的時間&lt;br /&gt;&lt;br /&gt;waiting：發出request以後，一直到收到response第一個byte的時間&lt;br /&gt;&lt;br /&gt;total：就是connect+processing&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;我們大概可以從&lt;b&gt;Complete requests&lt;/b&gt;、&lt;b&gt;Failed requests&lt;/b&gt;、&lt;b&gt;Connection Times&lt;/b&gt; 這幾個指標來衡量一隻程式能承受的壓力程度。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-9103318705837556481?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/9103318705837556481/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/11/apachebench-stress-testing.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/9103318705837556481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/9103318705837556481'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/11/apachebench-stress-testing.html' title='ApacheBench 進行stress testing'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1083744692176536254</id><published>2010-11-06T01:39:00.000-07:00</published><updated>2010-11-06T01:47:14.555-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='index'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Apache 限制目錄瀏覽</title><content type='html'>前天去看了社群網站&lt;br /&gt;&lt;br /&gt;片頭有講到哈佛裡面的有些宿舍網站的apache 沒有拿掉index，&lt;br /&gt;&lt;br /&gt;因此有目錄瀏覽的功能，這樣該目錄底下所有的檔案都會被使用者看見，&lt;br /&gt;&lt;br /&gt;那該怎麼關掉呢?&lt;br /&gt;&lt;br /&gt;打開httpd.conf&lt;br /&gt;&lt;br /&gt;找到這行&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Options Indexes FollowSymLinks&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;然後把&lt;b&gt;Indexes &lt;/b&gt;拿掉&lt;br /&gt;&lt;br /&gt;然後重開apache，該目錄底下的檔案就不會被顯示出來!&lt;br /&gt;&lt;br /&gt;且會response 403 Forbidden。&lt;br /&gt;&lt;br /&gt;如果你要有些特定目錄是允許使用者看見的，&lt;br /&gt;&lt;br /&gt;那麼就在該目錄底下，把index放上去即可。&lt;br /&gt;&lt;br /&gt;假設&lt;br /&gt;&lt;br /&gt;test1底下的/images是允許被看見的&lt;br /&gt;&lt;br /&gt;test2底下是不允許的&lt;br /&gt;&lt;br /&gt;那麼設置就如下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;Directory "D:/test1/images"&amp;gt; &lt;br /&gt;     .....&lt;br /&gt;     # 可以被看見的&lt;br /&gt;     Options Indexes FollowSymLinks&lt;br /&gt;     .....&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&amp;lt;Directory "D:/test2/images"&amp;gt; &lt;br /&gt;     .....&lt;br /&gt;     # 不可以被看見的&lt;br /&gt;     Options FollowSymLinks&lt;br /&gt;     .....&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1083744692176536254?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1083744692176536254/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/11/apache.html#comment-form' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1083744692176536254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1083744692176536254'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/11/apache.html' title='Apache 限制目錄瀏覽'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-5108116083765706778</id><published>2010-11-05T22:22:00.000-07:00</published><updated>2010-11-06T01:47:52.086-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsp'/><title type='text'>JSP 兩種include 的差別</title><content type='html'>在JSP中，&lt;br /&gt;&lt;br /&gt;include有分兩種&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;%@include file="/footer.jsp" %&amp;gt;&amp;lt;!-- 第一種 --&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;jsp:include page="/footer.jsp"&amp;gt;&amp;lt;/jsp:include&amp;gt;&amp;lt;!-- 第二種 --&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;第一種稱為&lt;span class="Apple-style-span" style="color: red;"&gt;指令元素&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;第二種稱為&lt;span class="Apple-style-span" style="color: red;"&gt;動作元素&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;差別在於&lt;br /&gt;&lt;br /&gt;第一種的include會在編譯時期（轉換成servlet）就將file include進來，&lt;br /&gt;&lt;br /&gt;而第二種在編譯時期並不會被編譯，是在client request時，才會動態的去載入在去編譯。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;且第一種最後只會有一個.class檔案，&lt;br /&gt;&lt;br /&gt;因為他會在被轉換成servlet之前就把include的file融合至原本的內容中&lt;br /&gt;&lt;br /&gt;最後才轉換成servlet，故只有一個.class檔案&lt;br /&gt;&lt;br /&gt;而第二種就會有兩種。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;總結&lt;br /&gt;&lt;br /&gt;第一種是在編譯時期就去include&lt;br /&gt;&lt;br /&gt;第二種是在run time時期去include（這個效能似乎較差一點點，但較靈活）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-5108116083765706778?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/5108116083765706778/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/11/jsp-include.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5108116083765706778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5108116083765706778'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/11/jsp-include.html' title='JSP 兩種include 的差別'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-86723801503433239</id><published>2010-11-04T08:33:00.000-07:00</published><updated>2010-11-06T01:48:09.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='開箱'/><category scheme='http://www.blogger.com/atom/ns#' term='imac'/><title type='text'>非常不專業之iMAC開箱文</title><content type='html'>&lt;br /&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;恩，因緣際會下，&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;有人送我一台iMac，&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;當然不是平白無故的，&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;天底下沒有白吃的午餐!!&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;條件是要我part-time，寫iPhone app..&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;其實對我來說，沒有甚麼損失，多碰點東西!&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;之前一直局限於設備，雖然說可以用vmware來灌os x，&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;但一直沒動力，不過竟然有人要提供給我mac了，&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;我就順便接下來阿~~~~~&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;從一開始的mac book pro→mac mini→iMac&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;最後是拿到iMac&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;不過並不是全新的啦!&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;不過至少規格也不差!!!&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;至少比我目前的桌機好!&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;今天用了一下的心得就是&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;apple的滑鼠(magic mouse)真的很好用!!!!!&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;鍵盤也好打!!!!!!!&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;大螢幕也真的很爽(可惜不是27吋)&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;btw, 我今天一直找不到開機扭在哪裡(我好俗喔!!!)&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;底下是圖片~~~&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TNLRoL7esYI/AAAAAAAAALQ/IK0oRlmRiSE/s1600/IMG_20101104_230122.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TNLRoL7esYI/AAAAAAAAALQ/IK0oRlmRiSE/s320/IMG_20101104_230122.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TNLRsqF-8BI/AAAAAAAAALU/901xwvIZNG4/s1600/IMG_20101104_230133.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TNLRsqF-8BI/AAAAAAAAALU/901xwvIZNG4/s320/IMG_20101104_230133.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;magic mouse，好用!&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TNLRzfBw5BI/AAAAAAAAALY/TS2AQs3G64k/s1600/IMG_20101104_230137.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TNLRzfBw5BI/AAAAAAAAALY/TS2AQs3G64k/s320/IMG_20101104_230137.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TNLR3MwcNYI/AAAAAAAAALc/PsdXt2pGMaI/s1600/IMG_20101104_230441.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TNLR3MwcNYI/AAAAAAAAALc/PsdXt2pGMaI/s320/IMG_20101104_230441.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;漂亮的螢幕&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TNLR76eORgI/AAAAAAAAALg/ZuJja0PamU0/s1600/IMG_20101104_230512.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TNLR76eORgI/AAAAAAAAALg/ZuJja0PamU0/s320/IMG_20101104_230512.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-86723801503433239?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/86723801503433239/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/11/imac.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/86723801503433239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/86723801503433239'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/11/imac.html' title='非常不專業之iMAC開箱文'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6SxqtkJQECI/TNLRoL7esYI/AAAAAAAAALQ/IK0oRlmRiSE/s72-c/IMG_20101104_230122.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1539527907003955567</id><published>2010-11-01T00:30:00.000-07:00</published><updated>2010-11-06T01:48:25.797-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='screen on/off'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android detect screen on and screen off</title><content type='html'>android detect screen on and screen off&lt;br /&gt;&lt;br /&gt;android偵測螢幕的關閉與開啟，&lt;br /&gt;&lt;br /&gt;和偵測sd card一樣，&lt;br /&gt;&lt;br /&gt;Intent.ACTION_SCREEN_OFF和Intent.ACTION_SCREEN_ON是不能在AndroidManifest.xml裡面宣告的&lt;br /&gt;&lt;br /&gt;如:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;receiver android:name="receiverScreen"&amp;gt; &lt;br /&gt;    &amp;lt;intent-filter&amp;gt;  &lt;br /&gt;        &amp;lt;action android:name="android.intent.action.SCREEN_ON" /&amp;gt;&lt;br /&gt;        &amp;lt;action android:name="android.intent.action.SCREEN_OFF" /&amp;gt;&lt;br /&gt;    &amp;lt;/intent-filter&amp;gt;  &lt;br /&gt;&amp;lt;/receiver&amp;gt;  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;這樣子的宣告&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;沒有用&lt;/b&gt;&lt;/span&gt;，你永遠都receive不到任何action&lt;br /&gt;&lt;br /&gt;詳細原因我也不知道，但是可以透過registerReceiver去實作，&lt;br /&gt;&lt;br /&gt;這裡舉個例子，先啟動一個service，由這個service去registerReceiver&lt;br /&gt;&lt;br /&gt;由service啟動的好處是，service可以常駐，&lt;br /&gt;&lt;br /&gt;如果你用acitivity去registerReceiver&lt;br /&gt;&lt;br /&gt;這個acitivity關閉以後，你一樣receive不到任何action&lt;br /&gt;&lt;br /&gt;且如果你只是想偵測acitivity的關閉與否的話，可以直接利用onResume和onPause去偵測即可&lt;br /&gt;&lt;br /&gt;不用特地去registerReceiver&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;但是如果今天你有一個widget在桌面，&lt;br /&gt;&lt;br /&gt;且我們是無法透過widget去registerReceiver，&lt;br /&gt;&lt;br /&gt;會出現exception（ReceiverCallNotAllowedException）&lt;br /&gt;&lt;br /&gt;所以一定得透過service去啟動。&lt;br /&gt;&lt;br /&gt;service的code如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class serviceScreen extends Service {&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public IBinder onBind(Intent intent) {&lt;br /&gt;  // TODO Auto-generated method stub&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; public void onStart(Intent intent, int startId) {&lt;br /&gt;     super.onStart(intent, startId);&lt;br /&gt;     try {&lt;br /&gt;          IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);&lt;br /&gt;    &lt;br /&gt;          filter.addAction(Intent.ACTION_SCREEN_OFF);&lt;br /&gt;    &lt;br /&gt;          BroadcastReceiver mReceiver = new receiverScreen();&lt;br /&gt;   &lt;br /&gt;          registerReceiver(mReceiver, filter);&lt;br /&gt;     } catch (Exception e) {&lt;br /&gt;          Log.d("main",e.toString());&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;receiver的code如下：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class receiverScreen extends BroadcastReceiver {&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onReceive(Context context, Intent intent) {&lt;br /&gt;  &lt;br /&gt;     if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)){&lt;br /&gt;          //收到螢幕開啟的通知&lt;br /&gt;     }else{&lt;br /&gt;          //收到螢幕關閉的通知&lt;br /&gt;     }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著就是在widget中去startService&lt;br /&gt;&lt;br /&gt;如下：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class widgetSmall extends AppWidgetProvider {&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; @SuppressWarnings("static-access")&lt;br /&gt; @Override&lt;br /&gt; public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {&lt;br /&gt;     super.onUpdate(context, appWidgetManager, appWidgetIds);&lt;br /&gt;            &lt;br /&gt;    //啟動一個service&lt;br /&gt;     context.startService(new Intent(context, serviceScreen.class));&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; @SuppressWarnings("static-access")&lt;br /&gt; @Override&lt;br /&gt; public void onDeleted(Context context, int[] appWidgetIds) {&lt;br /&gt;     super.onDeleted(context, appWidgetIds);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    //當這個widget被刪除時，就stopService&lt;br /&gt;      context.stopService(new Intent(context, serviceScreen.class) );&lt;br /&gt;   &lt;br /&gt;      android.os.Process.killProcess(android.os.Process.myPid());&lt;br /&gt;  &lt;br /&gt; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1539527907003955567?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1539527907003955567/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/11/android-detect-screen-on-and-screen-off.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1539527907003955567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1539527907003955567'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/11/android-detect-screen-on-and-screen-off.html' title='android detect screen on and screen off'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-4050959324956037819</id><published>2010-10-27T20:43:00.000-07:00</published><updated>2010-11-06T01:48:32.517-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ftp'/><title type='text'>主動式與被動式FTP 差別</title><content type='html'>FTP是一個特殊的protocol之一，&lt;br /&gt;&lt;br /&gt;其他的protocol，如:http、pop3、....等等之類的，&lt;br /&gt;&lt;br /&gt;都只需要1個connection、1個port。&lt;br /&gt;&lt;br /&gt;但是FTP則不是，FTP需要2個connection、2個port。&lt;br /&gt;&lt;br /&gt;一個是Command connection / port，用來傳遞client與FTP Server之間的command。(通常設在port 21)&lt;br /&gt;&lt;br /&gt;另一個是Data&amp;nbsp;connection /&amp;nbsp;port，是用來傳遞資料的。(通常設在port 20)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;一般的人都會認為關掉20、21port，FTP Server就會無法運作，&lt;br /&gt;&lt;br /&gt;從某種角度來說，這樣的觀念是正確的，但是其實是錯誤的觀念！！&lt;br /&gt;&lt;br /&gt;但這是在傳統式模式FTP的條件下，這樣的觀念才是正確的。&lt;br /&gt;&lt;br /&gt;FTP主要分成兩種模式：&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;1.主動式（POST）&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;2.被動式&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;（PASV）&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;傳統的FTP是採用主動式的模式進行連線，&lt;br /&gt;&lt;br /&gt;底下為主動式FTP運作圖&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TMjo0nS6Y0I/AAAAAAAAALI/hEnR6232wkg/s1600/%E4%B8%BB%E5%8B%95%E5%BC%8F.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TMjo0nS6Y0I/AAAAAAAAALI/hEnR6232wkg/s400/%E4%B8%BB%E5%8B%95%E5%BC%8F.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;1. client端會開啟一個大於&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;1024&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;的&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;port&amp;nbsp;&lt;/span&gt;( port x )&lt;span class="Apple-style-span" style="color: red;"&gt;對FTP Server的port 21進行connection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;2. FTP Server會回應client端的connection，告知Client端收到連線了&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;3. FTP Server的port 20會主動和 Client端的port 1025&lt;/span&gt;(port x+1)&lt;span class="Apple-style-span" style="color: blue;"&gt;進行連線(進行資料傳輸)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;4. Client會回應Server端的連線。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;看完步驟說明，大家會發現一個問題，&lt;br /&gt;&lt;br /&gt;一開始client端會開啟兩個port，&lt;br /&gt;&lt;br /&gt;port x (connection port)和port x+1 (data port)&lt;br /&gt;&lt;br /&gt;在connection port沒有甚麼問題存在，&lt;br /&gt;&lt;br /&gt;問題出在data port，&lt;br /&gt;&lt;br /&gt;因為client端並不是自己建立一個connection，而是自行開啟一個port等待FTP Server連線進來&lt;br /&gt;&lt;br /&gt;這很有可能被Client端的防火牆過濾掉&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;因此為了解決FTP連線到Client端被過濾掉的問題，所以發展出另一種連線模式&lt;br /&gt;&lt;br /&gt;就是被動式模式&lt;br /&gt;&lt;br /&gt;被動式模式不管是command &amp;nbsp;connection或是data connection都是由client端建立的&lt;br /&gt;&lt;br /&gt;底下為運作圖&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TMjugUmILnI/AAAAAAAAALM/tu85ED5r1KA/s1600/%E8%A2%AB%E5%8B%95%E5%BC%8F.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TMjugUmILnI/AAAAAAAAALM/tu85ED5r1KA/s400/%E8%A2%AB%E5%8B%95%E5%BC%8F.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;1. 首先，client端會開啟一個大於&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;1024&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;的&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;port&amp;nbsp;&lt;/span&gt;( port x )&lt;span class="Apple-style-span" style="color: red;"&gt;對FTP Server的port 21進行connection&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;2. FTP Server會回應client端的connection，並告知Client端，Server開啟了port 1200等待資料連線&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;3. Client端的port 1026會和&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;FTP Server的port 1200&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;進行資料連線&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;4.&amp;nbsp;Server會回應Client端的連線。&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;使用了被動模式，解決了client端的問題，&lt;br /&gt;&lt;br /&gt;可是相反的，也把這些問題帶給了server。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;至於要用哪種模式，是由client端決定的，&lt;br /&gt;&lt;br /&gt;client端會在command connection時發出POST或PASV的命令&lt;br /&gt;&lt;br /&gt;但是server可以決定是否支援這些模式。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-4050959324956037819?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/4050959324956037819/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/ftp.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4050959324956037819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4050959324956037819'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/ftp.html' title='主動式與被動式FTP 差別'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6SxqtkJQECI/TMjo0nS6Y0I/AAAAAAAAALI/hEnR6232wkg/s72-c/%E4%B8%BB%E5%8B%95%E5%BC%8F.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-7425772322297837578</id><published>2010-10-27T09:18:00.000-07:00</published><updated>2010-11-06T01:49:07.543-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multiple language'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android multiple language</title><content type='html'>android 多國語系開發!&lt;br /&gt;&lt;br /&gt;android multiple language&lt;br /&gt;&lt;br /&gt;只要將/res/values資料夾名稱改成您要支援的語系名稱&lt;br /&gt;&lt;br /&gt;這裡假設，我們要有英文和中文的內容&lt;br /&gt;&lt;br /&gt;那麼就在/res/values名稱改成/res/values-en，&lt;br /&gt;&lt;br /&gt;然後再複製/res/values/，然後一樣改成values-zh-rTW&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;且將其底下的string.xml的內容改成該語系的內容。&lt;br /&gt;&lt;br /&gt;android將會自動幫您判斷要呈現甚麼語言。&lt;br /&gt;&lt;br /&gt;至於有支援什麼語系，可以去底下這網站上觀看&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-weight: bold;"&gt;ISO 639-1 Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.loc.gov/standards/iso639-2/php/code_list.php"&gt;http://www.loc.gov/standards/iso639-2/php/code_list.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-7425772322297837578?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/7425772322297837578/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/android-multiple-language.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7425772322297837578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7425772322297837578'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/android-multiple-language.html' title='android multiple language'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-5108951316818135805</id><published>2010-10-26T02:05:00.000-07:00</published><updated>2011-11-08T23:45:03.992-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drawable'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Drawable (hdpi,ldpi,mdpi) 的分別</title><content type='html'>&lt;br /&gt;Drawable (hdpi,ldpi,mdpi)的分別。&lt;br /&gt;&lt;br /&gt;自從android 2.0.1版以後，只要新增project，&lt;br /&gt;&lt;br /&gt;你會發現res/drawable資料夾變成!&lt;br /&gt;&lt;br /&gt;/res/drawable-hdpi &amp;nbsp; 【WVGA (480x800),FWVGA (480x854)】&lt;br /&gt;/res/drawable-mdpi &amp;nbsp;【HVGA (320x480)】&lt;br /&gt;/res/drawable-ldpi &amp;nbsp; &amp;nbsp;【QVGA (240x320)】&lt;br /&gt;&lt;br /&gt;大概知道是用來做mutilple screen的，但是沒有太care，&lt;br /&gt;&lt;br /&gt;我通常都會把這三個通通刪掉，然後改成員先的/res/drawable（壞習慣，別學）&lt;br /&gt;&lt;br /&gt;結果剛剛發現如果同張圖分別放在三個不同的資料夾&lt;br /&gt;&lt;br /&gt;你會發現讀進來的圖檔大小都會不一樣喔！！！&lt;br /&gt;&lt;br /&gt;太讓我surpriesed!!&lt;br /&gt;&lt;br /&gt;我以為還要定義一個&lt;span class="Apple-style-span" style="color: #000088; font-family: monospace; font-size: 13px; white-space: pre;"&gt;supports-screens&lt;/span&gt;的xml檔案&lt;br /&gt;&lt;br /&gt;這些資料夾名稱的設置才會有用！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;btw如果你跟我做法一樣，是三個刪掉，變成一個，&lt;br /&gt;&lt;br /&gt;那麼預設值讀進來的圖大小會是以/res/drawable-mdpi為主&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-5108951316818135805?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/5108951316818135805/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/drawable-hdpildpimdpi.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5108951316818135805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5108951316818135805'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/drawable-hdpildpimdpi.html' title='Drawable (hdpi,ldpi,mdpi) 的分別'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-3744382253580838332</id><published>2010-10-14T10:00:00.000-07:00</published><updated>2010-11-06T01:49:37.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsp'/><category scheme='http://www.blogger.com/atom/ns#' term='springmvc'/><category scheme='http://www.blogger.com/atom/ns#' term='servlet'/><title type='text'>Spring MVC sample</title><content type='html'>&lt;br /&gt;要使用Spring MVC架構，請先去下載Spring的jar檔，&lt;br /&gt;&lt;br /&gt;一個是spring-webmvc.jar&lt;br /&gt;&lt;br /&gt;一個是spring.jar&lt;br /&gt;&lt;br /&gt;一個是commons-logging.jar&lt;br /&gt;&lt;br /&gt;接著打開web.xml設定servlet-mapping&lt;br /&gt;&lt;br /&gt;跟他說當user &amp;nbsp;request到哪個url時，要呼叫到Spring &amp;nbsp;的dispatch，&lt;br /&gt;&lt;br /&gt;透過該dispatch，在引導該url至該controller&lt;br /&gt;&lt;br /&gt;如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;    &amp;lt;servlet-name&amp;gt;springmvc&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;    &amp;lt;url-pattern&amp;gt;/html/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;上面的範例是指當user request到/html/底下任何的page&lt;br /&gt;&lt;br /&gt;都會導引到servlet-name為springmvc的servlet去&lt;br /&gt;&lt;br /&gt;但是我們現在沒有servlet-name為springmvc的servlet&lt;br /&gt;&lt;br /&gt;所以也要在設定&lt;br /&gt;&lt;br /&gt;如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;    &amp;lt;servlet-name&amp;gt;springmvc&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;    &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;    &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;    &amp;lt;init-param&amp;gt;&lt;br /&gt;        &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;        &amp;lt;param-value&amp;gt;/WEB-INF/spring-mvc-config.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;    &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;上面的範例意思是當您的servlet-mapping裡servlet-name為springmvc時&lt;br /&gt;&lt;br /&gt;會mapping到此org.springframework.web.servlet.DispatcherServlet class&lt;br /&gt;&lt;br /&gt;且你要指定該dispatch的config location&lt;br /&gt;&lt;br /&gt;這裡預設為/WEB-INF/spring-mvc-config.xml&lt;br /&gt;&lt;br /&gt;在這個檔案裡面會主要會放置了url-mapping&lt;br /&gt;&lt;br /&gt;用來告訴dipatch該怎麼分配至應該分配的controller&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;對了！！有個很重要的東西要注意到，&lt;br /&gt;&lt;br /&gt;在web.xml中的root element裡面的attribute一定要設為2.4，一開始建立project是預設2.5，&lt;br /&gt;&lt;br /&gt;在controller return view的時候，view會無法使用${}tag&lt;br /&gt;&lt;br /&gt;如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;web-app &lt;br /&gt;version="2.4"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee&lt;br /&gt;http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd" &amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著就會說到該spring-mvc-config.xml的檔案架構&lt;br /&gt;&lt;br /&gt;如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br /&gt; http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!-- &lt;br /&gt;        (1)&lt;br /&gt;        會先看這個urlMapping&lt;br /&gt;        這裡的設置意思是當您的page是在/html/action/*&lt;br /&gt;        意思是/html底下的/action/底下的任何page，&lt;br /&gt;        則就呼叫bean id為customerController的class  &lt;br /&gt;    --&amp;gt;&lt;br /&gt;    &amp;lt;bean id="urlMapping"&lt;br /&gt;         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&amp;gt;&lt;br /&gt;        &amp;lt;property name="mappings"&amp;gt;&lt;br /&gt;            &amp;lt;value&amp;gt;         &lt;br /&gt;                /action/*=customController&lt;br /&gt;            &amp;lt;/value&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!-- &lt;br /&gt;     (2)&lt;br /&gt;     因為上面的設定是當/html/action/底下任何page會指定到此bean&lt;br /&gt;     也就是說他會呼叫到net.ken.test.mvc此package底下的.multiActionController&lt;br /&gt;     等等會說明multiActionController此檔案&lt;br /&gt;     --&amp;gt;        &lt;br /&gt;    &amp;lt;bean id="customController" class="net.ken.test.mvc.multiActionController"&amp;gt;&amp;lt;/bean&amp;gt;    &lt;br /&gt;     &lt;br /&gt;     &lt;br /&gt;    &amp;lt;!-- &lt;br /&gt;      (3)&lt;br /&gt;      這裡是指你要對應到的view的路徑名稱&lt;br /&gt;     --&amp;gt; &lt;br /&gt;    &amp;lt;bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&amp;gt;&lt;br /&gt;    &amp;lt;property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/&amp;gt;&lt;br /&gt;       &amp;lt;property name="prefix" value="/jsp/"/&amp;gt;&lt;br /&gt;       &amp;lt;property name="suffix" value=".jsp"/&amp;gt;&lt;br /&gt;   &amp;lt;/bean&amp;gt; &lt;br /&gt;     &lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著就來撰寫multiActionController此controller的code&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;package springmvc.web;&lt;br /&gt;&lt;br /&gt;import org.springframework.web.servlet.mvc.multiaction.MultiActionController;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpServletResponse;&lt;br /&gt;import org.springframework.web.servlet.ModelAndView;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;//首先要繼承MultiActionController&lt;br /&gt;public class CustomerController extends MultiActionController{&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; //這邊的method命名規則是根據您的page名稱來命名，如果您的page是在/html/action/Add.do&lt;br /&gt; //則會呼叫到下面這個method。&lt;br /&gt; public ModelAndView Add(HttpServletRequest request,&lt;br /&gt;  HttpServletResponse response) throws Exception {&lt;br /&gt;  &lt;br /&gt; /*&lt;br /&gt;  * 會return一個型態為ModelAndView的物件回去，&lt;br /&gt;  * 第一個參數為view的名稱，就是要接收此物件的jsp檔案名稱，在此例子就是說會傳到hello_world.jsp此page去&lt;br /&gt;  * 第二個是view要接收的參數名稱&lt;br /&gt;  * 第三個是參數的值&lt;br /&gt;  */&lt;br /&gt;  return new ModelAndView("hello_world", "message","testAddCustomer() method");&lt;br /&gt; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public ModelAndView Delete(HttpServletRequest request,&lt;br /&gt;  HttpServletResponse response) throws Exception {&lt;br /&gt; &lt;br /&gt;  return new ModelAndView("hello_world", "message","testDeleteCustomer() method");&lt;br /&gt; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public ModelAndView Update(HttpServletRequest request,&lt;br /&gt;  HttpServletResponse response) throws Exception {&lt;br /&gt; &lt;br /&gt;  return new ModelAndView("hello_world", "message","testUpdateCustomer() method");&lt;br /&gt; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;接著來寫個接收modelAndView的code吧!（就是hello_world.jsp）&lt;br /&gt;&lt;br /&gt;${message}的意思就是接收上面ModelAndView此物件的第二個參數的參數名稱&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt; &amp;lt;p&amp;gt;This is my message: ${message} &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最後就寫個簡單的html來測試是否work，&lt;br /&gt;&lt;br /&gt;你會發現點選第一個link，&lt;br /&gt;&lt;br /&gt;您的page就會show出&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;This is my message: testAddCustomer() method&lt;/span&gt;&lt;/b&gt;此訊息&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Hello App Engine&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;h1&amp;gt;Hello App Engine!&amp;lt;/h1&amp;gt;&lt;br /&gt; &lt;br /&gt;    &amp;lt;table&amp;gt;&lt;br /&gt;      &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;a href="/html/action/Add.htm"&amp;gt;Go to Add() &amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;/tr&amp;gt;&lt;br /&gt;      &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;a href="/html/action/Delete.htm"&amp;gt;Go to Delete() &amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;/tr&amp;gt;&lt;br /&gt;      &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;&amp;lt;a href="/html/action/Update.htm"&amp;gt;Go to Update() &amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;      &amp;lt;/tr&amp;gt;&lt;br /&gt; &lt;br /&gt;    &amp;lt;/table&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這篇教學寫得好亂，真不好意思。&lt;br /&gt;&lt;br /&gt;有不清楚的再問我吧！&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-3744382253580838332?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/3744382253580838332/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/spring-mvcspringjar-spring-webmvc.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3744382253580838332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3744382253580838332'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/spring-mvcspringjar-spring-webmvc.html' title='Spring MVC sample'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6013223619184236453</id><published>2010-10-11T09:36:00.000-07:00</published><updated>2010-10-11T09:36:04.238-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Eclipse show line number</title><content type='html'>Eclipse show line number&lt;br /&gt;&lt;br /&gt;想知道你寫了多少行的code嗎?&lt;br /&gt;&lt;br /&gt;或者想知道這行code是在第幾行?&lt;br /&gt;&lt;br /&gt;先點選Window-&amp;gt;Preferences&lt;br /&gt;&lt;br /&gt;打開視窗以後，點選General-&amp;gt;Editors-&amp;gt;Text Editor&lt;br /&gt;&lt;br /&gt;把Show line numbers勾選起來。&lt;br /&gt;&lt;br /&gt;這樣就會顯示出line number了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6013223619184236453?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6013223619184236453/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/eclipse-show-line-number.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6013223619184236453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6013223619184236453'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/eclipse-show-line-number.html' title='Eclipse show line number'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-2635517852778239264</id><published>2010-10-10T08:37:00.000-07:00</published><updated>2010-11-06T01:50:23.659-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsp'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Eclipse Classic with Java Server Page (JSP)</title><content type='html'>因為有再寫GAE和android&lt;br /&gt;&lt;br /&gt;大家也都知道Eclipse分很多種版本&lt;br /&gt;&lt;br /&gt;1. Eclipse classic&lt;br /&gt;&lt;br /&gt;2. Eclipse IDEfor Java EE Developer&lt;br /&gt;&lt;br /&gt;3. Eclipse IDEfor Java Developer&lt;br /&gt;&lt;br /&gt;等等之類的!&lt;br /&gt;&lt;br /&gt;如果你想寫JSP、又想寫一般的java application。&lt;br /&gt;&lt;br /&gt;有些人會去下載兩種 eclipse（2、3）&lt;br /&gt;&lt;br /&gt;然後想寫ＪＳＰ，就開第二個，想寫java就開第三個。&lt;br /&gt;&lt;br /&gt;會不會太麻煩勒？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;我也遇到個問題，想在同個IDE環境中寫GAE和Android。&lt;br /&gt;&lt;br /&gt;該怎麼做呢？&lt;br /&gt;&lt;br /&gt;先去下載&lt;a href="http://www.eclipse.org/downloads/packages/eclipse-classic-361/heliossr1"&gt;Eclipse classic&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;解壓縮出來後，&lt;br /&gt;&lt;br /&gt;就去install new software（android、GAE)&lt;br /&gt;&lt;br /&gt;安裝這兩個的步驟就不說明了！&lt;br /&gt;&lt;br /&gt;直接跳過！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;完成後，當你建立一個.jsp檔案時，&lt;br /&gt;&lt;br /&gt;有沒有發現完全沒有highlight，也沒有content assist！！&lt;br /&gt;&lt;br /&gt;那是因為沒有裝pluging！&lt;br /&gt;&lt;br /&gt;那就把它裝起來吧！&lt;br /&gt;&lt;br /&gt;首先！&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TLHcInoMV8I/AAAAAAAAAK0/U363joRV6-g/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="280" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TLHcInoMV8I/AAAAAAAAAK0/U363joRV6-g/s640/1.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;首先先點選Install New Software&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TLHcJvu4i4I/AAAAAAAAAK4/5C29Yco1kl0/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="452" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TLHcJvu4i4I/AAAAAAAAAK4/5C29Yco1kl0/s640/2.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;接著選取圖中選取的項目，注意！版本不同，項目中的版本名稱會有所不同，此版本為HELIOS&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TLHcKdDJ3WI/AAAAAAAAAK8/ZZ-wREFau18/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TLHcKdDJ3WI/AAAAAAAAAK8/ZZ-wREFau18/s1600/3.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;接著拉到最下面，點選Web, XML , Java EE Developement&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;點開以後，點選Web Page Editor就好！&lt;br /&gt;&lt;br /&gt;不要安裝其他的（要裝也是可以拉，你有需求的話）&lt;br /&gt;&lt;br /&gt;安裝完成以後，就會發現*.jsp檔案中的highlight和content assist都出現了！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-2635517852778239264?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/2635517852778239264/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/eclipse-classic-with-java-server-page.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2635517852778239264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/2635517852778239264'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/eclipse-classic-with-java-server-page.html' title='Eclipse Classic with Java Server Page (JSP)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6SxqtkJQECI/TLHcInoMV8I/AAAAAAAAAK0/U363joRV6-g/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8620182588709197592</id><published>2010-10-10T00:55:00.000-07:00</published><updated>2010-11-06T01:50:34.975-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='開箱'/><category scheme='http://www.blogger.com/atom/ns#' term='thinkpad t410'/><title type='text'>thinkpad t410 非常不專業 開箱文【不是教學文】</title><content type='html'>期待已久的thinkpad，&lt;br /&gt;&lt;br /&gt;終於在昨天入手了，&lt;br /&gt;&lt;br /&gt;規格：&lt;br /&gt;&lt;br /&gt;cpu：i7 620M　（可惜不是7開頭的）&lt;br /&gt;Memory：ddr3 2G　（過陣子有錢，在直上兩條4G的）&lt;br /&gt;hdd：320G 7200rpm　（被我換成hitachi的7k500，7200rpm，500G）&lt;br /&gt;顯示卡：NVIDIA NVS 3100M&lt;br /&gt;螢幕：14.1吋 (16:10)&lt;br /&gt;電池：6cell&lt;br /&gt;&lt;br /&gt;接下來來ＰＯ圖了！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6SxqtkJQECI/TLFuRI8QSCI/AAAAAAAAAJ8/834xakdOayM/s1600/IMG_20101009_155655.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_6SxqtkJQECI/TLFuRI8QSCI/AAAAAAAAAJ8/834xakdOayM/s320/IMG_20101009_155655.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;thinkpad的箱子！就是這麼簡單！&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFuYLRTCDI/AAAAAAAAAKA/rz1CJUgGHys/s1600/IMG_20101009_155746.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFuYLRTCDI/AAAAAAAAAKA/rz1CJUgGHys/s320/IMG_20101009_155746.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;打開後，箱子內部的配置&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TLFueJqu5LI/AAAAAAAAAKE/vLZgo6VB2-M/s1600/IMG_20101009_155842.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TLFueJqu5LI/AAAAAAAAAKE/vLZgo6VB2-M/s320/IMG_20101009_155842.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;筆電拿出來的樣子，旁邊那兩條有點醜&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_6SxqtkJQECI/TLFuirlgUzI/AAAAAAAAAKI/EVsfcjXffTg/s1600/IMG_20101009_155847.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_6SxqtkJQECI/TLFuirlgUzI/AAAAAAAAAKI/EVsfcjXffTg/s320/IMG_20101009_155847.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;變壓器&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6SxqtkJQECI/TLFunD_oQ4I/AAAAAAAAAKM/jn2_G3o49EA/s1600/IMG_20101009_155944.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_6SxqtkJQECI/TLFunD_oQ4I/AAAAAAAAAKM/jn2_G3o49EA/s320/IMG_20101009_155944.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;變壓器＋電池&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TLFuqyxWJNI/AAAAAAAAAKQ/baRiv6FcCwk/s1600/IMG_20101009_160011.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TLFuqyxWJNI/AAAAAAAAAKQ/baRiv6FcCwk/s320/IMG_20101009_160011.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;thinkpad本身！！&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFuzX1GQOI/AAAAAAAAAKY/IVgbVgyPTRg/s1600/IMG_20101009_160047.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFuzX1GQOI/AAAAAAAAAKY/IVgbVgyPTRg/s320/IMG_20101009_160047.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFu3y_B_kI/AAAAAAAAAKc/QwBQWfsEQVQ/s1600/IMG_20101009_160059.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFu3y_B_kI/AAAAAAAAAKc/QwBQWfsEQVQ/s320/IMG_20101009_160059.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFu-oGb2TI/AAAAAAAAAKg/5-LXfnK3gw4/s1600/IMG_20101009_160104.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFu-oGb2TI/AAAAAAAAAKg/5-LXfnK3gw4/s320/IMG_20101009_160104.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TLFvDabqrOI/AAAAAAAAAKk/uv9qeIzBPxU/s1600/IMG_20101010_153122.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TLFvDabqrOI/AAAAAAAAAKk/uv9qeIzBPxU/s320/IMG_20101010_153122.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;與舊筆電的比較圖&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFvHaoneMI/AAAAAAAAAKo/4BhyM0_uSx8/s1600/IMG_20101010_153148.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TLFvHaoneMI/AAAAAAAAAKo/4BhyM0_uSx8/s320/IMG_20101010_153148.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;很明顯的thinkpad比較窄一點，因為喇叭設計在鍵盤左右方，不然的話應該可以更窄&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TLFvLlxw3lI/AAAAAAAAAKs/_Apn55ye3pY/s1600/IMG_20101010_153153.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TLFvLlxw3lI/AAAAAAAAAKs/_Apn55ye3pY/s320/IMG_20101010_153153.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TLFvQF5RFDI/AAAAAAAAAKw/jQt4SsXI53M/s1600/IMG_20101010_153209.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TLFvQF5RFDI/AAAAAAAAAKw/jQt4SsXI53M/s320/IMG_20101010_153209.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;厚度很明顯差不多&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;用了一天之後的心得是鍵盤真的很好打！！！！&lt;br /&gt;&lt;br /&gt;小紅點也很好用！！！&lt;br /&gt;&lt;br /&gt;且我喜歡他的霧面螢幕&lt;br /&gt;&lt;br /&gt;16:10的設置不會讓我覺得螢幕跟之前acer的15.6(16:9)來的小&lt;br /&gt;&lt;br /&gt;蠻舒適的！！&lt;br /&gt;&lt;br /&gt;其實acer也很好用！只是如果要隨身攜帶真的頗不方便的！&lt;br /&gt;&lt;br /&gt;也剛好友人要買ＮＢ，於是乾脆就賣他了！&lt;br /&gt;&lt;br /&gt;真是有點不捨！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;不好意思，這篇開箱文非常不專業ＸＤ&lt;br /&gt;&lt;br /&gt;我太懶惰了！&lt;br /&gt;&lt;br /&gt;請多多包涵，有問題再問我吧！&lt;br /&gt;&lt;br /&gt;總而言之，這台電腦好用！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8620182588709197592?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8620182588709197592/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/thinkpad-t410.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8620182588709197592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8620182588709197592'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/thinkpad-t410.html' title='thinkpad t410 非常不專業 開箱文【不是教學文】'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6SxqtkJQECI/TLFuRI8QSCI/AAAAAAAAAJ8/834xakdOayM/s72-c/IMG_20101009_155655.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-5025368054961874773</id><published>2010-10-09T22:13:00.000-07:00</published><updated>2010-11-06T01:50:42.295-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>MyISAM 與 InnoDB 的筆記</title><content type='html'>&amp;nbsp;MyISAM 與 InnoDB 誰較快?誰安全性較高?&lt;br /&gt;&lt;br /&gt;最近都在玩GAE，好久沒有碰MySQL&lt;br /&gt;&lt;br /&gt;再把新nb裝起來，正在重灌，&lt;br /&gt;&lt;br /&gt;就看到了MyISAM 與 InnoDB 選項&lt;br /&gt;&lt;br /&gt;一時想不起來兩者差別，忘記哪個快，哪個有支援transaction?&lt;br /&gt;&lt;br /&gt;查了一下資料才想起來，年紀大了，還是做筆記把他記下來吧!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;InnoDB&amp;nbsp;是不支援全文索引，如果資料量大，建議用InnoDB ，&lt;br /&gt;&lt;br /&gt;大量的insert語法在MyISAM會比較快一點，但update在InnoDB會比較快，&lt;br /&gt;&lt;br /&gt;count不適用於InnoDB（等等會說明），MyISAM是不支援foreign key的喔&lt;br /&gt;&lt;br /&gt;因為設計上MyISAM比InnoDB簡單，因此效能上也較好一點，小型的應用使用MyISAM可能會較好一點&lt;br /&gt;&lt;br /&gt;InnoDB不會紀錄table的行數，因此當使用者下select count(*) from xxxx，InnoDB會去掃描整張table，但MyISAM就只是讀取記錄好的行數即可，&lt;br /&gt;&lt;br /&gt;但是!!當你的count後面有下where條件時，InnoDB和MyISAM都會去掃描整張table&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上是我的筆記，如有誤，請指教&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-5025368054961874773?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/5025368054961874773/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/myisam-innodb.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5025368054961874773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5025368054961874773'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/myisam-innodb.html' title='MyISAM 與 InnoDB 的筆記'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8504828828187858043</id><published>2010-10-08T21:27:00.000-07:00</published><updated>2011-12-27T03:56:17.925-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='camera'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android 取得camera的照片</title><content type='html'>android 取得camera的照片&lt;br /&gt;&lt;br /&gt;其實想在android裡面實現照相的功能，大致上分成兩種，&lt;br /&gt;&lt;br /&gt;第一種是自己去implement一個camera介面出來（不難但複雜，較具有彈性）&lt;br /&gt;&lt;br /&gt;第二種是直接利用android內部的預設介面（簡單，就只有單單的拍照功能）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;第一種通常會用到的時機，可能是你要作一個類似信義房屋先前作的app，&lt;br /&gt;&lt;br /&gt;你可以需要開啟相機，並拿著手機看看周圍，並在你的view上顯示出來這個方向有沒有房子&lt;br /&gt;&lt;br /&gt;這種方式要實作，並不困難，只是比較複雜。改天在po code上來教學。&lt;br /&gt;&lt;br /&gt;今天是要教學第二種！！&lt;br /&gt;&lt;br /&gt;第二種就非常簡單了！&lt;br /&gt;&lt;br /&gt;但相對的就沒有什麼彈性，就只有單單的開起android的照相界面，&lt;br /&gt;&lt;br /&gt;然後取得照片罷了！&lt;br /&gt;&lt;br /&gt;步驟&lt;br /&gt;&lt;br /&gt;1.先利用intent去開啟照相的介面&lt;br /&gt;&lt;br /&gt;2.在本身的activity去等待回傳的 result&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;Intent intent =  new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);//利用intent去開啟android本身的照相介面&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//設定圖片的儲存位置，以及檔名&lt;br /&gt;File tmpFile = new File(&lt;br /&gt;               Environment.getExternalStorageDirectory(), &lt;br /&gt;        "image.jpg");&lt;br /&gt;Uri outputFileUri　= Uri.fromFile(tmpFile);&lt;br /&gt;   &lt;br /&gt;/*&lt;br /&gt; * 把上述的設定put進去！然後startActivityForResult,&lt;br /&gt; * 記住，因為是有ForResult，所以在本身自己的acitivy裡面等等要複寫onActivityResult&lt;br /&gt; * 稍後再說明onActivityResult&lt;br /&gt; */    &lt;br /&gt;intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); &lt;br /&gt;startActivityForResult(intent, 0); &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著就來說明&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;onActivityResult&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;@Override&lt;br /&gt; protected void onActivityResult(int requestCode, int resultCode, Intent data) {  &lt;br /&gt;  super.onActivityResult(requestCode, resultCode, data);&lt;br /&gt;  &lt;br /&gt;  if (resultCode == RESULT_OK) {&lt;br /&gt;   Bitmap bmp = BitmapFactory.decodeFile(outputFileUri.getPath()); //利用BitmapFactory去取得剛剛拍照的圖像&lt;br /&gt;   ImageView ivTest = (ImageView)findViewById(R.id.ivTest);&lt;br /&gt;   ivTest.setImageBitmap(bmp);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;最後還得在AndroidManifest.xml上加上下面幾個permission，&lt;br /&gt;&lt;pre class="brush: xml"&gt;  &amp;lt;!-- CAMERA --&amp;gt;&lt;br /&gt;   &amp;lt;uses-permission android:name=&amp;quot;android.permission.CAMERA&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;uses-permission android:name=&amp;quot;android.permission.WRITE_EXTERNAL_STORAGE&amp;quot; /&amp;gt;&lt;br /&gt;   &amp;lt;uses-feature android:name=&amp;quot;android.hardware.camera&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;uses-feature android:name=&amp;quot;android.hardware.camera.autofocus&amp;quot; /&amp;gt;   &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;這樣就完成一個簡單的照相功能！！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8504828828187858043?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8504828828187858043/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/android-camera.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8504828828187858043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8504828828187858043'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/android-camera.html' title='android 取得camera的照片'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-4593519668426747511</id><published>2010-10-08T21:07:00.000-07:00</published><updated>2010-10-08T21:07:48.116-07:00</updated><title type='text'>我的好夥伴byebye【不是教學文】</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TK_pX4XQCHI/AAAAAAAAAJ4/iZO4uyxDMSs/s1600/IMG_20101009_011122.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TK_pX4XQCHI/AAAAAAAAAJ4/iZO4uyxDMSs/s320/IMG_20101009_011122.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這台notebook，是用我第一次賺的錢所買的，&lt;br /&gt;&lt;br /&gt;因此對我意義非凡，第一次用自己賺的錢買東西，這種感覺很奇妙，&lt;br /&gt;&lt;br /&gt;買他的時間大概是去年八月。&lt;br /&gt;&lt;br /&gt;但昨天買了thinkpad t410，今天即將去取貨。&lt;br /&gt;&lt;br /&gt;要換NB的原因主要是因為這台太大了，&lt;br /&gt;&lt;br /&gt;身為個研究生，還得帶著他東跑西跑，實在有點累!&lt;br /&gt;&lt;br /&gt;所以才打算換一台thinkpad...&lt;br /&gt;&lt;br /&gt;心裡有點感傷XDD&lt;br /&gt;&lt;br /&gt;畢竟陪伴了我一年多!!&lt;br /&gt;&lt;br /&gt;陪我去過很多地方，接了幾個案子，去了Yahoo Hack Day、Google DevFest。&lt;br /&gt;&lt;br /&gt;幫我賺了大概有9萬塊！！&lt;br /&gt;&lt;br /&gt;真是不捨啊！&lt;br /&gt;&lt;br /&gt;但是我也幫他找到了好主人，我的一位好朋友！&lt;br /&gt;&lt;br /&gt;相信他會好好對待他的！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;掰掰！等我有錢再把你贖回來！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5738G&lt;br /&gt;&lt;br /&gt;CPU: P8700&lt;br /&gt;&lt;br /&gt;HD: 500G 7200rpm&lt;br /&gt;&lt;br /&gt;Memory: 4G&lt;br /&gt;&lt;br /&gt;Graphic: ATI4500 512m&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-4593519668426747511?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/4593519668426747511/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/byebye.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4593519668426747511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4593519668426747511'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/byebye.html' title='我的好夥伴byebye【不是教學文】'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6SxqtkJQECI/TK_pX4XQCHI/AAAAAAAAAJ4/iZO4uyxDMSs/s72-c/IMG_20101009_011122.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6336588671249493877</id><published>2010-10-01T01:06:00.000-07:00</published><updated>2010-11-06T01:51:01.127-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android market 台灣可以上傳付費軟體了</title><content type='html'>今天早上到了Google DevFest Day，&lt;br /&gt;&lt;br /&gt;就收到了mail，&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;developers from 20 additional countries (Argentina, Australia, Belgium, Brazil, Canada, Denmark, Finland, Hong Kong, Ireland, Israel, Mexico, New Zealand, Norway, Portugal, Russia, Singapore, South Korea, Sweden, Switzerland and&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;Taiwan&lt;/span&gt;) can now&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;nbsp;sell paid apps&lt;/span&gt;&amp;nbsp;on Android Market&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;預計是在兩個禮拜內!!&lt;br /&gt;&lt;br /&gt;在現場的Google工程師也開始講解上傳的一些規則及技巧了!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6336588671249493877?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6336588671249493877/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/10/android-market.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6336588671249493877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6336588671249493877'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/10/android-market.html' title='android market 台灣可以上傳付費軟體了'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1172715135785613053</id><published>2010-09-18T03:24:00.000-07:00</published><updated>2010-11-06T01:51:13.994-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adsense'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Adsense for mobile content（android放置Google 廣告【下】）</title><content type='html'>在上篇已經介紹過如何設定一個Adsense for mobile content&lt;a href="http://ken-note.blogspot.com/2010/09/adsense-for-mobile-contentandroidgoogle.html"&gt;（上篇）&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這篇將會介紹如何在android app裡面，使用您設定好的Adsense for mobile content&lt;br /&gt;&lt;br /&gt;首先請在您的layout裡放置一個WebView&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"&gt;&lt;br /&gt; &lt;webview android:id="@+id/wvAdSense" android:layout_height="50px" android:layout_width="320px"&gt;&lt;br /&gt; &lt;/webview&gt;&lt;br /&gt;&lt;/linearlayout&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;然後在activity裡設定ＵＲＬ&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class main extends Activity {&lt;br /&gt;    &lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;     requestWindowFeature(Window.FEATURE_NO_TITLE);//把activity title拿掉&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.main);&lt;br /&gt;  WebView wvSense = (WebView) findViewById(R.id.wvAdSense);&lt;br /&gt;        wvSense.getSettings().setJavaScriptEnabled(true);&lt;br /&gt;        wvSense.loadUrl("http://ken-mis.appspot.com/"); //這個url是您放置您的Adsense的網站&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;這樣就完成了！&lt;br /&gt;&lt;br /&gt;您就可以在您的app裡看到您的Google廣告。&lt;br /&gt;&lt;br /&gt;在提醒一次，其實這樣的方式Google不允許！&lt;br /&gt;&lt;br /&gt;如果害怕可以使用AdMob。&lt;br /&gt;&lt;br /&gt;然後慢慢等Adsnse for mobile application在亞洲地區上市吧！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1172715135785613053?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1172715135785613053/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/09/adsense-for-mobile-contentandroidgoogle_18.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1172715135785613053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1172715135785613053'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/09/adsense-for-mobile-contentandroidgoogle_18.html' title='Adsense for mobile content（android放置Google 廣告【下】）'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-8122953542469382445</id><published>2010-09-18T03:02:00.000-07:00</published><updated>2010-11-06T01:51:22.495-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adsense'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Adsense for mobile content（android放置Google 廣告【上】）</title><content type='html'>Adsense for mobile content&lt;br /&gt;&lt;br /&gt;注意！這篇是for mobile content&lt;br /&gt;&lt;br /&gt;for mobile content&lt;br /&gt;&lt;br /&gt;是用來給手機網站放置的。&lt;br /&gt;&lt;br /&gt;並不能放置android裡面去。&lt;br /&gt;&lt;br /&gt;not for mobile application&lt;br /&gt;&lt;br /&gt;當然也有for mobile application&lt;br /&gt;&lt;br /&gt;for mobile application只有在美國、加拿大開放而已啊！囧！&lt;br /&gt;&lt;br /&gt;但是可以利用一些漏洞在android放置google adsense。&lt;br /&gt;&lt;br /&gt;（注意！但是Google是不允許這樣的ＸＤ，但是不知道就算用了，Google會怎處理）&lt;br /&gt;&lt;br /&gt;反正就先教學吧！&lt;br /&gt;&lt;br /&gt;想要在Android裡放置Google廣告，&lt;br /&gt;&lt;br /&gt;那麼必須請先去Google Adsense的網站註冊，&lt;br /&gt;&lt;a href="https://www.google.com/adsense/report/overview"&gt;https://www.google.com/adsense/report/overview&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;並點選&lt;span class="Apple-style-span" style="color: red;"&gt;Adsense行動內容廣告&lt;/span&gt;（Adsense for mobile content）&lt;br /&gt;&lt;br /&gt;然後先&lt;span class="Apple-style-span" style="color: red;"&gt;【&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;選擇廣告類型】：不用作任何修改，直接按繼續&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在來是&lt;span class="Apple-style-span" style="color: red;"&gt;【&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;廣告風格&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;】：&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;這邊就依個人，看你廣告頁面的顏色配置&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在來是&lt;span class="Apple-style-span" style="color: red;"&gt;【選擇廣告頻道&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;】：這裡不要設定任何channel，除非要測試某些特定類型的廣告。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在來就是&lt;span class="Apple-style-span" style="color: red;"&gt;【取得廣告程式碼】&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;取得您的Adsense程式碼後(javascript)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;window.googleAfmcRequest = {&lt;br /&gt;  client: 'ca-mb-pub-3783438370424072',&lt;br /&gt;  ad_type: 'text_image',&lt;br /&gt;  output: 'html',&lt;br /&gt;  channel: '',&lt;br /&gt;  format: '320x50_mb',&lt;br /&gt;  oe: 'utf8',&lt;br /&gt;  color_border: '336699',&lt;br /&gt;  color_bg: 'FFFFFF',&lt;br /&gt;  color_link: '0000FF',&lt;br /&gt;  color_text: '000000',&lt;br /&gt;  color_url: '008000',&lt;br /&gt;};&lt;br /&gt;//--&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script c="http://pagead2.googlesyndication.com/pagead/show_afmc_ads.js" sr="" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;將這段code上傳至您的網站上，&lt;br /&gt;&lt;br /&gt;（注意！是貼您的那段ＣＯＤＥ，不是我這段，如果貼我的，人家點擊，也是我在賺==我是不介意ＸＤ）&lt;br /&gt;&lt;br /&gt;這裡我就上傳至我的GAE上，(http://ken-mis.appspot.com)&lt;br /&gt;&lt;br /&gt;記得，只有手機的瀏覽器才看得到廣告!&lt;br /&gt;&lt;br /&gt;至於怎麼放置在android app裡面，在&lt;a href="http://ken-note.blogspot.com/2010/09/adsense-for-mobile-contentandroidgoogle_18.html"&gt;（下篇）&lt;/a&gt;會介紹。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-8122953542469382445?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/8122953542469382445/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/09/adsense-for-mobile-contentandroidgoogle.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8122953542469382445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/8122953542469382445'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/09/adsense-for-mobile-contentandroidgoogle.html' title='Adsense for mobile content（android放置Google 廣告【上】）'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-9091350449025002491</id><published>2010-09-09T09:44:00.000-07:00</published><updated>2010-11-06T01:51:37.509-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='broadcast receiver'/><title type='text'>BroadcastReceiver trigger ANR</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;BroadcastReceiver trigger &amp;nbsp;ANR&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;今天發現某支app丟出了一個ANR!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;看了一下LOG!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;發現是由&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;BroadcastReceiver丟出來的!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;看了一下官方ANR的有關說明!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;才發現!!!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 10.8333px; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;A&amp;nbsp;&lt;/span&gt;&lt;code style="font-family: monospace; line-height: 1em;"&gt;&lt;a href="http://developer.android.com/reference/android/content/BroadcastReceiver.html"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;BroadcastReceiver&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;nbsp;hasn't finished executing within 10 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;原來一個&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;BroadcastReceiver要在十秒之內完成，否則會丟出一個ANR!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;雖然我知道一個long operation盡量在service中完成，&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;但我不知道&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;BroadcastReceiver的限制time out 這麼短!!!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;在&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;BroadcastReceiver的說明文件中也有提到!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 10.8333px; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;(there is a timeout of 10 seconds that the system allows before considering the receiver to be blocked and a candidate to be killed&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;所以大家在send&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;Broadcast，大家要注意一下了!!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15.8333px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-9091350449025002491?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/9091350449025002491/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/09/broadcastreceiver-trigger-anr.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/9091350449025002491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/9091350449025002491'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/09/broadcastreceiver-trigger-anr.html' title='BroadcastReceiver trigger ANR'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6443257651080097011</id><published>2010-09-03T21:46:00.000-07:00</published><updated>2010-11-06T01:54:04.043-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdcard'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='db'/><title type='text'>android DB on SD Card 新增、查詢（DB 2/2）</title><content type='html'>android insert value to DB、select value from DB&lt;br /&gt;&lt;br /&gt;這篇文章會介紹&lt;br /&gt;&lt;br /&gt;如何新增資料到sqllite database，並在database作查詢等動作&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ken-note.blogspot.com/2010/09/android-create-db-on-sdcard.html"&gt;上一篇已經介紹如何在sd card新增資料庫&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這裡就只略過如何新增資料庫，直接說明新增and查詢的動作&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class db_sample {&lt;br /&gt; public static final String STR_TABLE_NAME    = "table_name"; //table名稱&lt;br /&gt; public static final String STR_FIELD_ID     = "field_id";  //欄位名稱 &lt;br /&gt; public static final String STR_FIELD_NAME    = "field_name"; //欄位名稱&lt;br /&gt; private static Context context;         &lt;br /&gt; &lt;br /&gt; public db_sample(Context context) {&lt;br /&gt;  this.context = context; //new這個class時，一定要傳入context，因為openOrCreateDatabase是由context底下的method&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //建立table的method&lt;br /&gt; public static final void fnCreateDB(){&lt;br /&gt;  //MODE_WORLD_WRITEABLE，只能有寫的權限&lt;br /&gt;  SQLiteDatabase dbwrite &lt;br /&gt;      = context.openOrCreateDatabase("/sdcard/hi_test.db", context.MODE_WORLD_WRITEABLE, null);&lt;br /&gt;  &lt;br /&gt;  //建立table&lt;br /&gt;  String sql = &lt;br /&gt;    String.format("CREATE TABLE %s (%s INTEGER primary key autoincrement, %s text )"&lt;br /&gt;        , STR_TABLE_NAME  &lt;br /&gt;        , STR_FIELD_ID    &lt;br /&gt;        , STR_FIELD_NAME   &lt;br /&gt;    ); &lt;br /&gt;  dbwrite.execSQL(sql);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //新增資料的method&lt;br /&gt; public static final long fnInsert(String strText){&lt;br /&gt;  SQLiteDatabase dbwrite &lt;br /&gt;      = context.openOrCreateDatabase("/sdcard/hi_test.db", context.MODE_WORLD_WRITEABLE, null);&lt;br /&gt;  ContentValues cv = new ContentValues();&lt;br /&gt;  cv.put(STR_FIELD_NAME, strText);&lt;br /&gt;  return dbwrite.insert(STR_TABLE_NAME, null, cv);//如果return -1代表有錯誤，否則會return該筆資料在第幾列&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //撈資料的method&lt;br /&gt; public  static final int fnRead(String strText){&lt;br /&gt;  //MODE_WORLD_WRITEABLE，只能有讀取的權限&lt;br /&gt;  SQLiteDatabase dbread &lt;br /&gt;      = context.openOrCreateDatabase("/sdcard/hi_test.db",context. MODE_WORLD_READABLE, null);&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  Cursor cursor &lt;br /&gt;    = dbread.rawQuery( &lt;br /&gt;      "select "+STR_FIELD_ID+" from "+STR_TABLE_NAME+" where "+STR_FIELD_NAME+"=?", &lt;br /&gt;      new String[] {strText}&lt;br /&gt;    );&lt;br /&gt;  &lt;br /&gt;  if (cursor.moveToFirst()) { &lt;br /&gt;   return cursor.getInt(0);&lt;br /&gt;  }&lt;br /&gt;  return -1;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;呼叫方法就如下：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class test extends Activity{&lt;br /&gt; @Override&lt;br /&gt; protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt; super.onCreate(savedInstanceState);&lt;br /&gt; db_sample db = new db_sample(this);&lt;br /&gt; db.fnCreateDB();&lt;br /&gt; db.fnInsert("HI");&lt;br /&gt; int iID = db.fnRead("HI");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6443257651080097011?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6443257651080097011/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/09/android-insert-value-to-dbselect-value.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6443257651080097011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6443257651080097011'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/09/android-insert-value-to-dbselect-value.html' title='android DB on SD Card 新增、查詢（DB 2/2）'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-5576593244154097698</id><published>2010-09-03T21:39:00.000-07:00</published><updated>2010-11-06T01:52:01.028-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdcard'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='db'/><title type='text'>android create DB on sdcard（DB 1/2）</title><content type='html'>android create db on sdcard&lt;br /&gt;&lt;br /&gt;把DB建立在SD Card上其實很簡單。&lt;br /&gt;&lt;br /&gt;先建立一個有關db操作的class，&lt;br /&gt;&lt;br /&gt;注意，此範例尚無新增、查詢等method，將在&lt;a href="http://ken-note.blogspot.com/2010/09/android-insert-value-to-dbselect-value.html"&gt;下一篇&lt;/a&gt;介紹如何新增、查詢&lt;br /&gt;&lt;br /&gt;此範例單純只有在sd card建立sqlite datebase&lt;br /&gt;&lt;br /&gt;如下&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class db_sample {&lt;br /&gt; public static final String STR_TABLE_NAME    = "table_name"; //table名稱&lt;br /&gt; public static final String STR_FIELD_ID     = "field_id";  //欄位名稱 &lt;br /&gt; public static final String STR_FIELD_NAME    = "field_name"; //欄位名稱&lt;br /&gt; private static Context context;         &lt;br /&gt; &lt;br /&gt; public db_sample(Context context) {&lt;br /&gt;  this.context = context; //new這個class時，一定要傳入context，因為openOrCreateDatabase是由context底下的method&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; //建立table的method&lt;br /&gt; public static final void fnCreateDB(){&lt;br /&gt;  //MODE_WORLD_WRITEABLE，只能有寫的權限&lt;br /&gt;  SQLiteDatabase dbwrite &lt;br /&gt;      = context.openOrCreateDatabase("/sdcard/hi_test.db", context.MODE_WORLD_WRITEABLE, null);&lt;br /&gt;  &lt;br /&gt;  //建立table&lt;br /&gt;  String sql = &lt;br /&gt;    String.format("CREATE TABLE %s (%s INTEGER primary key autoincrement, %s text )"&lt;br /&gt;        , STR_TABLE_NAME  &lt;br /&gt;        , STR_FIELD_ID    &lt;br /&gt;        , STR_FIELD_NAME   &lt;br /&gt;    ); &lt;br /&gt;  dbwrite.execSQL(sql);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著就在需要的地方呼叫即可～&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class test extends Activity{&lt;br /&gt; @Override&lt;br /&gt; protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;  super.onCreate(savedInstanceState);&lt;br /&gt;  db_sample db = new db_sample(this);&lt;br /&gt;  db.fnCreateDB();&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-5576593244154097698?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/5576593244154097698/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/09/android-create-db-on-sdcard.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5576593244154097698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5576593244154097698'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/09/android-create-db-on-sdcard.html' title='android create DB on sdcard（DB 1/2）'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-608449918426601510</id><published>2010-09-01T18:24:00.000-07:00</published><updated>2010-11-06T01:52:11.458-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asynctask'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android AsyncTask sample</title><content type='html'>android 的AsyncTask&lt;br /&gt;&lt;br /&gt;如果你可能要去download、request一個蠻龐大的網頁或者檔案時，&lt;br /&gt;&lt;br /&gt;如果是在主要的activity、widget或其他中去作，&lt;br /&gt;&lt;br /&gt;那麼想必你的activity、widget或其他的UI會像是被lock住!&lt;br /&gt;&lt;br /&gt;很LAG的感覺!&lt;br /&gt;&lt;br /&gt;那麼就使用AsyncTask吧!&lt;br /&gt;&lt;br /&gt;顧名思義，就是非同步排程(應該可以這樣翻)==&lt;br /&gt;&lt;br /&gt;AsyncTask的好處就是可以在background執行，&lt;br /&gt;&lt;br /&gt;並不影響前端的UI&lt;br /&gt;&lt;br /&gt;下面就是實作方法&lt;br /&gt;&lt;br /&gt;先去new一個class並繼承AsyncTask&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class downloadTask extends AsyncTask&amp;lt;String, Void , String&amp;gt;{&lt;br /&gt; &lt;br /&gt; public static int iFileSize   = 0;&lt;br /&gt; public static double dReadSum   = 0;&lt;br /&gt; public static boolean bIsDownload = false;&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void onProgressUpdate(Void... values) {&lt;br /&gt;  &lt;br /&gt;  //此method是在呼叫publishProgress()時的才會trigger到的&lt;br /&gt;  //可以當配progressBar來使用，這裡不多作說明。&lt;br /&gt;  &lt;br /&gt;  super.onProgressUpdate(values);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void onPreExecute() {&lt;br /&gt;  //此method是在執行doInBackground以前，才會呼叫的&lt;br /&gt;  super.onPreExecute();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; protected void onPostExecute(String result) {&lt;br /&gt;  //此method是在doInBackground完成以後，才會呼叫的&lt;br /&gt;  super.onPostExecute(result);&lt;br /&gt;  if (iFileSize == dReadSum){&lt;br /&gt;   Log.d("main","下載完成");&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;  *注意!strUrlFile是一個array..代表著在呼叫此class時&lt;br /&gt;  *可以帶入很多個參數(strUrlFile)，&lt;br /&gt;  *如:new downloadTask().execute("http://www.xxx","http://www.xxx");&lt;br /&gt;  */ &lt;br /&gt; protected String doInBackground(String... strUrlFile) {&lt;br /&gt;     URL urlFileLocation = null;&lt;br /&gt;   HttpURLConnection connFile = null;&lt;br /&gt;   try {&lt;br /&gt;    int iUrlCount = strUrlFile.length;&lt;br /&gt;   for (int i =0 ; i &amp;lt; iUrlCount ; i++){&lt;br /&gt;    urlFileLocation  = new URL(strUrlFile[i]);   &lt;br /&gt;    connFile    = (HttpURLConnection) urlFileLocation.openConnection();   &lt;br /&gt;    connFile.setDoInput(true);&lt;br /&gt;    &lt;br /&gt;    InputStream is = connFile.getInputStream();&lt;br /&gt;    iFileSize  = connFile.getContentLength();    //取得檔案大小&lt;br /&gt;    &lt;br /&gt;    byte[] buffer = new byte[1024];&lt;br /&gt;    int len1 = 0;&lt;br /&gt;    dReadSum  = 0;&lt;br /&gt;    &lt;br /&gt;    while ( (len1 = is.read(buffer)) != -1) {&lt;br /&gt;     dReadSum += len1;&lt;br /&gt;     publishProgress(dReadSum*100/iFileSize);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;   } catch (Exception e) {&lt;br /&gt;    Log.d("main","download---" + e.toString());&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;        return "";&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;呼叫此Class就只要一行:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt; new downloadTask().execute("http://www.xxx"); &lt;br /&gt;/*&lt;br /&gt;*注意，參數其實是可以很多個，如下&lt;br /&gt;*new downloadTask().execute("http://www.xxx","http://www.xxx");&lt;br /&gt;*這樣子此task就會去download兩次&lt;br /&gt;*/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-608449918426601510?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/608449918426601510/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/09/android-asynctask-sample.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/608449918426601510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/608449918426601510'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/09/android-asynctask-sample.html' title='android AsyncTask sample'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6183771953398763157</id><published>2010-08-31T16:02:00.000-07:00</published><updated>2010-08-31T16:02:43.670-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dom'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android parse xml</title><content type='html'>android parse xml&lt;br /&gt;&lt;br /&gt;在anroid parse xml其實有蠻多方法的&lt;br /&gt;&lt;br /&gt;例如SAX(Simple API for XML)、DOM...&lt;br /&gt;&lt;br /&gt;大家都知道用SAX來parse會較省記憶體。&lt;br /&gt;&lt;br /&gt;但用SAX的麻煩就是必須自己去寫content handler...&lt;br /&gt;&lt;br /&gt;但如果您的XML檔並不大，且去讀取的次數沒有很頻繁，&lt;br /&gt;&lt;br /&gt;那麼還是建議您用DOM吧!較簡單!&lt;br /&gt;&lt;br /&gt;實作方法如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt; private static DocumentBuilder documentBuilder  = null;  &lt;br /&gt; private static Document document        = null;&lt;br /&gt; private static NodeList elements        = null;&lt;br /&gt; private static int iElementLength= 0;&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onStart(Intent intent, int startId) {&lt;br /&gt;  super.onStart(intent, startId);&lt;br /&gt;  try{&lt;br /&gt;   &lt;br /&gt;   URL urlUpdate = new URL("http://www.xxx.xxx/xxx.xml");&lt;br /&gt;   documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();  &lt;br /&gt;   document = documentBuilder.parse(urlUpdate.openStream());      &lt;br /&gt;   document.getDocumentElement().normalize();  &lt;br /&gt;   &lt;br /&gt;   /*&lt;br /&gt;   *其實簡單到我也不知該怎麼寫註解了，&lt;br /&gt;   *先get到你要的tag吧，記得回傳型態是NodeList，&lt;br /&gt;   *不要看我命名為elements，就以為他是Element&lt;br /&gt;   */&lt;br /&gt;   elements  = document.getElementsByTagName("update_images");&lt;br /&gt;   iElementLength=elements.getLength();&lt;br /&gt;   if (iElementLength ==0 )&lt;br /&gt;    return;&lt;br /&gt;    &lt;br /&gt;   for (int i = 0; i &amp;lt; iElementLength ; i++) {&lt;br /&gt;    Element element = (Element) elements.item(i);&lt;br /&gt;    Log.d("main",element.getAttribute("pic_name"));&lt;br /&gt;   }&lt;br /&gt;  }catch (Exception e) {&lt;br /&gt;   Log.d("main",String.valueOf(e.toString()));&lt;br /&gt;  }&lt;br /&gt;   &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;大概就是這樣!&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6183771953398763157?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6183771953398763157/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/08/android-parse-xml.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6183771953398763157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6183771953398763157'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/08/android-parse-xml.html' title='android parse xml'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-3559612265309320603</id><published>2010-08-30T13:26:00.000-07:00</published><updated>2010-11-06T01:52:23.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='service'/><category scheme='http://www.blogger.com/atom/ns#' term='AlarmManager'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android service keep alive or another way??</title><content type='html'>android service crashed (restart)&lt;br /&gt;&lt;br /&gt;如果你有支APP有個SERVICE是可能每隔一段時間去做一次的!&lt;br /&gt;&lt;br /&gt;那麼我建議你改用AlarmManager。&lt;br /&gt;&lt;br /&gt;最近發現自己寫的某支APP裡面的service會被android os restart!&lt;br /&gt;&lt;br /&gt;大概知道是因為是background service的關係，&lt;br /&gt;&lt;br /&gt;想要讓一個service keep alive。&lt;br /&gt;&lt;br /&gt;當然有解決方法，在2.0以前的device，&lt;br /&gt;&lt;br /&gt;可以使用setForeground(true);&lt;br /&gt;&lt;br /&gt;但是2.0以上，這個method，失效了。&lt;br /&gt;&lt;br /&gt;改成startForeground(id, notification)。&lt;br /&gt;&lt;br /&gt;但我改用了AlarmManager&lt;br /&gt;&lt;br /&gt;原因當然有很多，像是其實啟動一個service，就是啟動一個process。&lt;br /&gt;&lt;br /&gt;想必就消耗掉一點memory...&lt;br /&gt;&lt;br /&gt;當然還有其他原因，大家可以去Google一下。&lt;br /&gt;&lt;br /&gt;實作方法如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {&lt;br /&gt;   Intent intent = new Intent(context, receiverChange.class);  //放入你每隔一段時間要執行的class&lt;br /&gt;   PendingIntent pendingIntent   = PendingIntent.getBroadcast(context, 0, intent, 0);&lt;br /&gt;   AlarmManager alarmManager  = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);&lt;br /&gt;   //接著就是set一個repeat，這裡是設定每隔一分鐘去執行&lt;br /&gt;   alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,  System.currentTimeMillis() , (60*1000), pendingIntent);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;然後您每隔一段時間要做的事情就寫在一個BroadcastReceiver裡面&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class receiverChangePicture extends BroadcastReceiver {&lt;br /&gt; @Override&lt;br /&gt; public void onReceive(Context context, Intent intent) {&lt;br /&gt;  Log.d("main","hi I receive message every minutes..");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這樣就完成了，但是注意此實作方法只限定於有週期性要執行的code才適用!!!!&lt;br /&gt;&lt;br /&gt;如果今天你是要偵測sd card的狀態，那麼建議你還是用service!(就如同我上篇文章所說的)&lt;br /&gt;&lt;br /&gt;以alarmManager來實作，只是節省一點成本罷了!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-3559612265309320603?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/3559612265309320603/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/08/android-service-keep-alive-or-another.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3559612265309320603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3559612265309320603'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/08/android-service-keep-alive-or-another.html' title='android service keep alive or another way??'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1441438010923937271</id><published>2010-08-19T04:17:00.000-07:00</published><updated>2010-11-06T01:52:32.351-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdcard'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android 偵測 sdcard</title><content type='html'>最近在寫一些有關檔案的操作，&lt;br /&gt;&lt;br /&gt;要把檔案寫到sdcard裡去&lt;br /&gt;&lt;br /&gt;至於怎麼寫，這裡就不多說&lt;br /&gt;&lt;br /&gt;在寫檔之前，好的programmer一定要注意到防呆!&lt;br /&gt;&lt;br /&gt;就是detect sdcard的狀態&lt;br /&gt;&lt;br /&gt;是否有被mount上去?&lt;br /&gt;&lt;br /&gt;之前都直接寫一個function去取得目前sdcard的狀態，如下&lt;br /&gt;&lt;pre class="brush: java"&gt; private static final boolean fnIsSDcard(){&lt;br /&gt;  return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);  &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;但是在我的需求中，這種寫法會有問題，&lt;br /&gt;&lt;br /&gt;因為我的檔案較大，在寫的過程中會耗費比較久的時間，&lt;br /&gt;&lt;br /&gt;如果在寫檔的過程中，sdcard被unmounted了! 很好，這個process會被killed掉!&lt;br /&gt;&lt;br /&gt;因為這是process中有參照到sdcard裡的位置，所以android os會強制kill掉!&lt;br /&gt;&lt;br /&gt;所以我就在想...sdcard有沒有event listener啊??&lt;br /&gt;&lt;br /&gt;但是沒有，所以我透過Service和BroadcastReceiver去實作&lt;br /&gt;&lt;br /&gt;首先先新增一個class，然後要extends Service，如下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class serviceSDcard extends Service {&lt;br /&gt; @Override&lt;br /&gt; public IBinder onBind(Intent intent) {&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onStart(Intent intent, int startId) {&lt;br /&gt;  //新增一個IntentFilter&lt;br /&gt;  IntentFilter intentFilter = new IntentFilter();   &lt;br /&gt;  //並且新增兩個action，告知此 service什麼時候的動作才要通知你&lt;br /&gt;  intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED); //如果sdcard被掛載上去時通知&lt;br /&gt;  intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); //如果sdcard被卸載時通知&lt;br /&gt;  intentFilter.addDataScheme("file"); &lt;br /&gt;  intentFilter.addDataAuthority("*", null);&lt;br /&gt;  registerReceiver(receiver, intentFilter);    //註冊一個BroadcastReceiver&lt;br /&gt;  super.onStart(intent, startId);&lt;br /&gt; }&lt;br /&gt; private BroadcastReceiver receiver = new BroadcastReceiver() {&lt;br /&gt;  &lt;br /&gt;  @Override&lt;br /&gt;  public void onReceive(Context context, Intent intent) {&lt;br /&gt;   try {&lt;br /&gt;    &lt;br /&gt;    if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)){&lt;br /&gt;     //sdcard被卸載時的動作&lt;br /&gt;     &lt;br /&gt;    }else{&lt;br /&gt;     //sdcard被掛載時的動作&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;   } catch (Exception e) {&lt;br /&gt;    Log.d("main", e.toString());&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;  }&lt;br /&gt; };&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;一個Service就完成了，現在就要把Service啟動!&lt;br /&gt;&lt;br /&gt;在主要執行的activity中去startService();，如下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class main extends Activity {&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        setContentView(R.layout.main);&lt;br /&gt;        Intent intent = new Intent(this,serviceSDcard.class);&lt;br /&gt;        startService(intent);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這樣就完成啦! 記得要在manifest.xml中新增一個service喔!!如下:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&amp;lt;service android:name=".serviceSDcard"&amp;gt;&amp;lt;/service&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1441438010923937271?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1441438010923937271/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/08/android-sdcard.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1441438010923937271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1441438010923937271'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/08/android-sdcard.html' title='android 偵測 sdcard'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-6935098891356790841</id><published>2010-08-06T14:18:00.000-07:00</published><updated>2010-11-06T01:52:45.432-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='progress bar'/><category scheme='http://www.blogger.com/atom/ns#' term='widget'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android ProgressBar in AppWidget</title><content type='html'>android ProgressBar in AppWidget&lt;br /&gt;&lt;br /&gt;會產生一些問題!&lt;br /&gt;&lt;br /&gt;基本上在顯示，或者設定目前progress都是沒問題的!!&lt;br /&gt;&lt;br /&gt;但是當你要把ProgressBar 設為Invisible的時候就會產生BUG!&lt;br /&gt;&lt;br /&gt;目前看來似乎是android本身的bug...&lt;br /&gt;&lt;br /&gt;至少找資料找到現在...蠻多人都說這樣的!&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;Views.setViewVisibility(R.id.TextView01, View.VISIBLE);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以往只要打這行code就能把某個元件Invisible或者GONE掉&lt;br /&gt;&lt;br /&gt;但是如果元件是Progress Bar的話!&lt;br /&gt;&lt;br /&gt;會無法動作!!&lt;br /&gt;&lt;br /&gt;所以在這建議大家使用兩個layout&lt;br /&gt;&lt;br /&gt;一個是有progress bar，一個沒有!&lt;br /&gt;&lt;br /&gt;如下!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;RemoteViews withProgressViews= new RemoteViews(this.getPackageName(),R.layout.progress_layout);//這個是有Progress的&lt;br /&gt;&lt;br /&gt;RemoteViews withoutProgressViews= new RemoteViews(this.getPackageName(),R.layout.init_layout);//這沒有Progress的&lt;br /&gt;&lt;br /&gt;app_manager.updateAppWidget(appWidgetId, withProgressViews/withoutProgressViews);//在透過app_manager去更新妳widget的layout樣式&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-6935098891356790841?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/6935098891356790841/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/08/android-progressbar-in-appwidget.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6935098891356790841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/6935098891356790841'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/08/android-progressbar-in-appwidget.html' title='android ProgressBar in AppWidget'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-5917654623360845667</id><published>2010-08-06T13:54:00.000-07:00</published><updated>2010-11-06T01:53:50.768-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdcard'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android file.mkdir()</title><content type='html'>&lt;br /&gt;今天在實作在 sdcard裡面建立一個檔案!&lt;br /&gt;&lt;br /&gt;其實這沒什麼難度!&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;File file = new File("/sdcard/tmp/tmp.db");&lt;br /&gt;file.createNewFile();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;這樣乍看之下是沒甚麼問題&lt;br /&gt;&lt;br /&gt;但如果沒有tmp此目錄的話!&lt;br /&gt;&lt;br /&gt;則會出現exception&lt;br /&gt;&lt;br /&gt;當然! 要建立一個目錄也很簡單!!只要用mkdir即可!&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;file.mkdir();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;但是!&lt;br /&gt;&lt;br /&gt;必須加入一個權限才可以建立目錄!&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&amp;lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"&amp;gt;&amp;lt;/uses-permission&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;但是建立檔案就不用了!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-5917654623360845667?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/5917654623360845667/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/08/android-filemkdir.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5917654623360845667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5917654623360845667'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/08/android-filemkdir.html' title='android file.mkdir()'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1366281155197518546</id><published>2010-08-01T03:06:00.000-07:00</published><updated>2010-08-01T03:06:47.606-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drawable'/><category scheme='http://www.blogger.com/atom/ns#' term='bitmap'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Drawable 轉換 Bitmap</title><content type='html'>在實做widget的時候，&lt;br /&gt;&lt;br /&gt;要在前景把圖片換掉&lt;br /&gt;&lt;br /&gt;發現只有&lt;br /&gt;&lt;br /&gt;setImageViewBitmap&lt;br /&gt;setImageViewResource&lt;br /&gt;setImageViewUri&lt;br /&gt;&lt;br /&gt;這三個method可以用&lt;br /&gt;&lt;br /&gt;但是我的圖片是從sqllite中抓出來的!&lt;br /&gt;&lt;br /&gt;只能先存成drawable!!&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;ByteArrayInputStream stream = new ByteArrayInputStream( cursor.getBlob(1)); &lt;br /&gt;Drawable p_pic              = Drawable.createFromStream(stream, "p_pic"); &lt;br /&gt;//fnCastToBitmap是等等自己撰寫的function..&lt;br /&gt;Bitmap bitmapTmp = fnCastToBitmap(p_pic);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;但是這樣的drawable根本沒有id，無法使用setImageViewResource來抓圖!&lt;br /&gt;&lt;br /&gt;所以只好把它轉成bitmap..&lt;br /&gt;&lt;br /&gt;如下段CODE:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;public Bitmap fnCastToBitmap(Drawable drawable){&lt;br /&gt;&lt;br /&gt;     //先設定一個config給等等要產生的bitmap，先判斷他的透明度，在判斷他的格式 &lt;br /&gt;     Bitmap.Config config =&lt;br /&gt;      drawable.getOpacity() != PixelFormat.OPAQUE &lt;br /&gt;      ? Bitmap.Config.ARGB_8888 &lt;br /&gt;      : Bitmap.Config.RGB_565;&lt;br /&gt;&lt;br /&gt;     //產生一個bitmap...寬跟高如原來圖的一樣  &lt;br /&gt;     Bitmap bitmap = Bitmap.createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),  config );&lt;br /&gt;&lt;br /&gt;     //在建立一個canvas，並把圖畫在上面去即可!!!&lt;br /&gt;     Canvas canvas = new Canvas(bitmap);&lt;br /&gt;     drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());&lt;br /&gt;     drawable.draw(canvas);&lt;br /&gt;            &lt;br /&gt; &lt;br /&gt;     return bitmap;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1366281155197518546?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1366281155197518546/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/08/drawable-bitmap.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1366281155197518546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1366281155197518546'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/08/drawable-bitmap.html' title='Drawable 轉換 Bitmap'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-4804079530228317257</id><published>2010-07-25T10:41:00.000-07:00</published><updated>2010-07-25T10:42:14.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TabActivity'/><category scheme='http://www.blogger.com/atom/ns#' term='Tab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android tab activity</title><content type='html'>今天來介紹一下Android tab activity好了!&lt;br /&gt;&lt;br /&gt;其實最近實作了不少東西，但一直沒有時間記錄下來&lt;br /&gt;&lt;br /&gt;Tab Actity倒是蠻久之前的，拿出來溫習一下吧!&lt;br /&gt;&lt;br /&gt;先新增一個class吧!&lt;br /&gt;&lt;br /&gt;但要繼承的是TabActivity!&lt;br /&gt;&lt;br /&gt;如果要做到Tab變換時，會有所動作時，&lt;br /&gt;&lt;br /&gt;要記得implements OnTabChangeListener&lt;br /&gt;&lt;br /&gt;如下:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class main extends TabActivity implements OnTabChangeListener {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;接著就來部屬Tab的長相了!&lt;br /&gt;&lt;br /&gt;這邊先預設兩個Tab(tab1、tab2)，其實tab裡的東西可以重複使用，這裡只是為了清楚定義&lt;br /&gt;&lt;br /&gt;而宣告兩個!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt; android:orientation="vertical" android:layout_width="fill_parent"&lt;br /&gt; android:layout_height="fill_parent"&amp;gt;&lt;br /&gt; &amp;lt;LinearLayout &lt;br /&gt;  android:id="@+id/tab1" &lt;br /&gt;  android:layout_width="fill_parent"&lt;br /&gt;  android:layout_height="fill_parent" &lt;br /&gt;  androidrientation="vertical"&lt;br /&gt;  android:background="#ffffff"&lt;br /&gt; &amp;gt;&lt;br /&gt; &amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;LinearLayout &lt;br /&gt;  android:id="@+id/tab2" &lt;br /&gt;  android:layout_width="fill_parent"&lt;br /&gt;  android:layout_height="fill_parent" &lt;br /&gt;  androidrientation="vertical"&lt;br /&gt;  android:background="#ff0000"&lt;br /&gt; &amp;gt;&lt;br /&gt; &amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&amp;lt;/FrameLayout&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;接著來撰寫主要的CODE了!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt; &lt;br /&gt;public class main extends TabActivity implements OnTabChangeListener {&lt;br /&gt; private TabHost tabHost;  //宣告一個TabHost，主機的意思。所有的TAB都要被加在裡面&lt;br /&gt; private TabSpec tab1, tab2;  //先宣告兩個tab&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;  super.onCreate(savedInstanceState);&lt;br /&gt;  tabHost = this.getTabHost(); //先取得TabHost&lt;br /&gt;  &lt;br /&gt;  //利用Inflater來渲染版變&lt;br /&gt;  LayoutInflater.from(this).inflate(R.layout.main,tabHost.getTabContentView(), true);&lt;br /&gt;  &lt;br /&gt;  //接著就利用newTabSpec新增一個TAB，setIndicator是設定TITLE和背景圖，setContent是設定這個TAB裡面的樣式&lt;br /&gt;  tab1 = tabHost.newTabSpec("Id1")&lt;br /&gt;      .setIndicator("Tab1",this.getResources().getDrawable(R.drawable.icon2))&lt;br /&gt;      .setContent(R.id.tab1);&lt;br /&gt;  //加入至tabHost&lt;br /&gt;  tabHost.addTab(tab1);&lt;br /&gt;  &lt;br /&gt;  tab2 = tabHost.newTabSpec("Id2")&lt;br /&gt;      .setIndicator("Tab2",this.getResources().getDrawable(R.drawable.icon))&lt;br /&gt;      .setContent(R.id.tab2);&lt;br /&gt;  tabHost.addTab(tab2);&lt;br /&gt;  tabHost.setOnTabChangedListener(this);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void onTabChanged(String tabId) {&lt;br /&gt;  new AlertDialog.Builder(this).setTitle("Hint").setMessage(tabId)&lt;br /&gt;    .setPositiveButton("OK", null).show();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;基本上這樣就大功告成了!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-4804079530228317257?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/4804079530228317257/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/07/android-tab-activity.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4804079530228317257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/4804079530228317257'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/07/android-tab-activity.html' title='Android tab activity'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-7471434903179315377</id><published>2010-07-20T14:08:00.000-07:00</published><updated>2010-07-20T14:08:06.583-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='安裝位置'/><category scheme='http://www.blogger.com/atom/ns#' term='installLocation'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>讓android app安裝在SD card</title><content type='html'>怎麼讓android app安裝在SDcard裡面去?&lt;br /&gt;&lt;br /&gt;這個問題我研究了一陣子==&lt;br /&gt;&lt;br /&gt;一直以為是上傳至MARKET有個選項讓我們勾(Application can be copied from the device)&lt;br /&gt;&lt;br /&gt;以為勾了就可以使那隻APP能夠安裝到記憶卡裡去==&lt;br /&gt;&lt;br /&gt;原來不是!&lt;br /&gt;&lt;br /&gt;是要在AndroidManifest.xml裡面插入一個attributes&lt;br /&gt;&lt;br /&gt;如下&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;manifest &lt;br /&gt;      xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;      android:installLocation="preferExternal"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;使用&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;android:installLocation此屬性即可，有三個選項&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;1.internalOnly(只能安裝在手機裡)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;2.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;preferExternal(自動安裝至記憶卡裡)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;3.auto(就是讓使用者自己選啦)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-7471434903179315377?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/7471434903179315377/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/07/android-appsd-card.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7471434903179315377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7471434903179315377'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/07/android-appsd-card.html' title='讓android app安裝在SD card'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-7807240644473450788</id><published>2010-07-10T10:26:00.000-07:00</published><updated>2010-12-07T18:07:40.723-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><title type='text'>如何製作一個chrome extension</title><content type='html'>&lt;br /&gt;如何製作一個chrome extension!&lt;br /&gt;&lt;br /&gt;其實chrome extension大概分為兩種!&lt;br /&gt;&lt;br /&gt;一種是serverless的&lt;br /&gt;&lt;br /&gt;一種是extings Web server的!&lt;br /&gt;&lt;br /&gt;這邊主要作serverless的介紹!&lt;br /&gt;&lt;br /&gt;1.首先先建立一個資料夾，例如: C:/chrome_app/&lt;br /&gt;&lt;br /&gt;2.在資料夾裡面建立一個檔名為manifest的json檔案，如：manifest.json&lt;br /&gt;&lt;br /&gt;內容格式如下：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: jscript"&gt;{&lt;br /&gt;  "name": "just sample",&lt;br /&gt;  "version": "1.0",&lt;br /&gt;  "description": "hello, this is ken's sample",&lt;br /&gt;  "browser_action": {&lt;br /&gt;      "default_icon": "icon.png",&lt;br /&gt;      "popup"       : "popup.html"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;name &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ：你的chrome app 名稱&lt;br /&gt;vserions &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;：你的版本別&lt;br /&gt;description&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;：敘述&lt;br /&gt;browser_action &amp;nbsp;：是這支app的一些基本設定，有很多種，大家可以去看官方的說明文件&lt;br /&gt;default_icon &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;：是這支app的logo&lt;br /&gt;popup &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ：是當按下這支app時，所呈現的畫面頁面&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.接著就把你的icon放到C:/chrome_app/底下去&lt;br /&gt;&lt;br /&gt;4.在資料夾裡面建立一個檔名為popup.html的檔案&lt;br /&gt;&lt;br /&gt;內容格式如下：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;html&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;body &amp;gt;&lt;br /&gt;     &amp;lt;img src="http://www.google.com/ig/images/weather/sunny.gif" /&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;這樣一個簡易的APP就完成了!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;那要放上去我們的瀏覽器呢?&lt;br /&gt;&lt;br /&gt;其實這分成兩種&lt;br /&gt;&lt;br /&gt;一種是本地端的使用&lt;br /&gt;&lt;br /&gt;一種是放在Google擴充功能上給大家使用&lt;br /&gt;&lt;br /&gt;先教第一種!&lt;br /&gt;&lt;br /&gt;首先先點選瀏覽器上的扳手按鈕&lt;br /&gt;&lt;br /&gt;在點選擴充功能&lt;br /&gt;&lt;br /&gt;在點選載入未封裝功能&lt;br /&gt;&lt;br /&gt;這樣就完成了啊!!!&lt;br /&gt;&lt;br /&gt;第二種是上傳至google去&lt;br /&gt;&lt;br /&gt;先至此網站&lt;a href="https://chrome.google.com/extensions/developer/dashboard?hl=zh-TW"&gt;https://chrome.google.com/extensions/developer/dashboard?hl=zh-TW&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;接著就add new item&lt;br /&gt;&lt;br /&gt;並且把剛剛的資料夾壓縮成zip檔案&lt;br /&gt;&lt;br /&gt;然後上傳上去即可!&lt;br /&gt;&lt;br /&gt;之後會請你做一些chrome的說明!&lt;br /&gt;&lt;br /&gt;例如放圖片之類的!&lt;br /&gt;&lt;br /&gt;這邊是簡易的使用啦!&lt;br /&gt;&lt;br /&gt;日後有機會再作深入的介紹!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;我也做了一個正妹報時的Chrome的擴充功能&lt;br /&gt;&lt;br /&gt;&lt;a href="https://chrome.google.com/extensions/detail/bagkcnhpbahjemhkogojcondikbciebp?hl=en"&gt;https://chrome.google.com/extensions/detail/bagkcnhpbahjemhkogojcondikbciebp?hl=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;可以安裝玩看看!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-7807240644473450788?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/7807240644473450788/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/07/chrome-app.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7807240644473450788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/7807240644473450788'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/07/chrome-app.html' title='如何製作一個chrome extension'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1511691514025092052</id><published>2010-06-30T10:25:00.000-07:00</published><updated>2010-11-06T01:54:20.793-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nexus'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>nexus android 2.2 ota開始了!!</title><content type='html'>嘿!在前天早上十點的時候收到OTA...真是太開心了!&lt;br /&gt;&lt;br /&gt;我的手機版本是T-mobile的版本!!之前是2.1 update-1的版本!&lt;br /&gt;&lt;br /&gt;但是當時正在學校等meeting..根本無法拍下畫面...&lt;br /&gt;&lt;br /&gt;只好事後上傳一些更新完成後的照片摟!&lt;br /&gt;&lt;br /&gt;可以從下面這張圖片看到此次OTA更新的版本別為FRF85B喔!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TCt7rLqhiQI/AAAAAAAAAIg/2d91_6cXuHk/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TCt7rLqhiQI/AAAAAAAAAIg/2d91_6cXuHk/s320/1.png" width="192" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;更新過後的桌面會多了一個算是widget的東西(只是不能刪除)&lt;br /&gt;&lt;br /&gt;最左邊的就是撥打電話的功能，中間就是開啟功能列表，最右邊就是開起瀏覽器摟&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_6SxqtkJQECI/TCt7up6mslI/AAAAAAAAAIo/ILK52IfHJUU/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_6SxqtkJQECI/TCt7up6mslI/AAAAAAAAAIo/ILK52IfHJUU/s320/2.png" width="192" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;且從JVM改成JIT以後，可用記憶體大大的提升了!&lt;br /&gt;&lt;br /&gt;圖中最下方有顯是可用記憶體大概是234+55MB!&lt;br /&gt;&lt;br /&gt;的確是順蠻多的!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TCt8SP4h0XI/AAAAAAAAAI4/5nJMTnHJxcU/s1600/4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TCt8SP4h0XI/AAAAAAAAAI4/5nJMTnHJxcU/s320/4.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;且可以把某些app移至SD card裡去，但目前只有一些些可以移而已!&lt;br /&gt;&lt;br /&gt;正在check哪些可以，為什麼可以?&lt;br /&gt;&lt;br /&gt;解決以後再跟大家說!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_6SxqtkJQECI/TCt8S4gjH6I/AAAAAAAAAJA/puCXibsepkE/s1600/5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_6SxqtkJQECI/TCt8S4gjH6I/AAAAAAAAAJA/puCXibsepkE/s320/5.png" width="192" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;對了!此次的更新..也支援中文語音搜尋喔!&lt;br /&gt;&lt;br /&gt;辨識度還算高啦!&lt;br /&gt;&lt;br /&gt;且在通話紀錄的方面，也變得比較有規律，&lt;br /&gt;&lt;br /&gt;以前譬如打給了A 10通電話，在通話紀錄裡可是會SHOW出連續的10通==可是很礙眼的!&lt;br /&gt;&lt;br /&gt;現在不會喔，會像圖中一樣顯示， 會在括號()中顯示你打了幾通電話。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_6SxqtkJQECI/TCt9rE56CaI/AAAAAAAAAJI/Zvs01RN5iUY/s1600/6.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_6SxqtkJQECI/TCt9rE56CaI/AAAAAAAAAJI/Zvs01RN5iUY/s320/6.png" width="192" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;先這樣了!希望拿n1的朋友們也可以快點收到OTA通知!!&lt;br /&gt;&lt;br /&gt;繼續來把玩我的N1了!&lt;br /&gt;&lt;br /&gt;有發現到什麼新功能在PO上來!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1511691514025092052?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1511691514025092052/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/06/nexus-android-22-ota.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1511691514025092052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1511691514025092052'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/06/nexus-android-22-ota.html' title='nexus android 2.2 ota開始了!!'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6SxqtkJQECI/TCt7rLqhiQI/AAAAAAAAAIg/2d91_6cXuHk/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-424088878328092612</id><published>2010-06-20T00:39:00.000-07:00</published><updated>2010-06-20T00:39:08.977-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='avd'/><title type='text'>android avd 無法開啟(中文路徑的問題)</title><content type='html'>幫人解決了好幾次這樣的問題!&lt;br /&gt;&lt;br /&gt;好幾次avd都無法開啟!&lt;br /&gt;&lt;br /&gt;都卡在ANDROID這樣的字樣畫面!!&lt;br /&gt;&lt;br /&gt;是因為avd是不能建立在中文目錄底下的!!!&lt;br /&gt;&lt;br /&gt;有些人的C曹會以中文姓名命名!&lt;br /&gt;&lt;br /&gt;但可惜的是，android是不允許這樣的事情發生的!&lt;br /&gt;&lt;br /&gt;因此我們必須手動移動我們的avd至英文目錄底下去!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;android move avd -n &lt;span class="Apple-style-span" style="color: red;"&gt;avd名稱&lt;/span&gt; -p &lt;span class="Apple-style-span" style="color: red;"&gt;要移至的路徑，記得要是英文路徑&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-424088878328092612?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/424088878328092612/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/06/android-avd.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/424088878328092612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/424088878328092612'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/06/android-avd.html' title='android avd 無法開啟(中文路徑的問題)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-5746287807357343366</id><published>2010-06-14T04:42:00.000-07:00</published><updated>2010-06-14T04:43:46.338-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='appcfg'/><category scheme='http://www.blogger.com/atom/ns#' term='rollback'/><category scheme='http://www.blogger.com/atom/ns#' term='deploy error'/><title type='text'>GAE/J deploy 失敗，使用appcfg rollback</title><content type='html'>GAE/J deploy 失敗&lt;br /&gt;&lt;br /&gt;今天一直在上傳，但也因為邊看世足!&lt;br /&gt;&lt;br /&gt;就沒有去注意錯誤訊息!&lt;br /&gt;&lt;br /&gt;只知道後來是不能上傳的!&lt;br /&gt;&lt;br /&gt;後來想說新增一個version，然後上傳上去!&lt;br /&gt;&lt;br /&gt;再把舊的version刪掉!&lt;br /&gt;&lt;br /&gt;但發現也不能!&lt;br /&gt;&lt;br /&gt;GAE一直叫我rollback!&lt;br /&gt;&lt;br /&gt;沒辦法啦!&lt;br /&gt;&lt;br /&gt;只好打開cmd了~&lt;br /&gt;&lt;br /&gt;找到你app engine的sdk目錄，/bin底下有個command，"appcfg.cmd"這個!&lt;br /&gt;&lt;br /&gt;不是.sh的，.sh是for mac osX的!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;指令：&lt;span class="Apple-style-span" style="color: red;"&gt;appcfg.cmd rollback &lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;你project的war路徑&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;就可以解除封鎖!&lt;br /&gt;&lt;br /&gt;就可以繼續update你的project了喔~&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-5746287807357343366?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/5746287807357343366/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/06/gaej-deploy-appcfg-rollback.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5746287807357343366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/5746287807357343366'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/06/gaej-deploy-appcfg-rollback.html' title='GAE/J deploy 失敗，使用appcfg rollback'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-3365102245407697432</id><published>2010-06-04T08:08:00.000-07:00</published><updated>2010-11-06T01:54:30.899-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>android 判斷是否有網路</title><content type='html'>很多android app都和網路脫不了關係!&lt;br /&gt;&lt;br /&gt;但是也很多設計不良的app，本身是需要網路連線，但他卻沒有做判斷。&lt;br /&gt;&lt;br /&gt;這是app就會出現error!&lt;br /&gt;&lt;br /&gt;下面是判斷有無網路的code...&lt;br /&gt;&lt;br /&gt;但是要先加入一個permission...如下!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"&amp;gt;&amp;lt;/uses-permission&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;這邊就是判斷的code了&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;ConnectivityManager conManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);//先取得此service&lt;br /&gt;&lt;br /&gt;NetworkInfo networInfo = conManager.getActiveNetworkInfo();       //在取得相關資訊&lt;br /&gt;&lt;br /&gt;if (networInfo == null || !networInfo.isAvailable()){ //判斷是否有網路&lt;br /&gt;&lt;br /&gt; new AlertDialog.Builder(main.this)&lt;br /&gt; .setMessage("沒")&lt;br /&gt; .show();&lt;br /&gt;&lt;br /&gt;}else{&lt;br /&gt;&lt;br /&gt; new AlertDialog.Builder(main.this)&lt;br /&gt; .setMessage("有")&lt;br /&gt; .show();&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-3365102245407697432?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/3365102245407697432/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/06/android.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3365102245407697432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/3365102245407697432'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/06/android.html' title='android 判斷是否有網路'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-866973865356001297.post-1411022082568373203</id><published>2010-05-30T21:08:00.000-07:00</published><updated>2010-06-01T07:30:15.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='google calendar'/><category scheme='http://www.blogger.com/atom/ns#' term='AuthSub'/><category scheme='http://www.blogger.com/atom/ns#' term='gae/j'/><category scheme='http://www.blogger.com/atom/ns#' term='google行事曆'/><title type='text'>GAE 使用 Google Calendar (使用AuthSub認證)</title><content type='html'>&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;如果想要使用Google Data API，在Google中有幾種認證提供選擇!&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;在這裡利用AuthSub來做說明!!&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;在Google App Engine中使用Google行事曆!&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;首先我們必須先去申請AuthSub!&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="https://www.google.com/accounts/ManageDomains"&gt;網址在這&lt;/a&gt;!&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;然後必須先AddDomain!&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;這邊我們加入了一個Domain為: ken-note.&lt;span class="Apple-style-span" style="color: blue;"&gt;appspot.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;注意:一定要是根目錄!不能是: ken-note.&lt;span class="Apple-style-span" style="color: blue;"&gt;appspot.com&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;/login&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;新增成功後呢!&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Google必須驗證此Domain的擁有權是否為你的!&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;有三種新增方式:&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;中繼標記 &amp;nbsp; &amp;nbsp;(就是把code放在head之中)&lt;/li&gt;&lt;li&gt;上載HTML檔 &amp;nbsp; (Google會提供一個HTML檔案，把它上傳至gae後，按驗證即可)&lt;/li&gt;&lt;li&gt;新增DNS記錄 &amp;nbsp; &amp;nbsp; (因為一定要是domain的擁有人才可以新增，我們不是&lt;span class="Apple-style-span" style="color: blue;"&gt;appspot.com的&lt;/span&gt;擁有人，因此不能新增)&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;這邊我們用第一個例子來做說明!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;只要在您首頁的header加入meta，譬如是:&lt;span class="Apple-style-span" style="color: red;"&gt;index.jsp&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;如:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="brush: html" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta name="google-site-verification" content="bHmA4RSzJdTse8mArcUO47g0rLfAYTOjxsq9E7i6sog" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;接著上傳上去以後，回到驗證擁有權的頁面!&lt;br /&gt;&lt;br /&gt;按下驗證，驗證成功後&lt;br /&gt;&lt;br /&gt;會到下個頁面去&lt;br /&gt;&lt;br /&gt;如圖&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_6SxqtkJQECI/TAM4Ci6DWtI/AAAAAAAAAII/tlAm0aVNE5Y/s1600/2222.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="376" src="http://3.bp.blogspot.com/_6SxqtkJQECI/TAM4Ci6DWtI/AAAAAAAAAII/tlAm0aVNE5Y/s640/2222.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在上圖的&lt;span class="Apple-style-span" style="color: red;"&gt;紅色&lt;/span&gt;方塊中，我們需填入我們需要對Google行事曆作操作的page..&lt;br /&gt;&lt;br /&gt;在這個例子就是&lt;span class="Apple-style-span" style="color: red;"&gt;http://ken-note.appspot.com&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;/select/calendar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;接著按下save即可!!&lt;br /&gt;&lt;br /&gt;申請工作就完成了!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著就來寫CODE了!&lt;br /&gt;&lt;br /&gt;打開你的eclipse吧!!&lt;br /&gt;&lt;br /&gt;首先必須先產生一個連結!&lt;br /&gt;&lt;br /&gt;讓使用者點選!&lt;br /&gt;&lt;br /&gt;點選以後會到一個頁面(Google給您的)來做確認是否要存取行事曆!&lt;br /&gt;&lt;br /&gt;那段CODE如下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&amp;lt;%&lt;br /&gt;&lt;br /&gt;String strUrl= AuthSubUtil.getRequestUrl("http://ken-note.appspot.com/select/calendar","http://www.google.com/calendar/feeds/",false,true);&lt;br /&gt;&lt;br /&gt;String strLink = "&amp;lt;a href=\"" + strUrl + "\" "+onclick+"&amp;gt;點選此處登入Google行事曆。&amp;lt;/a&amp;gt;";&lt;br /&gt;&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%=strLink %&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;AuthSubUtil.getRequestUrl(填入如在驗證擁有權的page,填入要存取的服務,false,true);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著就來寫對google行事曆作操作的code!&lt;br /&gt;&lt;br /&gt;就是該&lt;span class="Apple-style-span" style="color: red;"&gt;/select/calendar&lt;/span&gt; page&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt; &lt;br /&gt;CalendarService cs = new CalendarService("test"); //先create一個Calendar Service的Object&lt;br /&gt;&lt;br /&gt; String token = AuthSubUtil.getTokenFromReply(request.getQueryString()); //接著要取得token，token是google回傳給您的&lt;br /&gt;&lt;br /&gt; token = AuthSubUtil.exchangeForSessionToken(token, null); //進行轉換的動作!&lt;br /&gt;&lt;br /&gt; cs.setAuthSubToken(token);   &lt;br /&gt;&lt;br /&gt; java.net.URL feedUrl = new java.net.URL("http://www.google.com/calendar/feeds/default/allcalendars/full");&lt;br /&gt;&lt;br /&gt; CalendarFeed resultFeed = cs.getFeed(feedUrl, CalendarFeed.class); //進行連線&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; for (int i = 0; i &amp;lt; resultFeed.getEntries().size(); i++) {&lt;br /&gt;&lt;br /&gt; CalendarEntry entry = resultFeed.getEntries().get(i);&lt;br /&gt;&lt;br /&gt; response.getWriter().print(entry.getTitle().getPlainText()); //取得行事曆的內文，entry(CalendarEntry)底下有很多method，大家可以自行試試看   &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt; } &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;照著上列步驟操作即可完成對Google 行事曆作操作了!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/866973865356001297-1411022082568373203?l=blog.kenyang.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.kenyang.net/feeds/1411022082568373203/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://blog.kenyang.net/2010/05/gaejgoogle-authsub.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1411022082568373203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/866973865356001297/posts/default/1411022082568373203'/><link rel='alternate' type='text/html' href='http://blog.kenyang.net/2010/05/gaejgoogle-authsub.html' title='GAE 使用 Google Calendar (使用AuthSub認證)'/><author><name>Ken Yang</name><uri>http://www.blogger.com/profile/07043542184695902614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_6SxqtkJQECI/TNeavUGdLhI/AAAAAAAAALo/F-ypCbh4LVw/S220/FxCam_1288876363945.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6SxqtkJQECI/TAM4Ci6DWtI/AAAAAAAAAII/tlAm0aVNE5Y/s72-
