<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUMHQ3o_fCp7ImA9WhRVGEg.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668</id><updated>2012-01-18T11:30:32.444+08:00</updated><category term="SQLSERVER" /><category term="facebook" /><category term="Python" /><category term="WOW" /><category term="LINQ" /><category term="jQuery" /><category term="BLOG" /><category term="CSS" /><category term="皮皮的" /><category term="Google Wave" /><category term="web" /><category term="travian" /><category term="C" /><category term="Library" /><category term=".Net" /><category term="EntityFramework" /><category term="VISUAL STUDIO" /><category term="IS" /><category term="當兵的" /><category term="Windows" /><category term="Oracle" /><category term="Java" /><category term="IIS" /><category term="Google App Engine" /><category term="ASP.NET MVC" /><category term="ASP.NET" /><category term="GAME" /><category term="C#" /><category term="MongoDB" /><category term="Windows Phone 7" /><category term="音樂的" /><category term="PowerShell" /><category term="米蘭" /><category term="VMware" /><category term="Active Directory" /><category term="mac" /><category term="Play Framework" /><category term="資訊安全" /><category term="iOS" /><category term="JavaScript" /><category term="SVN" /><category term="Android" /><category term="心得分享" /><category term="Silverlight" /><category term="OpenGL" /><category term="HTML5" /><category term="電影" /><title>大冒險。阿健與皮皮</title><subtitle type="html">我 有 一 條 狗 他 叫 做 皮 皮 , 我 有 一 個 朋 友 他 也 叫 做 皮 皮.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://leehom59.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>206</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/ZhcPP" /><feedburner:info uri="blogspot/zhcpp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0MMRn44cSp7ImA9WhRXFEU.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-6880919029802844492</id><published>2011-12-22T01:44:00.002+08:00</published><updated>2011-12-22T01:44:47.039+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-22T01:44:47.039+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="心得分享" /><title>Blog 喬遷!</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0cjpPjCg5jE5ue0c7p3di0s2RZs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0cjpPjCg5jE5ue0c7p3di0s2RZs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0cjpPjCg5jE5ue0c7p3di0s2RZs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0cjpPjCg5jE5ue0c7p3di0s2RZs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;阿健正式把 Blog 遷到&amp;nbsp;&lt;a href="http://blog.geekors.com/"&gt;http://blog.geekors.com&lt;/a&gt; 囉!&amp;nbsp;&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;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-6880919029802844492?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/bA9iQ5u8nF4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/6880919029802844492/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/12/blog.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/6880919029802844492?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/6880919029802844492?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/bA9iQ5u8nF4/blog.html" title="Blog 喬遷!" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/12/blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUBQn0yeip7ImA9WhRQEks.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-5169373005008649113</id><published>2011-12-07T00:22:00.001+08:00</published><updated>2011-12-07T21:24:13.392+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-07T21:24:13.392+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows Phone 7" /><title>Windows Phone 7 疑難雜症 - WindowsPhone71.Overrides.targets was not found</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FCdj5Vj4oM5FoJQ4WEwCDG_1lC0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FCdj5Vj4oM5FoJQ4WEwCDG_1lC0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FCdj5Vj4oM5FoJQ4WEwCDG_1lC0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FCdj5Vj4oM5FoJQ4WEwCDG_1lC0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;今天在&lt;a href="http://msdn.microsoft.com/en-us/library/ff431744(v=VS.92).aspx" target="_blank"&gt;&amp;nbsp;Code Samples for Windows Phone&lt;/a&gt; 下載了一些 Sample Code 來看，但是在開啟的時候會跳出以下這個錯誤視窗。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-ndN-9tLXTQU/Tt5Baio5xoI/AAAAAAAABrg/SZ0zetGzd3k/s1600/01.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-ndN-9tLXTQU/Tt5Baio5xoI/AAAAAAAABrg/SZ0zetGzd3k/s1600/01.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
接著在 Visaul Studio 2010 的 Output 視窗顯示以下錯誤。&lt;br /&gt;
&lt;b&gt;The imported project "C:\Program Files\MSBuild\Microsoft\Silverlight for&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Phone\v4.0\Microsoft.Silverlight.WindowsPhone71.Overrides.targets" was not found.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
打開指定的目錄，只發現一個名為&lt;b&gt;Microsoft.Silverlight.WindowsPhone.Overrides.targets&lt;/b&gt;&amp;nbsp;的檔案。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-mKgl81lmD8Y/Tt5C4PKSnlI/AAAAAAAABrs/Sr3vP4le44o/s1600/02.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-mKgl81lmD8Y/Tt5C4PKSnlI/AAAAAAAABrs/Sr3vP4le44o/s1600/02.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
&lt;span class="Apple-style-span" style="color: #e69138; font-size: large;"&gt;&lt;b&gt;【解決方式】&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
如果要修正這個錯誤，用 Notepad ++ 打開專案目錄下的 *.csproj，以我為例就是&amp;nbsp;&lt;b&gt;sdkContactsCS.csproj &lt;/b&gt;這個檔案。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-RfZsmDkLe5M/Tt5DwKvOMjI/AAAAAAAABr4/7OU0H0rCHLQ/s1600/03.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-RfZsmDkLe5M/Tt5DwKvOMjI/AAAAAAAABr4/7OU0H0rCHLQ/s640/03.jpg" width="444" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
開啟後，找到以下這一段：&lt;br /&gt;
&lt;pre class="XML" name="code"&gt;&lt;targetframeworkprofile&gt;WindowsPhone71&lt;/targetframeworkprofile&gt;&lt;/pre&gt;
改成：&lt;br /&gt;
&lt;pre class="XML" name="code"&gt;&lt;targetframeworkprofile&gt;WindowsPhone&lt;/targetframeworkprofile&gt;&lt;/pre&gt;
存檔重新開啟就完成了。&lt;br /&gt;
========================&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;2011/12/7 更新&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;搞笑了，我裝的 Windows Phone SDK 是 7.0 舊版的，MSDN 的 Sample Code都是 7.1 版的，所以才會出現這錯訊，所以我就先移除 7.0 版 SDK ，再重裝 7.1版的 SDK，就可以不須做以上的修改，這一篇是錯誤學習。&lt;/b&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-5169373005008649113?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/rJ_2c7j6zwc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/5169373005008649113/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/12/windows-phone-7.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/5169373005008649113?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/5169373005008649113?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/rJ_2c7j6zwc/windows-phone-7.html" title="Windows Phone 7 疑難雜症 - WindowsPhone71.Overrides.targets was not found" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-ndN-9tLXTQU/Tt5Baio5xoI/AAAAAAAABrg/SZ0zetGzd3k/s72-c/01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/12/windows-phone-7.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQERHYyfCp7ImA9WhRQEUQ.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-6374267425855074059</id><published>2011-12-06T23:33:00.001+08:00</published><updated>2011-12-07T00:51:45.894+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-07T00:51:45.894+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows Phone 7" /><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight" /><title>Windows Phone 7 學習筆記 (二) - 簡易計算機</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_UKkN24HYJG5IgDcZHaVLMgg_WM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_UKkN24HYJG5IgDcZHaVLMgg_WM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_UKkN24HYJG5IgDcZHaVLMgg_WM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_UKkN24HYJG5IgDcZHaVLMgg_WM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;b&gt;練習重點：Silverlight 的 Grid 排版。&lt;/b&gt;&lt;br /&gt;
如何達到平均分配欄高及欄寬？　使用 「*」 做比例分配。&lt;br /&gt;
如何跨欄　使用 rowspan 及 colspan 。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;下次練習重點：把按鈕 User Control 化，並使用 Storyboard 製作動畫。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://dl.dropbox.com/u/17144495/Calculator.zip" target="_blank"&gt;原始碼下載&lt;/a&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-6-i7zVU-mgk/Tt43UCgQY7I/AAAAAAAABrU/DW15vw_kIwk/s1600/wp1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-6-i7zVU-mgk/Tt43UCgQY7I/AAAAAAAABrU/DW15vw_kIwk/s1600/wp1.jpg" /&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;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-sZ-1EVeSoQw/Tt42-sB34DI/AAAAAAAABrM/G7KcYehgwb4/s1600/Wp2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-sZ-1EVeSoQw/Tt42-sB34DI/AAAAAAAABrM/G7KcYehgwb4/s1600/Wp2.jpg" /&gt;&lt;/a&gt;&lt;/div&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/6821770336424218668-6374267425855074059?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/92tbazJfu2o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/6374267425855074059/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/12/windows-phone-7-sample.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/6374267425855074059?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/6374267425855074059?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/92tbazJfu2o/windows-phone-7-sample.html" title="Windows Phone 7 學習筆記 (二) - 簡易計算機" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-6-i7zVU-mgk/Tt43UCgQY7I/AAAAAAAABrU/DW15vw_kIwk/s72-c/wp1.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/12/windows-phone-7-sample.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUERHg8fyp7ImA9WhRRGE8.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-4992547479518657956</id><published>2011-11-30T20:10:00.001+08:00</published><updated>2011-12-02T18:53:25.677+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-02T18:53:25.677+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows Phone 7" /><title>Windows Phone 7 學習筆記 (一) - 基本觀念</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PFuhTQUK-Dk2l-09yEWnfDdWKQ0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PFuhTQUK-Dk2l-09yEWnfDdWKQ0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PFuhTQUK-Dk2l-09yEWnfDdWKQ0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PFuhTQUK-Dk2l-09yEWnfDdWKQ0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;把&amp;nbsp;&amp;nbsp;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=13890" target="_blank"&gt;Windows Phone Developer Tools&lt;/a&gt;&amp;nbsp;裝起來後，幾分鐘之內就寫好一個超陽春 BMI，由於微軟的開發工具非常強大，SDK 的使用習慣跟以往的 Web Form 相去不遠，很容易就能夠上手。經過了幾分鐘的初體驗之後，就開始要練內功 -&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff967549(v=VS.92).aspx" target="_blank"&gt;&lt;b&gt;基本觀念&lt;/b&gt;&lt;/a&gt; 。不過我沒用過 Windows Phone，一些觀念或操作方式只能看著模擬器想像，如果有理解錯誤的地方，請多多指教囉。&lt;br /&gt;
&lt;br /&gt;
Windows Phone 應用程式的基本模型就像下面這張圖， Application 裏面有許多 Page：&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/-4uqWxg9zvlk/TtiO6OM8qfI/AAAAAAAABq0/Gf436ohfEC4/s1600/2011-12-02_163633.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-4uqWxg9zvlk/TtiO6OM8qfI/AAAAAAAABq0/Gf436ohfEC4/s1600/2011-12-02_163633.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
而 Application 會在以下三種狀態中做轉換，&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #e69138; font-size: large;"&gt;&lt;b&gt;Running &lt;/b&gt;&lt;/span&gt;： 使用者透過「磚塊牆」或「應用程式列表」啟動你的應用程式，或者透過 Navigation 連到的 Application ，就會馬上進入這個狀態，簡單說就是你正在使用的應用程式，就是正在 Running 狀態。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #e69138; font-size: large;"&gt;Dormant &lt;/span&gt;&lt;/b&gt;： 當使用者離開到其他 Application 時，原本在 Running 的狀態的 Application 會轉換到 Dormant 休眠的狀態，並且停止它所有要處理的程序，&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;但整個 Application 仍然被存在記憶體當中&lt;/b&gt;&lt;/span&gt;，等待隨時被喚醒回到 Running狀態。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #e69138; font-size: large;"&gt;Tombstoned &lt;/span&gt;&lt;/b&gt;： 在 Dormant 狀態下的 Application 隨時都可能被轉換到 Tombstoned 狀態，也就是被終結掉啦。但它會在 Deactivated 事件中保存一些必要的資訊，像是轉換 Page 的順序啦、目前在哪一個 Page，還會保存一個 Dictionary 的物件，讓使用者再度回到 Application 的時候(指是從其他 Applicaton 按下 Back 鈕回到原本的 Application)，才不會資料都不見了，或者不是在剛剛使用的那個 Page ，而造成不佳的使用者驗體。而 MSDN 也有提到，Windows Phone 最多同時能保存 5 個 Application 的狀態資訊。&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
要注意的是，假設你有一個 Application 正在 Dormant 或 Tombstoned 狀態下，然後又從「磚塊牆」或「應用程式列表」啟動該 Application ，這時的 Application 將會是&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt; New Instance&lt;/span&gt;&lt;/b&gt;，而你舊的 Application 將會被終結掉，所以在狀態處理上面需要特別留意，否則可能會造成不太好的使用經驗。&lt;/div&gt;
&lt;br /&gt;
當 Application 在做狀態轉換的時候，就會觸發一些事件，而你可以輕易的在這些事件中執行你需要做的事情。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #e69138;"&gt;Application 事件&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Lunching ： New Instance 的 Application 將會觸發這個事件。&lt;/li&gt;
&lt;li&gt;Deactivated ： 從 Running 狀態轉到 Dormant 時觸發。&lt;/li&gt;
&lt;li&gt;Activated ： 從 Dormant 或 Tombstoned 狀態回到 Running 狀態時觸發。&lt;/li&gt;
&lt;li&gt;Closing ： 當使用者 按下 Back 鍵離開 Application 的時候觸發。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #e69138;"&gt;&lt;b&gt;Page 事件&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;OnNavigatedFrom ： 進入 Page 時觸發。&lt;/li&gt;
&lt;li&gt;OnNavigatedTo ： 離開 Page 時觸發。&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
在 Appliation 的每個事件中&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;都不能處理超過 10 秒的工作&lt;/b&gt;&lt;/span&gt;，例如讀取 Local Database 、 Remoting&amp;nbsp;Procedure Call … 等工作，都不要在 Application 的事件中做處理。像讀資料庫 、RPC 這種 I/O Bound 的處理，是一定都要實作 Network I/O Pattern，使用 Call back 的方式，以提供使用者最佳的使用體驗。&lt;br /&gt;
&lt;br /&gt;
Windows Phone Application 執行模型就像下面這張圖&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-gY4u6_hO5z4/TtiL_YEN6sI/AAAAAAAABqo/Nd9q2y1wuyY/s1600/2011-12-02_162411.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-gY4u6_hO5z4/TtiL_YEN6sI/AAAAAAAABqo/Nd9q2y1wuyY/s1600/2011-12-02_162411.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
還有兩個你需要知道的觀念：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Application State&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;當你從一個 Web Service 取下資料後，要在不同的 Page 中使用這筆資料，但是當你的 Application 只要觸發 Deactivated 或 Activated 事件時，這些資料都會不見，除非你把資料存在 Windows Phone 的儲存設置當中。&lt;br /&gt;實作方式：&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff967547(v=VS.92).aspx" target="_blank"&gt;How to: Preserve and Restore Application State for Windows Phone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Page State&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;可以想像成是 Web Form 的 ViewState，當每個 Page 在轉換的時候，Windows Phone 只會保存部分的重要資訊(PhoneApplicationPage 的 State Dictionay)，如果你自已有額外的資訊要儲存時，利用 Page State 就可以做得到。&lt;br /&gt;實作方式：&lt;a href="http://msdn.microsoft.com/en-us/library/ff967548(v=VS.92).aspx" target="_blank"&gt;How to: Preserve and Restore Page State for Windows Phone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
沒有實際的 Windows Phone 可以操作一下還真是麻煩，一切都只能靠幻想了!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-4992547479518657956?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/7pzESHa7O0Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/4992547479518657956/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/11/windows-phone-7.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/4992547479518657956?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/4992547479518657956?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/7pzESHa7O0Y/windows-phone-7.html" title="Windows Phone 7 學習筆記 (一) - 基本觀念" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-4uqWxg9zvlk/TtiO6OM8qfI/AAAAAAAABq0/Gf436ohfEC4/s72-c/2011-12-02_163633.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/11/windows-phone-7.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEANSX8zfCp7ImA9WhRQEks.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-7375826292645634961</id><published>2011-11-27T14:45:00.001+08:00</published><updated>2011-12-07T22:06:38.184+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-07T22:06:38.184+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="心得分享" /><title>阿健環島 1/2</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Vk9fYgcHFLLfj5pmQtxEO5L8wJQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vk9fYgcHFLLfj5pmQtxEO5L8wJQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Vk9fYgcHFLLfj5pmQtxEO5L8wJQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vk9fYgcHFLLfj5pmQtxEO5L8wJQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&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;a href="http://3.bp.blogspot.com/-nrln3fnaSwU/TtHcc54HsnI/AAAAAAAABoQ/ZPrh5gkqLdw/s1600/%25E7%2592%25B0%25E5%25B3%25B6.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="383" src="http://3.bp.blogspot.com/-nrln3fnaSwU/TtHcc54HsnI/AAAAAAAABoQ/ZPrh5gkqLdw/s640/%25E7%2592%25B0%25E5%25B3%25B6.jpg" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
是的，就在 100年 11月 15 (二) 完成了 6 天騎機車環島的計劃，對我來說這是個很特別的經驗，會不會有下一次呢? 我不確定，也沒有計劃，但還是要感恩一下，感謝上帝在這下雨的季節中，給了我們4天的好天氣，更保守每個人每一天的平安，更要謝謝一起長大、一起環島的兄弟們，沒有他們，就不會有這趟充滿驚喜、歡樂、爭吵、熱血、愛情的旅行，而我想「打卡」可能就是我這次旅行的義意吧!!!&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/-mpszxsQXz_M/TtHgjINReRI/AAAAAAAABoc/B8SazvjiE8w/s1600/%25E5%25BF%2597%25E9%25B4%25BB.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="119" src="http://2.bp.blogspot.com/-mpszxsQXz_M/TtHgjINReRI/AAAAAAAABoc/B8SazvjiE8w/s200/%25E5%25BF%2597%25E9%25B4%25BB.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;痴情化妝品業務 - 花豹&lt;/b&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/-kqOmxFpRxbw/TtHjhi0fnCI/AAAAAAAABoo/FCWD6dT239g/s1600/%25E5%25AE%259C%25E8%25AE%2593.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://1.bp.blogspot.com/-kqOmxFpRxbw/TtHjhi0fnCI/AAAAAAAABoo/FCWD6dT239g/s200/%25E5%25AE%259C%25E8%25AE%2593.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;已經是第 6 次環島的建築師 - Run Guo&lt;/b&gt;&lt;br /&gt;
揉揉眼睛，是的你沒看錯，他是本次旅行中最資深的環島員，每年都會來一次環島連續了6年，而且我聽說其中有一次因為太趕，乾脆就開車環島 (這樣也行啊) 。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-0aDrz2WZgcg/TtHj0I3MysI/AAAAAAAABow/GEMwbPv7vlI/s1600/%25E6%259F%258F%25E7%25B6%25AD.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://4.bp.blogspot.com/-0aDrz2WZgcg/TtHj0I3MysI/AAAAAAAABow/GEMwbPv7vlI/s200/%25E6%259F%258F%25E7%25B6%25AD.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;屎尿最多又為情所苦的電視工作者 - 拍雄&lt;/b&gt;&lt;br /&gt;
這次的旅行中，最令我不爽的一個人，因為&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;他只參舉了前兩天的行程啊&lt;/span&gt;&lt;/b&gt;! 理由竟然是為了「上課」，當學生的時候都沒這麼認真了，而且拍雄是&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;第一個說要去環島的人啊&lt;/b&gt;&lt;/span&gt; ! 是不是屎屎尿尿，真的是幹咧。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
第一天早上我們從拍雄的家出發，而不知道為什麼，環島的第一餐我很想吃麥當勞的&lt;b&gt;豬肉滿福堡&lt;/b&gt;，在樹林市區繞了半個小時發現，&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;這裏居然沒有麥當勞!&lt;/span&gt;&lt;/b&gt; 最後勉強選擇了拉亞漢堡，結果整整比預期出發的時間慢了一個多小時，接近 11 點才正式從樹林一起出發。&lt;br /&gt;
&lt;br /&gt;
接著一路向南，大約下午四點就到台中市花豹的家，很可惜的是第一天都在下雨，經過泰安鄉、卓蘭，都只能看到白茫茫的霧氣，看不到好天氣時的山林美景。下雨天騎車其實很累，雖然我一直告訴自已，下雨天環島也是很浪漫的，而且很熱血!(可是我真的想要一個好天氣啊!!)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="float: left;"&gt;
&lt;a href="http://3.bp.blogspot.com/-9tUx_05f2O8/TtHu2yXzAAI/AAAAAAAABpE/Ya1Eu4a9iSM/s1600/2.JPG" imageanchor="1" style="float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="132" src="http://3.bp.blogspot.com/-9tUx_05f2O8/TtHu2yXzAAI/AAAAAAAABpE/Ya1Eu4a9iSM/s200/2.JPG" width="200" /&gt;&lt;/a&gt;
&lt;a href="http://2.bp.blogspot.com/-oxLF7R2CUsY/TtHujjsz7sI/AAAAAAAABo8/A-DG-H-gYA8/s1600/1.JPG" imageanchor="1" style="float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="132" src="http://2.bp.blogspot.com/-oxLF7R2CUsY/TtHujjsz7sI/AAAAAAAABo8/A-DG-H-gYA8/s200/1.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href="http://3.bp.blogspot.com/-ZRZO0qlLjLk/TtHvIyL4nDI/AAAAAAAABpM/LdV1rY4_QKI/s1600/3.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://3.bp.blogspot.com/-ZRZO0qlLjLk/TtHvIyL4nDI/AAAAAAAABpM/LdV1rY4_QKI/s200/3.JPG" width="200" /&gt;&lt;/a&gt;
&lt;a href="http://1.bp.blogspot.com/-lRfTjs_Ucg8/TtHvd0gKYjI/AAAAAAAABpU/FvmhDG9ZPDQ/s1600/4.JPG" imageanchor="1" style="float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://1.bp.blogspot.com/-lRfTjs_Ucg8/TtHvd0gKYjI/AAAAAAAABpU/FvmhDG9ZPDQ/s200/4.JPG" width="200" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;div style="clear: both;"&gt;
&lt;/div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;在中途的 7-11 一定要來個「大家來找碴」&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
晚上買了一瓶伏特加 + 可樂，就在花豹家喝了起來(5 個晚上都在喝)，更聊起了花豹及拍雄的感情故事，故事都好精彩、好熱血，而且聊一聊還會吵架呢，超好玩的! (尤其是花豹 vs 拍雄，一整個非常不合)&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;! 我第一次來台南，而且還是騎機車來的喔，吃了鹽水阿桐意麵、棺材板、安平豆花、阿川土魠魚羹，話說台南的羹真是他x的甜啊，宜蘭的蒜味肉羹不知道台南人吃了會有什麼感覺。不過在台南唸過4年書的花豹都不覺得這些東西特別好吃，尤其是棺材板，他說，吃了第 2 次就再也不想吃了，&lt;b&gt;好膩&lt;/b&gt;。我想我會很久很久以後才會再來光顧吧，初次品嚐的美感就這樣的 keep in mind 吧，有些時候恰恰好才是最美的，是吧 !?&lt;br /&gt;
&lt;br /&gt;
阿健為您帶來的阿桐意麵&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="360" src="http://www.youtube.com/embed/0eJEs5FrPNs" width="640"&gt;&lt;/iframe&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;! &amp;nbsp;哇哈哈&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;&lt;span class="Apple-style-span" style="color: red;"&gt; &lt;/span&gt;往前走還頻頻回頭說，&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;「&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;好捨不得喔」&lt;/span&gt;&lt;/b&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://4.bp.blogspot.com/-6K6aza_OUjo/TtH_kRYZT2I/AAAAAAAABpg/9JhEyUkcBqM/s1600/%25E7%25BE%258A.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="209" src="http://4.bp.blogspot.com/-6K6aza_OUjo/TtH_kRYZT2I/AAAAAAAABpg/9JhEyUkcBqM/s320/%25E7%25BE%258A.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-fmq5M3joYTs/TtILCSuikWI/AAAAAAAABps/U1QFUdxxGp8/s1600/%25E8%2590%25AC%25E4%25B8%25B9%25E7%25B4%2585%25E8%25B1%2586%25E9%25A4%25852.JPG" imageanchor="1" style="float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://1.bp.blogspot.com/-fmq5M3joYTs/TtILCSuikWI/AAAAAAAABps/U1QFUdxxGp8/s200/%25E8%2590%25AC%25E4%25B8%25B9%25E7%25B4%2585%25E8%25B1%2586%25E9%25A4%25852.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-PXiwSEvxssg/TtIMAvi2GeI/AAAAAAAABp4/80dli0kC2_Y/s1600/%25E8%2590%25AC%25E4%25B8%25B9%25E7%25B4%2585%25E8%25B1%2586%25E9%25A4%25851.JPG" imageanchor="1" style="float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://4.bp.blogspot.com/-PXiwSEvxssg/TtIMAvi2GeI/AAAAAAAABp4/80dli0kC2_Y/s200/%25E8%2590%25AC%25E4%25B8%25B9%25E7%25B4%2585%25E8%25B1%2586%25E9%25A4%25851.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="clear: both;"&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/-ycFJkaon6Ag/TtIOWz9TxzI/AAAAAAAABqE/DLJ6W6GtxFs/s1600/%25E8%259B%2587.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://3.bp.blogspot.com/-ycFJkaon6Ag/TtIOWz9TxzI/AAAAAAAABqE/DLJ6W6GtxFs/s640/%25E8%259B%2587.JPG" 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;
速速的結束了約1個半小時的聚會，我們又開始往南行，前往…墾丁!&lt;br /&gt;
&lt;br /&gt;
想想距離我上次來墾丁的時間，8 年了，有沒有變呢!? 其實我完全沒有印象。在這裏充滿了性感、甜蜜的氛圍，大部分的人都雙雙對對的，而我們居然是 3 個臭男生來這裏 Check in ，而且房間的配置(職業病嗎我!?) 讓我好傻眼，對情侶來說可能很有情調，對我們三個臭男生來說…真是夠了! &lt;span class="Apple-style-span" style="color: red; font-weight: bold;"&gt;居然是個上空的浴廁! &lt;/span&gt;&lt;span class="Apple-style-span"&gt;那大便的臭味不就很尷尬，看花豹笑的多開心。&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-zE9JWJ1Boe0/TtIQtrFh3VI/AAAAAAAABqQ/1X2mTrFfyew/s1600/%25E6%2588%25BF%25E9%2596%2593.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://1.bp.blogspot.com/-zE9JWJ1Boe0/TtIQtrFh3VI/AAAAAAAABqQ/1X2mTrFfyew/s640/%25E6%2588%25BF%25E9%2596%2593.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
咻一下，就過了三天，時間實在是很快，一下子就結束了東部之旅，緊接著就是最令我期待、興奮的花東之旅，在那裏我們遇到了最可愛、最熱情的台東人，玩起了比手劃腳、猜人名，玩到半夜3點還不太想睡覺，還有第一次喝到小米酒! 在花蓮，更住到一間由工程師所開的民宿，書櫃裏盡是一些 Unix、Linux ...的書。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
我們的旅行從城市到了海邊、又從海邊到了部落。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
--待續--&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-7375826292645634961?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/4W2KeILs1nA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/7375826292645634961/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/11/12.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/7375826292645634961?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/7375826292645634961?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/4W2KeILs1nA/12.html" title="阿健環島 1/2" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-nrln3fnaSwU/TtHcc54HsnI/AAAAAAAABoQ/ZPrh5gkqLdw/s72-c/%25E7%2592%25B0%25E5%25B3%25B6.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/11/12.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8HRnk9eCp7ImA9WhRRE0Q.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-8955999847383043137</id><published>2011-11-25T22:00:00.000+08:00</published><updated>2011-11-27T21:00:37.760+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-27T21:00:37.760+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB" /><title>Mongo DB Sharding 心得筆記 (一)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wCOmi0-xcqZUN1NAj1K-_SmOFXI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wCOmi0-xcqZUN1NAj1K-_SmOFXI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wCOmi0-xcqZUN1NAj1K-_SmOFXI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wCOmi0-xcqZUN1NAj1K-_SmOFXI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;自從 &lt;a href="http://leehom59.blogspot.com/2011/07/aspnet-async.html" target="_blank"&gt;&lt;b&gt;小賴&lt;/b&gt; 被公司操到爆肝的事件&lt;/a&gt;發生之後，一氣之下，自已一個人跑去開公司，開始做案子賺大錢，一個人自由自在，做起事來得心應手，過得非常開心。但好景不常，公司的業務越來越多，多到他一個人開始負荷不了，這時，他找來了 &lt;b&gt;&lt;a href="http://teyou.blogspot.com/" target="_blank"&gt;黃Teyou&lt;/a&gt;&lt;/b&gt;，平均分配工作量，按表操課，讓每個人的效益達到最佳化，使得公司能夠運作的更順利，而這種分配工作量的概念，就是 Sharding。&lt;br /&gt;
&lt;br /&gt;
以下就是我讀 Scaling MongoDB 這本書的的心得筆記。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;瞭解 Mongo DB 的 Sharding&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
要在網路上找到架設 Mongo DB Sharding 的方式很容易，範例也很多，但如果你沒有去瞭解運作原理的話，當你的資料量一大起來，或者 Shard 一多，就會變得難以管理，發生了一點問題要除錯的時候，你更可能不知道要從何下手。所以一定要來瞭解 Mongo DB Sharding 的運作原理，而這篇文章會介紹以下四個主題：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;b&gt;資料切割&lt;/b&gt;&lt;/span&gt; : 告訴你 Sharding 之間的資料怎麼做切割&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;b&gt;Balancing&lt;/b&gt;&lt;/span&gt;：怎麼&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;平均&amp;nbsp;&lt;/span&gt;&lt;/b&gt;分配&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;b&gt;mongos (route server)&lt;/b&gt;&lt;/span&gt; ： 提供單一連線介面給 Client&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;b&gt;Config Server&lt;/b&gt;&lt;/span&gt;： 用來儲存每個 Shard 之間的狀態&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="color: #274e13; font-size: x-large;"&gt;&lt;b&gt;1.資料切割&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-fTzhti3SRJI/Ts9JspsI8oI/AAAAAAAABnw/DzGDs-8poV8/s1600/005.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-fTzhti3SRJI/Ts9JspsI8oI/AAAAAAAABnw/DzGDs-8poV8/s1600/005.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
Cluster 會有許多個 Shard，而每個 Shard 包含總資料的子集合。以上圖為例子，整個 Cluster 的資料量是 400GB，這個Cluster有 4 個 Shard，每個Shard 各有 100 GB 的資料，每個 Shard 由1組ReplSet 組成，每一個 ReplSet 由 3 個 Mongod 組成，而這 3 個 Mongod 因為 replication 機制都擁有相同的資料。那400GB的資料是用什麼規則來分配哪些 100GB 給 Shard A ，另外哪些 100GB 給 Shard B 呢?&amp;nbsp;&lt;/div&gt;
Mongo DB 可以指定一個欄位的值當作 Key ，作為切割資料的依據，而這個 Key，我們稱為&lt;span class="Apple-style-span" style="color: #b45f06;"&gt; &lt;b&gt;Shard Key&lt;/b&gt;&lt;/span&gt;，可以是一個欄位或多個欄位。書上有提到 2 種切割方式：&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;第一種切割方式：One range per shard&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
假設我們的會員資料有個欄位是 age，Cluster 有 4 shard，我們會這樣分配我們的資料：&lt;br /&gt;
Shard A :&amp;nbsp;[0,25)&lt;br /&gt;
Shard B : [25,50) &lt;br /&gt;
Shard C : [50,75) &lt;br /&gt;
Shard D : [75,100)&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;註：[ , ] : inclusive bounds (大於、小於) 、&amp;nbsp;( , ) : exclusive bounds (超過、不及)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
意思就是說&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;年齡不到 25 歲的會員資料將會被分配到 Shard A，25 ~ 49 歲的會員資料會被分配到 Shard B&lt;/span&gt;&lt;/b&gt;，以此類推。這是最直覺的資料切割方式，平均給定切割範圍。&lt;br /&gt;
但問題來了, 你確定 75歲以上的會員數會跟 25~50歲的會員數一樣多嗎? 如果你的 Application 是做養老院會員管理系統，我想50歲以下的會員數會是 0 吧，所以這會造成每個 Shard 的大小難以平均，而當每個 Shard 的大小不平均的時候， Mongo DB 會開始把較大的 shard 切割，然後分配給較小的 Shard，如下圖：&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-J5UsWUYOR94/Ts9NMqYxfGI/AAAAAAAABn8/wVgK6fxFSew/s1600/006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-J5UsWUYOR94/Ts9NMqYxfGI/AAAAAAAABn8/wVgK6fxFSew/s1600/006.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(此圖節錄自&amp;nbsp;&lt;a href="http://shop.oreilly.com/product/0636920018308.do" target="_blank"&gt;Scaling MongoDB&lt;/a&gt;,作者:Kristina Chodorow)&lt;/span&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/-jzba-omp37Q/Ts9NN4fcXTI/AAAAAAAABoE/ZCG8tt2tNoI/s1600/007.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-jzba-omp37Q/Ts9NN4fcXTI/AAAAAAAABoE/ZCG8tt2tNoI/s1600/007.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(此圖節錄自&lt;a href="http://shop.oreilly.com/product/0636920018308.do" target="_blank"&gt;&amp;nbsp;Scaling MongoDB&lt;/a&gt;,作者:Kristina Chodorow)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
這樣過程中，會產生許多資料移動的成本，要盡可能的讓這行為發生的次數降低。&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;第二種：Multi range per shard&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
這種切割方式是不預先給定範圍，當資料量成長到一個程度的時候才開始切割，然後分配給其他比較資料量比較小的 Shard，而這個切割出來的東西稱作「 Chunk 」。&lt;br /&gt;
同樣以有 age 的會員資料表來做例子，一開始 chunk 的 range 為&amp;nbsp;&amp;nbsp;(-∞,∞) ，也就是所有資料都會進到 第一個 Shard ，當資料量達到一定大小的時候，假設是 200 MB，Mongo DB 就會開始切割資料，可能會由 (-∞,∞) 變成&amp;nbsp;(-∞ , 50] &amp;nbsp;跟 &amp;nbsp;(50,∞) ，然後分配資料到 Chunk 最少的Shard 。&lt;br /&gt;
&lt;br /&gt;
【注意事項】&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;C&lt;/span&gt;hunk 可以只有一個值來當作切割範圍，例如：姓氏。&lt;/li&gt;
&lt;li&gt;Chunk 之間不能重疊，而且必需相連，例如： [1,3),[3,6),[6,9)....&lt;/li&gt;
&lt;li&gt;每個文件只能屬於１個 Chunk。&lt;/li&gt;
&lt;li&gt;Shard Key 可以是 Null ，但新增資料的時候一定要帶 Shard Key 欄位。&lt;/li&gt;
&lt;li&gt;無法更改 Shard Key， 除非刪除資料，更改 Shard key 之後，重新 insert。&lt;/li&gt;
&lt;li&gt;Shard Key 可以為多型態欄位，排序的規則：null &amp;gt; numbers &amp;gt; strings &amp;gt; objects &amp;gt; arrays &amp;gt; binary data&amp;nbsp;&amp;gt;&amp;nbsp;ObjectIds&amp;nbsp;&amp;gt;&amp;nbsp;booleans&amp;nbsp;&amp;gt;&amp;nbsp;dates&amp;nbsp;&amp;gt;&amp;nbsp;regular expressions&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;200 MB 大小的 Chunk 是最佳選擇。&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span class="Apple-style-span" style="color: #274e13;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-size: x-large; font-weight: bold;"&gt;
&lt;b style="color: #274e13; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;2.Balancing&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
做資料的切割、移動、合併就稱作 Balancing，而做這些事的就稱作 &lt;b&gt;Balancer&lt;/b&gt;。它的工作除了保持各 Shards 之間資料量的平衡之外，&lt;b&gt;最重要的就是降低 Balancing 的次數&lt;/b&gt;，減少 Chunk 在各 Shard 之間的傳輸量。&lt;br /&gt;
&lt;br /&gt;
有一種比較 tricky 的情況，當 Shard A 比 Shard B 多 2 個 Chunks 的時候，就會開始 Balancing，從 Shard A 移動 1 個 Chunk 到 Shard B ，讓 2 個 Shard 之間保持相同的 Chunk 數量，合理，沒錯。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-vf6kYvtJb6s/Ts8hkFHcaqI/AAAAAAAABm4/cC-KjHkWVgs/s1600/001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-vf6kYvtJb6s/Ts8hkFHcaqI/AAAAAAAABm4/cC-KjHkWVgs/s1600/001.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="white-space: pre;"&gt;但天算不如人算，接下來的資料剛好都被分配到 Shard B，造成 Shard B 又比 Shard A 多 2 個 Chunks，然後 MongDB 再從 Shard B 移動 1 個 Chunk 到 Shard A。&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-yhsx7OwDiII/Ts8jE5BP5FI/AAAAAAAABnE/fp0Cqi2MvHY/s1600/002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-yhsx7OwDiII/Ts8jE5BP5FI/AAAAAAAABnE/fp0Cqi2MvHY/s320/002.jpg" width="301" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="white-space: pre;"&gt;哇哩咧，&lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;移來移去不就&lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;裝肖仔。事實上  Mongo DB 是不會這麼容易移動 Chunk ，&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;當最多 Chunk 數的 Shard 比最少 Chunk 數的 Shard &lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;多 9 個 &lt;/b&gt;Chunk&lt;/span&gt;，Mongo DB 才會開始幫你做 Balancing 移動、合併資料的動作。&lt;/span&gt;&lt;br /&gt;
而在開發階段，可以用&lt;b&gt;&amp;nbsp;--chunkSize&lt;/b&gt; 自訂 Chunk 大小來看看 Balancing 的效果，但 Production 就不要再亂改了。&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #274e13; font-size: x-large;"&gt;&lt;b&gt;3.Mongos( Route Server)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Mongos 提供一個介面給 User 來使用，讓 User 覺得使用 Cluster 跟使用 Single Node 一樣簡單。&lt;br /&gt;
&lt;b&gt;新增：&lt;/b&gt;&lt;br /&gt;
當你在新增資料的時候，他會去分析 Shard Key ，然後把這筆資料送到該去的 Shard 去儲存。&lt;br /&gt;
&lt;b&gt;查詢&lt;/b&gt;&lt;b&gt;：&lt;/b&gt;&lt;br /&gt;
而當你使用 Shard Key 做查詢的時候，一樣只會把這個查詢送到相對應的 Shrad 做查詢，這樣查詢稱為「&lt;b&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;targeted query&lt;/span&gt;&lt;/b&gt;」；那如果沒有包含 Shard Key ， Mongos 會把這個 Query 送往每一個 Shrad ，等回應之後再合併結果，稱為「&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&lt;b&gt;spewed query&lt;/b&gt;&lt;/span&gt;」。通常 targeted query 的效率會比 spewed query 來的好。&lt;br /&gt;
&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #274e13; font-size: x-large;"&gt;&lt;b&gt;4.Config Server&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
用來儲存所有 Shards 的狀態，如果要讓 Chunk 在各 Shard 之間確實的做到切割及合併，就要仰賴 Config Server。如果在合併的過程中， Config Server 掛掉，所有的正在執行的合併都會中斷，然後回到合併前的狀態，而所有儲存在 Config Server 的狀態將會被凍住，不能被改變，一直到 Config Server 重啟&lt;br /&gt;
&lt;br /&gt;
整個 Mongo DB Sharding 的架構就像是下面這張圖。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-_zwU_1K4WpY/Ts9AnZp71UI/AAAAAAAABnQ/ns994G3JVjw/s1600/003.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-_zwU_1K4WpY/Ts9AnZp71UI/AAAAAAAABnQ/ns994G3JVjw/s1600/003.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
小賴跟 Teyou 從此過著快樂的生活 !?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-8955999847383043137?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/3M_nllU7bT0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/8955999847383043137/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/11/mongo-db-sharding.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/8955999847383043137?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/8955999847383043137?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/3M_nllU7bT0/mongo-db-sharding.html" title="Mongo DB Sharding 心得筆記 (一)" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-fTzhti3SRJI/Ts9JspsI8oI/AAAAAAAABnw/DzGDs-8poV8/s72-c/005.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/11/mongo-db-sharding.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QCSXk7eSp7ImA9WhRSFE8.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-7285910063692220204</id><published>2011-11-07T02:33:00.001+08:00</published><updated>2011-11-16T14:36:08.701+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-16T14:36:08.701+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>開啟 HTC Flyer 的電話功能</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/or9Ihbzoo4CmZpDu7IPCK5PZDOE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/or9Ihbzoo4CmZpDu7IPCK5PZDOE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/or9Ihbzoo4CmZpDu7IPCK5PZDOE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/or9Ihbzoo4CmZpDu7IPCK5PZDOE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;昨天拿到銘良哥新買的 HTC Flyer，請我幫他研究如何開啟 Flyer 的電話功能，花了一些時間爬文，網路上的教學文章很多，但都好亂又好雜,而且很多相關載點都失效，經過消化整理，只需要三個步驟即可取得電話功能：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;S-OFF&lt;/li&gt;
&lt;li&gt;取得Root權限&lt;/li&gt;
&lt;li&gt;修改 /System/build.prop&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div&gt;
在開始之前，需要一些工具及調整你flyer的設定。&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;【手機設定】&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;設定-&amp;gt;應用程式-&amp;gt;開發。&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;把 「USB除錯中」打開。&lt;/li&gt;
&lt;li&gt;把 「保持喚醒」打開，方便作業。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;設定-&amp;gt;連線至PC-&amp;gt;預設的連線類型 改成 「僅充電」。&lt;/li&gt;
&lt;li&gt;設定-&amp;gt;電源-&amp;gt;快速開機打開&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;【adb 連線工具】&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;我原本就有安裝 android 的開發環境, 把 SDK folder 的 platform-tools 加到環境變數當中即可，等會S-Off的工具會用到 adb&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;【電腦設定 】 - Win 7 作業系系&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;必須把HTC Sync 停用，但需要它的 Driver&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;br /&gt;
正式開始：&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
一、S-Off (什麼是S-off? &lt;a href="http://5i01.com/topicdetail.php?f=566&amp;amp;t=2057380" target="_blank"&gt;link1&lt;/a&gt; ,&lt;a href="http://www.addictivetips.com/mobile/what-is-s-off-how-to-gain-it-on-htc-android-phones-with-unrevoked-forever/" target="_blank"&gt;link2&lt;/a&gt;)&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;先到 &lt;a href="http://revolutionary.io/" target="_blank"&gt;http://revolutionary.io/&lt;/a&gt; 下載 s-off 的工具。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Qj9fnjD4z9I/TrbJv_7yUeI/AAAAAAAABkk/cAAKvQR0X4o/s1600/2011-11-07_011230.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="109" src="http://1.bp.blogspot.com/-Qj9fnjD4z9I/TrbJv_7yUeI/AAAAAAAABkk/cAAKvQR0X4o/s640/2011-11-07_011230.jpg" width="640" /&gt;&lt;/a&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;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;解壓縮。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-7A0dWt3k8wk/TrbJwkBOQpI/AAAAAAAABks/ExtbJAvZDwo/s1600/2011-11-07_011321.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="378" src="http://3.bp.blogspot.com/-7A0dWt3k8wk/TrbJwkBOQpI/AAAAAAAABks/ExtbJAvZDwo/s640/2011-11-07_011321.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&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://3.bp.blogspot.com/-7A0dWt3k8wk/TrbJwkBOQpI/AAAAAAAABks/ExtbJAvZDwo/s1600/2011-11-07_011321.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;切換到該目錄執行 revolutionary.exe&lt;/li&gt;
&lt;li&gt;到下圖的第2步，取得flyer的 serial number，複製到下載此工具的網站上，取得一組新的Key，再貼回到下圖的第3步。&lt;/li&gt;
&lt;li&gt;到第4步直接輸 「&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;N&lt;/b&gt;&lt;/span&gt;」即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-cohsseUBrKY/TrbJxc6DdqI/AAAAAAAABk4/WmtXl-WqYSs/s1600/2011-11-07_011956.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="552" src="http://3.bp.blogspot.com/-cohsseUBrKY/TrbJxc6DdqI/AAAAAAAABk4/WmtXl-WqYSs/s640/2011-11-07_011956.jpg" width="640" /&gt;&lt;/a&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/-O4idfb8QX30/TrbJyJ-VYTI/AAAAAAAABlA/DW4oOdQwjDg/s1600/2011-11-07_012413.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="383" src="http://4.bp.blogspot.com/-O4idfb8QX30/TrbJyJ-VYTI/AAAAAAAABlA/DW4oOdQwjDg/s640/2011-11-07_012413.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;重開之後會看到第二行有個&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt; S-OFF&lt;/span&gt;&lt;/b&gt; ，就代表成功了。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-zMtNJ5aiqq0/TrbJ9flPFPI/AAAAAAAABlI/h176E1JOtA0/s1600/IMAG0271.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="382" src="http://4.bp.blogspot.com/-zMtNJ5aiqq0/TrbJ9flPFPI/AAAAAAAABlI/h176E1JOtA0/s640/IMAG0271.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
二、取得 Root 權限&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;到&lt;a href="http://forum.xda-developers.com/attachment.php?attachmentid=670828&amp;amp;d=1311991644" target="_blank"&gt;此處&lt;/a&gt;下載 工具。&lt;/li&gt;
&lt;li&gt;把下載到的 zip 檔放到你的 sdcard,稍候會從 recovery 安裝。&lt;/li&gt;
&lt;li&gt;進入 CWM (選擇&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;&amp;nbsp;recovery&lt;/b&gt;&lt;/span&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-eUibeETxEYw/TrbKC9c2DqI/AAAAAAAABlQ/MAFULYDdYng/s1600/IMAG0272.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="382" src="http://4.bp.blogspot.com/-eUibeETxEYw/TrbKC9c2DqI/AAAAAAAABlQ/MAFULYDdYng/s640/IMAG0272.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;進入 CWM的畫面&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-CC4P8rRv3vI/TrbKGatPdnI/AAAAAAAABlY/FBoplW2y05A/s1600/IMAG0273.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="382" src="http://1.bp.blogspot.com/-CC4P8rRv3vI/TrbKGatPdnI/AAAAAAAABlY/FBoplW2y05A/s640/IMAG0273.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;接下來請先備份你的 ROM，有備有保佑&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;到 backup and storage&amp;nbsp;&lt;/li&gt;
&lt;li&gt;選擇 backup，即開始備份你的 ROM&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;安裝剛下載放到sdcard的 zip 檔&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;選擇 install zip from sdcard&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;選擇 choose zip from sdcard&lt;/li&gt;
&lt;li&gt;選擇剛剛放到 sdcard 的 zip，開始安裝&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;安裝完重開機，&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;順利的話就是取得 root 權限了&lt;/span&gt;&lt;/b&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
三、最後一步就最簡單啦，快完成了，撐一下。&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;安裝&amp;nbsp;&lt;a href="https://market.android.com/details?id=com.estrongs.android.pop&amp;amp;hl=zh_TW" target="_blank"&gt;ES File Explorer&lt;/a&gt;&amp;nbsp;。&lt;/li&gt;
&lt;li&gt;可以看到 /System 資料夾的權限為 rw-rw-rw- ，那就是可以寫入啦。&lt;/li&gt;
&lt;li&gt;修改 ES File Explorer 的設置，按 Menu --&amp;gt; 設置&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;「Root 瀏覽器 」打勾&lt;/li&gt;
&lt;li&gt;「裝載檔案系統(裝載/、/System 為可讀可寫) 」打勾&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;透過 ES File Exploere修改&amp;nbsp;/system/build.prop &amp;nbsp;檔案&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;ro.ril.reject.cs.ss.enabled=0&lt;/li&gt;
&lt;li&gt;ro.ril.reject.mo.ussd.enabled=0&lt;/li&gt;
&lt;li&gt;ro.phone.function=1&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;(2011.11.16更新)&amp;nbsp;&lt;span style="background-color: white; font-family: arial, sans-serif; font-size: 15px; letter-spacing: 1px; line-height: 22px;"&gt;ro.bt.profiles = 4270403&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="background-color: white; font-family: arial, sans-serif; font-size: 15px; letter-spacing: 1px; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small; letter-spacing: normal; line-height: normal;"&gt;(2011.11.16更新)&amp;nbsp;&lt;/span&gt;service.brcm.bt.ag_supported = 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; letter-spacing: 1px; line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: 1px; line-height: 22px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;(2011.11.16更新) &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #222222;"&gt;後來銘良哥跟我說他弄了個藍牙耳機，但是Flyer的藍牙耳機功能沒有開啟。所以要全完的使用通話記得要開藍牙的功能唷，上面&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;第4項&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #222222;"&gt;及&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;第5項&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #222222;"&gt;就是開啟Flyer藍牙的功能。&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
重新開機後就有電話功能啦，BinGo!&lt;br /&gt;
&lt;div style="text-align: -webkit-auto;"&gt;
&lt;a href="http://1.bp.blogspot.com/-9fw37ualNbY/TrbKJdaeV0I/AAAAAAAABlg/anAA0x2P8i0/s1600/IMAG0274.jpg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/-9fw37ualNbY/TrbKJdaeV0I/AAAAAAAABlg/anAA0x2P8i0/s640/IMAG0274.jpg" width="382" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-7285910063692220204?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/Fopb_XXitbY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/7285910063692220204/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/11/htc-flyer.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/7285910063692220204?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/7285910063692220204?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/Fopb_XXitbY/htc-flyer.html" title="開啟 HTC Flyer 的電話功能" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Qj9fnjD4z9I/TrbJv_7yUeI/AAAAAAAABkk/cAAKvQR0X4o/s72-c/2011-11-07_011230.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/11/htc-flyer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQBQHY6fSp7ImA9WhdaGUU.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-3258629396867007007</id><published>2011-10-30T22:50:00.000+08:00</published><updated>2011-10-30T22:52:31.815+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-30T22:52:31.815+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB" /><title>MongoDB 快速上手</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yY8OOAcVy3SJ_g0HP7pSE2MMF6I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yY8OOAcVy3SJ_g0HP7pSE2MMF6I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yY8OOAcVy3SJ_g0HP7pSE2MMF6I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yY8OOAcVy3SJ_g0HP7pSE2MMF6I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="http://3.bp.blogspot.com/-FjAPqnXWNYE/Tq0lSk9p4AI/AAAAAAAABjA/QvUzVblUM3Q/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2011-10-30%2B%25E4%25B8%258B%25E5%258D%25886.18.40.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-FjAPqnXWNYE/Tq0lSk9p4AI/AAAAAAAABjA/QvUzVblUM3Q/s400/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2011-10-30%2B%25E4%25B8%258B%25E5%258D%25886.18.40.png" width="283" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
MongoDB 是個&amp;nbsp;簡單、好用、易上手，NoSQL 的 Database，很容易入門，這裏記綠怎麼在 Mac OS 設定一個 MongoDB Server 及 Client 的開發環境。&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
在 Mac 系統的安裝步驟如下：&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
一、&lt;a href="http://www.mongodb.org/downloads"&gt;下載：OS X 64-bit&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-3IJyH_W3lpk/Tq0udBwUPcI/AAAAAAAABjs/sO1g6cOm0UE/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25887.05.25.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-3IJyH_W3lpk/Tq0udBwUPcI/AAAAAAAABjs/sO1g6cOm0UE/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25887.05.25.png" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; clear: left; color: black; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;a href="http://www.blogger.com/goog_1859962243"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; clear: left; color: black; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;二、解壓縮之後的資料夾結構如下，而我們只需要 bin 資料夾。&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-aCPIYknrbj8/Tq0rY3qFijI/AAAAAAAABjM/MpAc7oOJyDY/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25886.52.26.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-aCPIYknrbj8/Tq0rY3qFijI/AAAAAAAABjM/MpAc7oOJyDY/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25886.52.26.png" /&gt;&lt;/a&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;
三、&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;在家目錄下開 Mongo 資料夾，整理後&lt;/span&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;a href="http://4.bp.blogspot.com/-Nz1u71awhR8/Tq0sx5dJSqI/AAAAAAAABjg/u6dCfV-KQO4/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25886.58.02.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Nz1u71awhR8/Tq0sx5dJSqI/AAAAAAAABjg/u6dCfV-KQO4/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25886.58.02.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;/Mongo&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&amp;nbsp; /bin : Mongo DB Core&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&amp;nbsp; /Database : 資料庫檔案&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&amp;nbsp; /install : 安裝檔案&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;四、設定環境變數：&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="color: black;"&gt;將 ~/Mongo/bin 加到 /etc/paths，即可開始操作 MongoDb。&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt;【註】&lt;/span&gt;在 32 bit 的版本中，單個資料庫檔案的大小不得超過 2 GB。因為 MongoDB 使用記憶體Mapped 來操作資料，這樣做是為了保持一定的效能，如果要在這樣的限制下去操作一個超過 2 GB 的資料庫，可能需要用到特別的工具(用到什麼特別的工具或方式，官方並沒有提到)以及增加程式碼的複雜度，所以 MongoDB乾脆就對 32 bit 的系統做出了這樣的限制，免得有更多複雜及不必要的工作產生。&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
啟動 Server 服務指令&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
mongod --bind_ip 127.0.0.1 --dbpath "\\192 .168.x.x\MongoDb" --rest&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;--bind_ip : 指定要 bind 的 ip&lt;/li&gt;
&lt;li&gt;--dbpath : 指定存放檔案的目錄，可指定 UNC 目錄&lt;/li&gt;
&lt;li&gt;--rest &amp;nbsp;: 開啟 rest 介面，預設的 port 為 28017&lt;/li&gt;
&lt;li&gt;--help : 可查詢更多相關指令&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
啟動 Client 指令&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
mongo --host 127.0.0.1 --port 27017&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;當你沒使用任何參數，預設會直接 bind localhost:27017&lt;/li&gt;
&lt;li&gt;--help : 查詢更多相關指令&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
MongoDB GUI application on Mac OS&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
Mango Hub &amp;nbsp;: &lt;a href="http://mongohub.todayclose.com/"&gt;http://mongohub.todayclose.com/&lt;/a&gt;&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;a href="http://4.bp.blogspot.com/-TU8IuNbu1po/Tq1Au_dVKxI/AAAAAAAABj4/YPwa2KA_3sw/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25888.18.09.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="571" src="http://4.bp.blogspot.com/-TU8IuNbu1po/Tq1Au_dVKxI/AAAAAAAABj4/YPwa2KA_3sw/s640/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25888.18.09.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
二、連線成功之後，就會進入資料庫及Collection畫面&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-oCWp9KKv6pU/Tq1A78qv1CI/AAAAAAAABkA/6tzlwDC-N9I/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25888.22.44.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="570" src="http://4.bp.blogspot.com/-oCWp9KKv6pU/Tq1A78qv1CI/AAAAAAAABkA/6tzlwDC-N9I/s640/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%25888.22.44.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;三、(二)圖上方有個 Query 按鈕按下去之後，就有這個操作畫面，提供CRUD、Map Reduce、匯出及匯出功能，按下 Run 之後即可把資料抓出來。&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-kdfLJn7zSWc/Tq1csnKeozI/AAAAAAAABkU/FF1pyldhcS8/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%258810.22.15.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="571" src="http://4.bp.blogspot.com/-kdfLJn7zSWc/Tq1csnKeozI/AAAAAAAABkU/FF1pyldhcS8/s640/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-10-30+%25E4%25B8%258B%25E5%258D%258810.22.15.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&lt;br /&gt;&lt;/span&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: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
Mongo的確是個很好上手也容易Dep loy，支援又多的 NoSQL 資料庫，但他的 Map Reduce 效能不是非常好，最近的經驗是以 2 萬筆資料來做 Map Reduce，大約需3秒的時間，還因此沒辦法通過客戶的壓測，嚴格來說 2萬筆資料是非常少的，如果是要做 real-time 的服務，我不太建議用MongoDB 提供的 Map Reduce 來做運算。而會慢的原因主要是因為它的 Map Reduce 是 Single Thread Mode 搭配 JavaScript Core Engine，據說在 2.0 之後會有改善，但我現在就是用2.0，感覺並沒有特別優秀。&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
基本的開發環境已經架設完成，接著有時間會持續分享 MongoDB 的基本指令，怎麼 Indexing、Shar ding、Schema Design 觀念，還有 .Net Driver 、Java Driver 的使用方法及心得。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-3258629396867007007?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/3LFhf6rn8B0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/3258629396867007007/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/10/mongodb.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/3258629396867007007?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/3258629396867007007?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/3LFhf6rn8B0/mongodb.html" title="MongoDB 快速上手" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-FjAPqnXWNYE/Tq0lSk9p4AI/AAAAAAAABjA/QvUzVblUM3Q/s72-c/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2011-10-30%2B%25E4%25B8%258B%25E5%258D%25886.18.40.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/10/mongodb.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMFRX4_cCp7ImA9WhdWEUg.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-6959201636637523966</id><published>2011-09-04T21:57:00.000+08:00</published><updated>2011-09-04T23:33:34.048+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-04T23:33:34.048+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><title>Facebook Graph API 與 .Net  (一) - Profile API 實作</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lDnm2V7Wb3crtWog-WEz9YyIV1Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lDnm2V7Wb3crtWog-WEz9YyIV1Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lDnm2V7Wb3crtWog-WEz9YyIV1Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lDnm2V7Wb3crtWog-WEz9YyIV1Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;最近遇到一個很趕流行的需求，直接可以讓會員使用他們的 Facebook 帳號登入，透過授權直接取得該會員的資料，而不需要另行註冊，這是時下網站很愛的一個功能，你的網站沒有這個功能就不算跟得上時代，所以不管怎樣都要弄一個來帥一下，不過這個東西的確可以幫你的網站降低非常多的召收會員的門檻。&lt;br /&gt;
&lt;br /&gt;
怎麼與你的會員機制接在一起呢 ? 其實很簡單，我們只是把「驗證」這個步驟丟到 Facebook 去處理，也就是輸入帳號、密碼我們不做了(好像在講廢話)。而這次我不打算自已刻一個會員機制，我選擇了&amp;nbsp;.Net 2.0 時所提供的「網頁安全性管理 API」，而我用到了三個 API：&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Role API : 幫你的網站使用者分類群組 。&lt;/li&gt;
&lt;li&gt;Memebership API : 記錄驗證使用者時需要的資訊。&lt;/li&gt;
&lt;li&gt;Profile API : 一些非必須的資料，在這裏我是拿來記錄會員在 Facebook 中的基本資料。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;/ol&gt;
知道的人或許很多，但真的有在用這套 API 的似乎很少，就我認識的是沒有，大家都很愛不斷地發重新明輪子。而這一篇要分享的就是 Profile API 在 「WebSite 專案」及「非Web Site 專案」實作上的差異。&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt;ps.以下所有在程式碼中看到的 Profile，都是登入情況下使用的。匿名 Profile 又是另外一件事了。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
不管你用以上哪個 API ，首先使用.Net Framework提供的&amp;nbsp;&lt;a href="http://msdn.microsoft.com/zh-tw/library/ms229862(v=vs.80).aspx"&gt;aspnet_regsql&lt;/a&gt; 工具產生資料庫要用的表格。(aspnet_regsql 用法可以參考 &lt;a href="http://msdn.microsoft.com/en-us/library/2y3fs9xs.aspx"&gt;這裏&lt;/a&gt;)&lt;br /&gt;
&lt;pre class="XML" name="code"&gt; aspnet_regsql -E -S JEN-PC\SQLEXPRESS -A mrp -d mydatabase

&lt;/pre&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-PPzvYPg5fTw/TmOKDP2iULI/AAAAAAAABiY/XXF1cv4HM-c/s1600/2011-09-04_222409.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-PPzvYPg5fTw/TmOKDP2iULI/AAAAAAAABiY/XXF1cv4HM-c/s1600/2011-09-04_222409.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://4.bp.blogspot.com/-PPzvYPg5fTw/TmOKDP2iULI/AAAAAAAABiY/XXF1cv4HM-c/s320/2011-09-04_222409.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
結果：&lt;/div&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;
「 Web Site 專案」的實作方式如下：&lt;/div&gt;
&lt;div&gt;
Web.Config&lt;/div&gt;
&lt;div&gt;
&lt;pre class="XML" name="code"&gt;&lt;profile&gt;
&lt;providers&gt;
    &lt;clear&gt;
    &lt;add applicationname="/" connectionstringname="ApplicationServices" name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider"&gt;
    &lt;/add&gt;&lt;/clear&gt;&lt;/providers&gt;
	&lt;properties&gt;
		&lt;add name="link" type="System.String"&gt;&lt;/add&gt;
		&lt;add name="first_name" type="System.String"&gt;&lt;/add&gt;
		&lt;add name="last_name" type="System.String"&gt;&lt;/add&gt;
		&lt;add name="locale" type="System.String"&gt;&lt;/add&gt;
		&lt;add name="id" type="System.String"&gt;&lt;/add&gt;
	&lt;/properties&gt;
&lt;/profile&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
ASPX Page , 會根據 web.config 自動產生強型別的 Profile。&lt;/div&gt;
&lt;div&gt;
&lt;pre class="C#" name="code"&gt;protected void Page_Load(object sender, EventArgs e)
{
    Profile.first_name = "my first name";
    Profile.last_name = "my last name";
    Profile.link = "my link";
    Profile.locale = "my locale";
    Profile.id = "my id";
    Profile.Save();  
}
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;但是，&lt;/span&gt;&lt;/b&gt;在「非 WebSite」的專案中則無法這樣使用，例如 ASP.NET MVC &amp;nbsp;Project ，實作方式就不一樣。&lt;br /&gt;
首先，把 Web.Config 中 profile 區段的 properties 拿掉。&lt;br /&gt;
&lt;pre class="XML" name="code"&gt;&lt;profile&gt;
&lt;providers&gt;
    &lt;clear&gt;
    &lt;add applicationname="/" connectionstringname="ApplicationServices" name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider"&gt;
    &lt;/add&gt;&lt;/clear&gt;&lt;/providers&gt;
&lt;/profile&gt;
&lt;/pre&gt;
第二，定義一個繼承自 ProfileBase 的類別，包含一些儲存會員資訊時需要用到的屬性，以下程式碼就是定義用來儲存Facebook 個人資料的屬性。&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;public class UserProfile : ProfileBase
{
    public virtual string id 
    {
        get 
        {
            return ((string)(this.GetPropertyValue("id")));
        }
        set 
        {
            this.SetPropertyValue("id", value);
        }
    }
    public virtual string first_name
    {
        get
        {
            return ((string)(this.GetPropertyValue("first_name")));
        }
        set
        {
            this.SetPropertyValue("first_name", value);
        }
    } 
    // ...省略   

    public virtual UserProfile GetProfile(string username)
    {
        return ((UserProfile)(ProfileBase.Create(username)));
    }
}
&lt;/pre&gt;
&lt;br /&gt;
聰明的你注意到了最後面那個 GetProfile(string username) 的方法，呼叫了父類別的 Create()，在這裏你可以為剛加入的 Member 建立新的 Profile ，或者取得舊會員已存在的Profile。以下是一個簡單的範例。&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;// 從 facebook 取得會員資料
dynamic fbUser = facebookService.GetUserData(access_token.access_token);
if (fbUser != null)
{
    if (fbUser.verified)
    {
        //建立 (或取得) 會員
        MembershipUser NewMember = Membership.GetUser(fbUser.email) ?? Membership.CreateUser(fbUser.email, "facebook");
        //取得 ticket 然後登入
        FormsAuthentication.SetAuthCookie(NewMember.UserName, true);
        //建立 (或取得) 該會員的 Profile,然後更新.
        UserProfile profile = (UserProfile)UserProfile.Create(NewMember.UserName,true);
        profile.id = fbUser.id;
        profile.first_name = fbUser.first_name;
        profile.last_name = fbUser.last_name;
        profile.locale = fbUser.locale;
        profile.verified = fbUser.verified;
        profile.Save(); //最後更新到Database

    }              
}
&lt;/pre&gt;
&lt;br /&gt;
最後這些 Profile 資料都會存在資料庫&amp;nbsp;&amp;nbsp;aspnet_Profile &amp;nbsp;的表格中囉。&lt;br /&gt;
其實這個 API 很好用, 而這一 PO 似乎還沒跟 Facebook Graph API 扯上關係，就下一篇吧。&lt;br /&gt;
&lt;br /&gt;
下一篇：Facebook Graph API 與 .Net &amp;nbsp;(二) - 還沒想到…&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/zh-tw/library/ms229862(v=vs.80).aspx"&gt;aspnet_regsql&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://leehom59.blogspot.com/search/label/SQLSERVER"&gt;設定SQL Server 儲存ASP.NET Session State (Cookieleses)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-6959201636637523966?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/WVF1KcjDHSo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/6959201636637523966/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/09/facebook-graph-api-net-profile-api.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/6959201636637523966?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/6959201636637523966?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/WVF1KcjDHSo/facebook-graph-api-net-profile-api.html" title="Facebook Graph API 與 .Net  (一) - Profile API 實作" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-PPzvYPg5fTw/TmOKDP2iULI/AAAAAAAABiY/XXF1cv4HM-c/s72-c/2011-09-04_222409.jpg" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Eiwa Station, Japan</georss:featurename><georss:point>35.132736 136.764336</georss:point><georss:box>35.106764 136.724854 35.158708000000004 136.80381799999998</georss:box><feedburner:origLink>http://leehom59.blogspot.com/2011/09/facebook-graph-api-net-profile-api.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8AQXgyeip7ImA9WhdQEEo.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-7035012830417444016</id><published>2011-08-11T16:48:00.002+08:00</published><updated>2011-08-11T23:00:40.692+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-11T23:00:40.692+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="HTML5" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>HTML5 - WebSocket 出現 INVALID_STATE_ERR 錯誤處理</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/80FokyVVgGP2OQVbb-ODELEXlc8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/80FokyVVgGP2OQVbb-ODELEXlc8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/80FokyVVgGP2OQVbb-ODELEXlc8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/80FokyVVgGP2OQVbb-ODELEXlc8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;最近跟朋友聊到 Web Socket 跟 WebGL，突然就拿出去年寫的&amp;nbsp;Web Socket Server 來 Build，但是拋出了 Exception。&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/-r6gcANnnIcA/TkN-7XAq0FI/AAAAAAAABgA/84b1SMsLskE/s1600/error.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-r6gcANnnIcA/TkN-7XAq0FI/AAAAAAAABgA/84b1SMsLskE/s1600/error.jpg" /&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;
簡單的一段 js 程式碼如下， Exception 就這樣被拋出來。&lt;br /&gt;
&lt;pre class="JavaScript" name="code"&gt;var socket;
window.onload = function (e) {
	socket = new WebSocket('ws://localhost:7878/handsomejen');
	socket.onopen = function () {
		alert('handshake 成功!');
	};
};
function sendMsg() {
	try {
		socket.send('test');
	}
	catch (err) {
		alert(err);
	}
}
&lt;/pre&gt;&lt;br /&gt;
在 socket.send( message ) 出現 &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;INVALID_STATE_ERR&lt;/b&gt;&lt;/span&gt; 錯誤。一個從來沒改過的程式碼，怎麼會出錯呢? 一定是大環境變動，我們沒跟著變，因為我們沒跟著變，所以就被淘汰了(物競天擇之適者生存)。上網看了一下 &lt;a href="http://dev.w3.org/html5/websockets/"&gt;W3C 規範的文件&lt;/a&gt;，ctrl-f 剛好有提到 &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;INVALID_STATE_ERR&lt;/b&gt;&lt;/span&gt; 這個錯誤，是因為你在連線還沒建立的時候就執行了 Send() 這個方法，原文如下。&lt;br /&gt;
&lt;br /&gt;
The send(data) method transmits data using the connection. If the readyState attribute is CONNECTING, it must raise an INVALID_STATE_ERR exception.&lt;br /&gt;
&lt;br /&gt;
WebSocket 跟 xmlHttpRequest 一樣， 定義了 readyState 屬性，來表示現在物件正處於哪一種狀態。&lt;br /&gt;
0 : CONNECTING&lt;br /&gt;
1 : OPEN &amp;nbsp;(&lt;span class="Apple-style-span" style="color: red;"&gt;這個狀態才是「建線已建立」&lt;/span&gt;)&lt;br /&gt;
2 : CLOSING&lt;br /&gt;
3 : CLOSED&lt;br /&gt;
&lt;br /&gt;
那為什麼原本好端端的程式碼，會錯了呢? 我猜的是 hand shake 的 protocol 有改過才會這樣，因為 HTML 5 還算是個 &amp;nbsp;draft，常常改也是正常的吧，而剛好我看到&amp;nbsp;&lt;a href="http://blog.chromium.org/2010/06/websocket-protocol-updated.html"&gt;Chromium Blog 這篇文章&lt;/a&gt;提到 Chrome 原本對 Web Socket 的實作是 base on &lt;a href="http://www.google.com.tw/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=draft-hixie-thewebsocketprotocol-75"&gt;draft-hixie-thewebsocketprotocol-75&lt;/a&gt;，而長期經過社群朋友們的討論及建議，後來更新成了 &amp;nbsp;draft-ietf-hybi-thewebsocketprotocol-00 &amp;nbsp;( &lt;a href="http://www.google.com.tw/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=draft-hixie-thewebsocketprotocol-76"&gt;draft-hixie-thewebsocketprotocol-76&lt;/a&gt; )，至於一些規範細節有興趣的可以看看&lt;a href="http://blog.chromium.org/2010/06/websocket-protocol-updated.html"&gt;Chromium Blo這篇文章&lt;/a&gt;，我是沒什麼興趣，也懶得看。&lt;br /&gt;
&lt;br /&gt;
而 Web Socket 及 Socket Server 之間是怎麼做 hand shake的呢?&lt;br /&gt;
當你執行 new WebSocket("ws://localhost:7788/handsomejen");&lt;br /&gt;
client (Chrome) 會丟一個 http GET Request 到 Server ，readyState 會是 0 ( CONNECTING )，而那個 http GET Request 長這樣：&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://2.bp.blogspot.com/-eke2cHEgjgk/TkOHhg0Z1OI/AAAAAAAABgY/NcPrR1yNjxQ/s1600/websocket-r1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-eke2cHEgjgk/TkOHhg0Z1OI/AAAAAAAABgY/NcPrR1yNjxQ/s1600/websocket-r1.jpg" /&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;
你會看到最重要的2個 header &amp;nbsp;就是&lt;span class="Apple-style-span" style="color: #6fa8dc;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Connection: Upgrade&lt;/b&gt;&lt;/span&gt; 及 &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Upgrade: WebSocket&lt;/b&gt;&lt;/span&gt;。(&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.42"&gt;HTTP 1.1 中規範的 upgrade header&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
Connection: Upgrade =&amp;gt; 用來告訴 Server 這個連線需要 upgrade。&lt;br /&gt;
Upgrade: WebSocket =&amp;gt; 用來告訴 Server 要把這個連線 Upgrade 成 Web Socket。&lt;br /&gt;
&lt;br /&gt;
上面這些 header 在前一個版本就有了，而會造成原本的 Server 無法 handshake 成功的元兇就是圖中 Response 區段所看到的 &lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;(Challenge Response)&lt;/b&gt;&lt;/span&gt;，這個也就是 W3C 為了增加 Web Socket 安全性所定的新規範，而原本的 WebSocket-Location、WebSocket-Origin...也都加上了 「&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Sec-&lt;/b&gt;&lt;/span&gt; 」等前置詞，跟舊的 protocol 不一樣，這就是一直無法 Hand Shake成功的原因。&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/-BrrconiGSM4/TkODo8n8KaI/AAAAAAAABgQ/ug8UszvwEZQ/s1600/websocket-new.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-BrrconiGSM4/TkODo8n8KaI/AAAAAAAABgQ/ug8UszvwEZQ/s1600/websocket-new.jpg" /&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;
而不知道Challenge Response怎麼產生的是要怎麼寫 Server，所以就去啃一下&lt;a href="http://www.whatwg.org/specs/web-socket-protocol/"&gt;文件&lt;/a&gt;，ctrl-f 找「Server-side requirements」關鍵字，文件寫的非常清楚。&lt;a href="http://en.wikipedia.org/wiki/Challenge-response_authentication"&gt;Challenge Response&lt;/a&gt; 的產生方式如下：&lt;br /&gt;
&lt;br /&gt;
首先你會從 Client 收到 下面這 3個 header：&lt;br /&gt;
Key_1 = Sec-WebSocket-Key1.&lt;br /&gt;
Key_2 = Sec-WebSocket-Key2.&lt;br /&gt;
Key_3 = 8 bit data in the end of request.&lt;br /&gt;
&lt;br /&gt;
第 1 步：&lt;br /&gt;
key-number-1 : 拿 Key_1 所有數字組合而成。&lt;br /&gt;
key-number-2 : 拿 Key_2 所有數字組合而成。&lt;br /&gt;
&lt;br /&gt;
第 2 步：&lt;br /&gt;
spaces_1 : key_1 空白符號的數量。&lt;br /&gt;
spaces_2 : key_2 空白符號的數量。&lt;br /&gt;
&lt;br /&gt;
第 3 步：&lt;br /&gt;
part_1 = &amp;nbsp;key-number-1 / spaces_1&lt;br /&gt;
part_2 = key-number-2 / spaces_2&lt;br /&gt;
&lt;br /&gt;
接著就是拿 part_1 、 part_2 及 原本的 Key_3 來做處理。&lt;br /&gt;
&lt;br /&gt;
challenge : &amp;nbsp;把 part_1 、part_2 、 key_3 轉成一個 big-endian byte 陣列，並串聯起來。&lt;br /&gt;
response : 最後把 challenge MD5 起來，就是要回應的 Challenge Response。&lt;br /&gt;
&lt;br /&gt;
實作的 C# Code 如下，&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;private static byte[] GetChallengeResponse(string secKey1, string secKey2, byte[] secKey3)
{
    Regex rgxUnInt = new Regex("[^0-9]");

    //把空白去除,把所有數字提出來
    Int64 iK1 = Int64.Parse(rgxUnInt.Replace(secKey1, string.Empty));
    Int64 iK2 = Int64.Parse(rgxUnInt.Replace(secKey2, string.Empty));

    //  (提出來的數字/空白數量)
    int k1Spaces = secKey1.Count(c =&amp;gt; c == ' ');
    int k2Spaces = secKey2.Count(c =&amp;gt; c == ' ');
    int k1FinalNum = (int)(iK1 / k1Spaces);
    int k2FinalNum = (int)(iK2 / k2Spaces);

    //文件中提到 「 expressed as a big-endian unsigned 32-bit integer」,
    //陣例是排法是 little-endian, 所以要 Reverse().
    byte[] bKey1 = BitConverter.GetBytes(k1FinalNum).Reverse().ToArray();
    byte[] bKey2 = BitConverter.GetBytes(k2FinalNum).Reverse().ToArray();
    byte[] bKey3 = secKey3;

    //concatenation of all.
    List&amp;lt;byte&amp;gt; listChallenge = new List&amp;lt;byte&amp;gt;();
    listChallenge.AddRange(bKey1);
    listChallenge.AddRange(bKey2);
    listChallenge.AddRange(bKey3);
    
    //把 Challenge MD5
    byte[] response = MD5.Create().ComputeHash(listChallenge.ToArray());
    return response;
}&lt;/pre&gt;&lt;br /&gt;
最後寫一個 console ，拿剛剛 hand shake 成功的記錄(上面的圖)來測試，再來比對一下結果。&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;string sKey1 = "&amp;lt;oz&amp;amp;ragl10 9=""&amp;gt;761 8  4 95";  
//同上方圖中的Sec-WebSocket-Key1

string sKey2 = "28v  355mP42 =_  360m"; 
//同上方圖中的Sec-WebSocket-Key2

byte[] sKey3 = new byte[] { 0xC9,0xB6,0xCF,0x38,0xBA,0x27,0x6E,0x45 }; 
//同上方圖中的 (Key3)

byte[] challengeResponse = GetChallengeResponse(sKey1, sKey2, sKey3);

string stra = BitConverter.ToString(challengeResponse);

Console.WriteLine(stra);

&lt;/pre&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-nVhDvtq0Tns/TkN80jJFoBI/AAAAAAAABf4/grpWYVaUajU/s1600/testing_result.jpg" 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/-nVhDvtq0Tns/TkN80jJFoBI/AAAAAAAABf4/grpWYVaUajU/s1600/testing_result.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-nVhDvtq0Tns/TkN80jJFoBI/AAAAAAAABf4/grpWYVaUajU/s1600/testing_result.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;比對結果是一樣的。&lt;br /&gt;
&lt;br /&gt;
把這個修改到 Web Socket Server &amp;nbsp;就可以 hand shake 成功了。不過，可能過幾個月這個 protocol 又會被更新。&lt;br /&gt;
&lt;br /&gt;
但目前 Web Socket 並不廣泛被應用，有興趣的再看看就好。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-GAytH0KzRvM/TkOKvmYFHSI/AAAAAAAABgg/klTwmSIWQdk/s1600/2011-08-11_144414.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://2.bp.blogspot.com/-GAytH0KzRvM/TkOKvmYFHSI/AAAAAAAABgg/klTwmSIWQdk/s640/2011-08-11_144414.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
(各家 Browser 對 Web Socket 的支援度, 來源 :&amp;nbsp;&lt;a href="http://caniuse.com/#search=web socket"&gt;http://caniuse.com/#search=web socket&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="background-color: white; font-family: arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;Related articles&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://people.mozilla.com/~bsterne/content-security-policy/origin-header-proposal.html"&gt;http://people.mozilla.com/~bsterne/content-security-policy/origin-header-proposal.html&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blog.makezine.com/archive/2007/08/dns-rebinding-how-an-attacker.html"&gt;http://blog.makezine.com/archive/2007/08/dns-rebinding-how-an-attacker.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-7035012830417444016?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/gKqw2bD3xco" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/7035012830417444016/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/08/html5-websocket-invalidstateerr.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/7035012830417444016?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/7035012830417444016?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/gKqw2bD3xco/html5-websocket-invalidstateerr.html" title="HTML5 - WebSocket 出現 INVALID_STATE_ERR 錯誤處理" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-r6gcANnnIcA/TkN-7XAq0FI/AAAAAAAABgA/84b1SMsLskE/s72-c/error.jpg" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>234台灣新北市永和區</georss:featurename><georss:point>25.0083253 121.51701660000003</georss:point><georss:box>24.9940913 121.49697710000004 25.022559299999998 121.53705610000003</georss:box><feedburner:origLink>http://leehom59.blogspot.com/2011/08/html5-websocket-invalidstateerr.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEFQnk-eip7ImA9WhdSE0U.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-5299677749217481846</id><published>2011-07-21T23:58:00.004+08:00</published><updated>2011-07-23T10:20:13.752+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-23T10:20:13.752+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="心得分享" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC" /><title>ASP.NET Async 非同步處理的故事</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dyb8IdDGfz6uAIxEhS9wLeYI4Cs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dyb8IdDGfz6uAIxEhS9wLeYI4Cs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dyb8IdDGfz6uAIxEhS9wLeYI4Cs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dyb8IdDGfz6uAIxEhS9wLeYI4Cs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;這個案例是這樣的，我有一個 action，裏面循序處理了3個 remote procedure call，其中1個是Call Bing 的 Web Service，其他2個都是內部 Rest-Like Web Service，都是分散於其他主機的，照一般循序處理的方式，會得到以下結果：&lt;br /&gt;
cost = t(Bing Serv) + t(apacheServ) + t(Search Serv)&lt;br /&gt;
如果使用非同步的作法，會得到以下結果。&lt;br /&gt;
cost = max( t(BingServ) , max( t(apacheServ) , &amp;nbsp;t(SearchServ) ) )&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;註：&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;t() : 時間&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;max() : 最大值&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;cost : 總花費時間&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;BingServ : Bing Web Service&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;apacheServ : apache Web Service&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;SearchServ : play search Web Service&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
其實概念非常簡單，公司丟了3個案子叫小賴一天完成，小賴1天就依序把3個案子幹完了，但結果很慘，小賴的肝爆了，因為肝爆了，沒得操了，公司就解雇了小賴(fire!!)，從此過著什麼樣的生活，我們也不想知道.......後來公司找到了小林，也一次丟了3個案子給小林要他一天做完，小林不想自已做，他把3個案子分出去給手下做，也因為3個案子之間沒有任何關係，所以就同時進行著，小林就一個人跑去樓下枯滴買大杯文山菁茶少冰不加糖，老闆娘看小林可愛還加送珍珠，加量不加價。結果，其中2個案子中午就完成了，而另外一個到下午2點也完成了，小林就馬上去跟公司報告，我完成了3個專案! bravo!&lt;br /&gt;
&lt;br /&gt;
話說回來為什麼要這樣做? 值得嗎?&lt;br /&gt;
&lt;br /&gt;
非同步的做法在 Web ap 開發裏，不是很常用得，很多時候是根本沒必要做。那從這個案例來看，這 3 個 Task 是會造成所謂的 I/O bound (也就是CPU效能會比較好)，簡單說就是不會有太多複雜的 CPU 運算，大部分的時間是花在資料的傳輸及等待資料回應上(Network I/O)，而上面3個 Task 說到底就只是在做http web request ，實際運算都是分出去到其他主機，而3個task之間更沒有任何血緣關係，不需要等誰的結果出來才能繼續執行，如果讓3 個 Task 「幾乎」同時「開始」執行任務就可節省很多等待的時間。&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://1.bp.blogspot.com/-svhWz419mRQ/TigzAXHnmSI/AAAAAAAABcY/CwavwF2bZkU/s1600/2011-07-21_180253.jpg" 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/-svhWz419mRQ/TigzAXHnmSI/AAAAAAAABcY/CwavwF2bZkU/s1600/2011-07-21_180253.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;我們可以看到Worker Thread被連續的3個 Task block 住。&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;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/-sH-NHS8fO18/Tig02F-X4eI/AAAAAAAABcg/H3jCK76bgYc/s1600/2011-07-21_180240.jpg" 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/-sH-NHS8fO18/Tig02F-X4eI/AAAAAAAABcg/H3jCK76bgYc/s1600/2011-07-21_180240.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;由Worker Thread產生3個 Child Thread 分別處理3個Task&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;
而Worker Thread的定位大概是這樣的，.Net Framework 管理著一個 Threads pool，每當有一個 Request 進來時，就會有一個Worker Thread 被叫去處理，當request 多過 Worker thread之後，就會被queue住，被queue住的數量如果再超過預設的限制，iis 就會回應 503給 client，而這些數量的設定都放在.Net Framework 的 machine.config裏面的processModel區段，有興趣再去&lt;a href="http://msdn.microsoft.com/en-us/library/7w2sway1(vs.80).aspx"&gt;看看吧&lt;/a&gt;，我是沒什麼興趣。&lt;br /&gt;
&lt;br /&gt;
那在 ASP.NET MVC 的專案中怎麼做到呢? MVC Framework 有提供 AsyncController &amp;nbsp;可以輕易達到非同步呼叫的實作，實作方法 &lt;a href="http://www.google.com.tw/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=async+controller"&gt;google 一下就有了&lt;/a&gt;，所以今天就沒有要討論這東西，還有別的方式可以達到一樣的效果。(其實 MVC Framework也是用同樣的 Pattern 去實作)&lt;br /&gt;
&lt;br /&gt;
假設我們有一個 hbaseService類別，是 call 遠端 hbase 的 web service，你要給一個關鍵字，然後讓它去搜尋，它長得像這樣：&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;public class hbaseService
{
    public string query { get; set; }
    public hbaseService(string _query)
    {
        this.query = _query;
    }
        
    //do remoting work
    public string Search()
    {
        //do searching....and return 
        return "hbase search result...";
    }
}
&lt;/pre&gt;在Controller我們可能會這樣使用它：&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;public class SearchController : Controller
{
    // GET: /Search/Sync
    public ActionResult Sync(string query)
    {
        hbaseService hbs = new hbaseService(query);
        string result = hbs.Search();
        return View(result);
    }
}
&lt;/pre&gt;&lt;br /&gt;
上面所有的處理都跑在 Worker Thread 裏面，如果只有一個 RPC 根本沒差，今天有 3 個 RPC 那可就有差了，那要如何無痛(這裏的無痛指的是不用改動原本的程式)的讓3 RPC Task 不會 Block 住 Worker Thread 呢? &amp;nbsp;首先幫hbaseService建立一個 AsyncRunner：&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;public class AsyncRunner
{
    //用來處理 call back 的 hander
    public delegate void hbaseHandler(object sender,string args);
    public event hbaseHandler SearchComplete;

    private hbaseService _s;
    public AsyncRunner(hbaseService s)
    {
        _s = s;
    }
    public void AsyncSearch()
    {
        Thread oThread = new Thread(new ThreadStart(this.run));
        oThread.Start();
    }
    private void run()
    {
        string _result = _s.Search();
        SearchComplete.Invoke(this, _result);
    }
}
&lt;/pre&gt;&lt;br /&gt;
到目前為止，我們都沒有動到原本就寫好的 hbaseService 對吧，接著在 Controller 這樣用它：&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;public class SearchController : Controller
{
    //用在計算有幾用 child thread 被產生,
    //跟AsyncManager.OutstandingOperations.Increment(3)一樣功用
    public int threadCount = 1;
    public object lock_obj = new object();

    // GET: /Search/Async
    public ActionResult Async(string query)
    {
        hbaseService hbs = new hbaseService(query);
        AsyncRunner asyncRunner = new AsyncRunner(hbs);
        asyncRunner.SearchComplete += (sender, args) =&amp;gt; {
            //可能有多執行緒同步的問題
            lock (lock_obj)
            {
               ViewData["result"] = args;
            }
            threadCount--;
        };
        asyncRunner.AsyncSearch();
        while (threadCount != 0)
        {
            // Worker Thread do something
            Thread.Sleep(100);
        }
        return View();
    }
}&lt;/pre&gt;&lt;br /&gt;
這樣就算多個 RPC Task 也不會 Block 住 Main Thread 了，是不是呢? 其實就只是把寫桌面應用程式的觀念搬到 Web ，也沒什麼特別的，又是一篇灌水文。&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/6821770336424218668-5299677749217481846?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/C3KQQH98fSc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/5299677749217481846/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/07/aspnet-async.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/5299677749217481846?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/5299677749217481846?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/C3KQQH98fSc/aspnet-async.html" title="ASP.NET Async 非同步處理的故事" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-svhWz419mRQ/TigzAXHnmSI/AAAAAAAABcY/CwavwF2bZkU/s72-c/2011-07-21_180253.jpg" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>234台灣新北市永和區</georss:featurename><georss:point>25.0083253 121.51701660000003</georss:point><georss:box>24.9940913 121.49697710000004 25.022559299999998 121.53705610000003</georss:box><feedburner:origLink>http://leehom59.blogspot.com/2011/07/aspnet-async.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcFSHo8fip7ImA9WhdTE0w.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-8598529775950389958</id><published>2011-07-10T23:19:00.002+08:00</published><updated>2011-07-11T01:13:39.476+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-11T01:13:39.476+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="心得分享" /><title>淺談 Google Plus</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FaGaX80j_d9EhjLL8jS_BPUNQbY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FaGaX80j_d9EhjLL8jS_BPUNQbY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FaGaX80j_d9EhjLL8jS_BPUNQbY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FaGaX80j_d9EhjLL8jS_BPUNQbY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;還記得前去年1月寫了一篇 &lt;a href="http://leehom59.blogspot.com/2010/01/google-wave_12.html"&gt;殺手迷思 - 淺談Google Wave&lt;/a&gt;，自以為的談談 Google Wave 的各種可能性，過沒多久，Google Wave 就宣告失敗。今年夏天， Google 又推出了殺手級的產品，Google +，也跟當時 Google Wave 的景況一樣，未演先轟動，封測沒多久，就有人寫好Chrome Notification 外掛，網路上也出現很多 Google + 及 Facebook 的Kuso圖片及動畫，熱度真的是比中午的太陽還熱，誰受得了，刺刺的啊小賴。也要恭禧一下 Taiwan Taipei拿下google + 使用量第一名，實在是台灣之光啊。(Taiwan Taipei &amp;amp; Google 的新聞最近還真不少)&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.techbang.com.tw/posts/6314-google-of-the-worlds-most-crazy-country-taiwan-and-taiwan?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+techbang+%28T%E5%AE%A2%E9%82%A6+%E6%9C%80%E6%96%B0%E6%96%87%E7%AB%A0%29"&gt;全世界最瘋Google + 的國家是台灣，台北拿下城市第一名&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://trends.google.com/trends?q=google%2B&amp;amp;ctab=0&amp;amp;geo=all&amp;amp;date=mtd&amp;amp;sort=0"&gt;Google trends&lt;/a&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/-Sax74HxldE0/Thm86TCInTI/AAAAAAAABXY/MNEzup4eS-I/s1600/google-plus-google-apps.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="345" src="http://2.bp.blogspot.com/-Sax74HxldE0/Thm86TCInTI/AAAAAAAABXY/MNEzup4eS-I/s640/google-plus-google-apps.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
武林至尊寶刀屠龍，倚天不出誰舉爭鋒(老派)，想當然，首當其衝的就是擁有7億會員的 統治者Facebook，短期內不太可能有太大的影響，我認為 Google + 要打敗 Facebook 還言之過早，能平起平坐就很了不起了。而身為一個 Web Developer，永遠要考慮到那些很難被考慮到的人。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;iPhone 在 PwnToOwn 駭客大賽中，成為唯一被破解的行動裝置，銷量有因此變差嗎，你說不安全，who care?&lt;/li&gt;
&lt;li&gt;你說Google服務很棒，我在教會服事敬拜團的夥伴中，只有我一個擁有google帳號並且使用它，常用Email傳歌檔(試聽而以啦)，常有人漏信，我說 gmail 很好用，who care?&lt;/li&gt;
&lt;/ul&gt;7億的會員是重點，而這些7億的會員是由世界上各種組群組合而成的，有政客、演員、歌手、學生、上班族，有流氓、病患、傳道人、水電工、詐騙集團、販賣人口的.........有包含很多非從事網路工作的人，或是一些上網只是為了 Facebook，你說Google + 會打敗 Facebook? &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Google + 沒廣告，好乾淨，who care?&lt;/li&gt;
&lt;li&gt;Google + 速度好快、好流暢，who care?&lt;/li&gt;
&lt;li&gt;Google + 發言及看留言的控制性高，who care?&lt;/li&gt;
&lt;li&gt;Google +有視訊功能(facebook 也有了)，who care?&lt;/li&gt;
&lt;/ul&gt;有，當然就是我們這種網路重度使用者會 care，當 Google + 還在封測的時候，就是我們這些人會在 facebook 、plurk 上留言，「&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;誰有 Google + 帳號，快點邀請我&lt;/span&gt;&lt;/b&gt;」、「&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Yeah! 我有Google + 了，誰要加入留你的mail給我&lt;/span&gt;&lt;/b&gt;」。我在 Facebook 的好友有400多個，已經加入Google + 的人估計只有50個，但這些朋友都可以很明確的被歸類出來，都是一些從事網路工作的朋友，而這些朋友中當中，有些是第一天來嘗鮮之後，活動力就下降，少在Google +上有活動。&lt;br /&gt;
&lt;br /&gt;
或許Google + 最後的定位會變得跟現在的 Google Buzz 一樣 ?&lt;br /&gt;
&lt;br /&gt;
不過我真的不得不說我很喜歡Google Circle 社交圈的概念，可以控制你發的訊息給誰、想收到誰的訊息。它跟我們寫 Blog 文章時 Tag 的功能一樣，可以把一篇文章tag 成多種類別的文章，Google 大可以用「類別」、「Tag」來表達這樣的一個功能，但他們選擇用「社交圈」的Concept(天啊!!! 我也會用到這個廣告界常聽到名詞)，這也算是舊酒新裝，千年傳統、全新感受啦 (馬拉桑 誤)。&lt;br /&gt;
&lt;br /&gt;
再來就是Google + 的視訊，到目前為止，我最多同時跟4個人一起視訊，畫面跟聲音用人類那種自以為很準確的直覺來說，是感覺不到有任何「斷斷續續」的情況，而且其中一個朋友還是在澳洲與我們視訊，而且可以同時播放 youtube，大家一起觀看(可惜不能一起觀看pps 誤)，這也是我喜歡的功能之一，帶著筆電，隨時就可以看到想看的人，體驗還不賴。我們人啊，對於文字會越來越遲鈍，而對於影像會越來越直覺，你說一則很感人的故事，都比不過2分鐘的短片。&lt;br /&gt;
&lt;br /&gt;
說到這個，我前一陣子參加&lt;a href="http://www.youtube.com/watch?v=XnuAyFCZjdA"&gt;Nick&lt;/a&gt;福音場的演說，他開場前播放了&lt;a href="http://www.youtube.com/watch?v=XnuAyFCZjdA"&gt;1部影片&lt;/a&gt;，我當下流了幾滴男兒淚，心想今天來對地方了，我希望他的演說，能給我一些衝擊，能獲得一些特別的感受，但到最後聽完他的演說，實在是有點小失望，都不來的比影片感人，或許這當中還有其他因素，但我想說的是「影像、音樂」，已經是現今「表達、傳達」的重要的手法之一了。&lt;br /&gt;
&lt;br /&gt;
不管 Google + 在網路上到最後演變成為什麼樣的角色，最後得利的都會是我們這些使用者，也不用太在意市場上對於這樣的新產品所產生的正面、負面評價有哪些，Just enjoy ! 其他的就...一起搬沙發、買爆米花，看戲囉。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
【Google + 懶人包】&lt;br /&gt;
&lt;a href="http://www.techbang.com.tw/posts/6300-the-transfer-to-google-facebook-friends-quick-cheats?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+techbang+%28T%E5%AE%A2%E9%82%A6+%E6%9C%80%E6%96%B0%E6%96%87%E7%AB%A0%29"&gt;把Facebook朋友轉移到Google + 的快速密技&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.techbang.com.tw/posts/6217-facebook-smart-play-21-strokes?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+techbang+%28T%E5%AE%A2%E9%82%A6+%E6%9C%80%E6%96%B0%E6%96%87%E7%AB%A0%29"&gt;Facebook 聰明玩法+高手密技 21招大集合&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.techbang.com.tw/posts/6308-google-facebook-photo-to-move-to-the-rapid-cheats"&gt;把Facebook照片搬到Google + 的快速秘技&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.techbang.com.tw/posts/6307-google-use-cheat?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+techbang+%28T%E5%AE%A2%E9%82%A6+%E6%9C%80%E6%96%B0%E6%96%87%E7%AB%A0%29"&gt;Google+必用操作密技，24招讓你變高手&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.circlehack.com/"&gt;Circle Hack&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.techbang.com.tw/posts/6363-google-facebook-a-key-to-fit-the-google-see-fb-graffiti-wall?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+techbang+%28T%E5%AE%A2%E9%82%A6+%E6%9C%80%E6%96%B0%E6%96%87%E7%AB%A0%29"&gt;Google+Facebook，一鍵合體在Google+看FB塗鴉&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://plus.google.com/100130433723604583638"&gt;我的 Google +&lt;/a&gt;&lt;br /&gt;
&lt;br /&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/6821770336424218668-8598529775950389958?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/y0TI_q8crSE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/8598529775950389958/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/07/1-google-wave-google-wave-google-wave.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/8598529775950389958?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/8598529775950389958?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/y0TI_q8crSE/1-google-wave-google-wave-google-wave.html" title="淺談 Google Plus" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Sax74HxldE0/Thm86TCInTI/AAAAAAAABXY/MNEzup4eS-I/s72-c/google-plus-google-apps.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/07/1-google-wave-google-wave-google-wave.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08FQXs8cCp7ImA9WhdTE0w.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-3358907767291935506</id><published>2011-06-27T21:59:00.007+08:00</published><updated>2011-07-11T01:43:30.578+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-11T01:43:30.578+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><title>JavaScript 你知多少 - 事件觸發與綁定</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Xlwekm-IdLhY2jTBw-tN3eKObiY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xlwekm-IdLhY2jTBw-tN3eKObiY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Xlwekm-IdLhY2jTBw-tN3eKObiY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Xlwekm-IdLhY2jTBw-tN3eKObiY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;JavaScript 真的是門很深奧的技術，身個一個不稱職的Web Developer，JavaScript 用很多次，也很常接觸，但都只是皮毛，尤其在jQuery氾濫的年代裏，有很多人寫得出很多優秀的特效，但JavaScript 卻不熟，就像Linq To SQL 很熟，但要你下SQL就 死光光的道理一樣。&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/-17-Fh6703TQ/TgiKFv4ou1I/AAAAAAAABOE/QTPESkbEQ0g/s1600/400px-WikiBookTitel_JavaScript.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-17-Fh6703TQ/TgiKFv4ou1I/AAAAAAAABOE/QTPESkbEQ0g/s1600/400px-WikiBookTitel_JavaScript.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
最近在寫 Java Script 發現一個很有趣的現象，this 是一個很有趣的物件，看看以下的html&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-jUkDHWqskks/TgiLsiHy5LI/AAAAAAAABOM/Cj9l6-Cd7zg/s1600/2011-06-27_215447.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="276" src="http://3.bp.blogspot.com/-jUkDHWqskks/TgiLsiHy5LI/AAAAAAAABOM/Cj9l6-Cd7zg/s640/2011-06-27_215447.png" width="640" /&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;
btn_a 出現的是「[object Window]」。&lt;br /&gt;
&lt;br /&gt;
btn_b 出現的是「[object HTMLInputElement]」。&lt;br /&gt;
&lt;br /&gt;
也就是說使用 onclick="func()" 這個方法綁定事件的話，都是由window 來 觸發，而動態綁定的話就是由該dom 物件來觸發。&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://jsfiddle.net/4V9AF/36/embedded/" style="height: 200px; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;a href="http://jsfiddle.net/4V9AF/37/"&gt;http://jsfiddle.net/4V9AF/37/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-3358907767291935506?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/u8bROQpJ4u0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/3358907767291935506/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/06/javascript.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/3358907767291935506?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/3358907767291935506?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/u8bROQpJ4u0/javascript.html" title="JavaScript 你知多少 - 事件觸發與綁定" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-17-Fh6703TQ/TgiKFv4ou1I/AAAAAAAABOE/QTPESkbEQ0g/s72-c/400px-WikiBookTitel_JavaScript.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/06/javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AFRXc-fyp7ImA9WhdTE0w.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-5208197706711431402</id><published>2011-06-05T22:49:00.005+08:00</published><updated>2011-07-11T01:41:54.957+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-11T01:41:54.957+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="心得分享" /><title>OS重灌之軟體SOP - Windows 7 版</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9VAoUPdxdGM-F458rX4TpW1y4sQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9VAoUPdxdGM-F458rX4TpW1y4sQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9VAoUPdxdGM-F458rX4TpW1y4sQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9VAoUPdxdGM-F458rX4TpW1y4sQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;我們在使用M$ 的OS一段時間後就會想重灌，把該備份的設定檔backup起來之後，就可以拿起手邊個人用(是嗎?)的正版Windows OS 光碟(是嗎?)，開始Windows重灌之旅，就在今天下午給他想到，就重灌一下我平日Windows的工作機，再來Blog灌灌垃圾文章。&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
【基本款】&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Browser&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Chrome : 最愛的Browser。&lt;/li&gt;
&lt;li&gt;FireFox : 基本上是用來測試用的，一般我不會使用它。&lt;/li&gt;
&lt;li&gt;IE : 用來下載Chrome的好幫手。&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;7-Zip &lt;/li&gt;
&lt;li&gt;Notepad ++&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.faststone.org/FSCaptureDetail.htm"&gt;FSCapture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ntu.csie.org/~piaip/pietty/"&gt;Pietty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BlackBox&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Alcohol&lt;/li&gt;
&lt;li&gt;VM WorkStation&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;【開發工具】&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Visaul Studio 2010&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://nuget.codeplex.com/"&gt;NuGet&amp;nbsp;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=75568aa6-8107-475d-948a-ef22627e57a5"&gt;SP 1&amp;nbsp;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Eclipse 3.5&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;Google App Engine SDK For Java&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;Android SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.playframework.org/"&gt;Play Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Java Runtime &amp;amp; SDK&lt;/li&gt;
&lt;li&gt;SQL&amp;nbsp;Management 2008&lt;/li&gt;
&lt;li&gt;Oracle SQL Developer&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.powergui.org/downloads.jspa"&gt;Power Shell GUI&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&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;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;粽子節愉快&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Z2Oiyt-iA14/TeuYdIpBqCI/AAAAAAAABN4/H-6liWkEkPw/s1600/Windows7.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://4.bp.blogspot.com/-Z2Oiyt-iA14/TeuYdIpBqCI/AAAAAAAABN4/H-6liWkEkPw/s640/Windows7.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-Z2Oiyt-iA14/TeuYdIpBqCI/AAAAAAAABN4/H-6liWkEkPw/s1600/Windows7.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;好乾淨，來SnapShut&lt;/a&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-Z2Oiyt-iA14/TeuYdIpBqCI/AAAAAAAABN4/H-6liWkEkPw/s1600/Windows7.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;
&lt;/a&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 class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-5208197706711431402?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/l7q8TgHJ360" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/5208197706711431402/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/06/ossop-windows-7.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/5208197706711431402?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/5208197706711431402?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/l7q8TgHJ360/ossop-windows-7.html" title="OS重灌之軟體SOP - Windows 7 版" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Z2Oiyt-iA14/TeuYdIpBqCI/AAAAAAAABN4/H-6liWkEkPw/s72-c/Windows7.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/06/ossop-windows-7.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFQH0zfip7ImA9WhdWFEw.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-3651300935636574316</id><published>2011-05-21T13:04:00.006+08:00</published><updated>2011-09-07T23:41:51.386+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-07T23:41:51.386+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Oracle" /><category scheme="http://www.blogger.com/atom/ns#" term="EntityFramework" /><title>Entity Framework學習筆記(二)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hkeHTsEhx-qCXYbAS9--AgPJ1zE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hkeHTsEhx-qCXYbAS9--AgPJ1zE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hkeHTsEhx-qCXYbAS9--AgPJ1zE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hkeHTsEhx-qCXYbAS9--AgPJ1zE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-NB_6Qq26s-g/TdjvhqF00vI/AAAAAAAABMQ/6Wf3MI4RVNA/s1600/EF+image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-NB_6Qq26s-g/TdjvhqF00vI/AAAAAAAABMQ/6Wf3MI4RVNA/s1600/EF+image.png" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/-1KjNTb3FMXc/TdjvjtwgH7I/AAAAAAAABMc/_gFnrXdEPJo/s1600/oracle+image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-1KjNTb3FMXc/TdjvjtwgH7I/AAAAAAAABMc/_gFnrXdEPJo/s1600/oracle+image.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
最近有很多心得想寫，但又不知從何寫起，然而半個月沒文章真的還蠻對不起自已，再怎樣都要喇個一篇出來。最近還翻到去年2月，前公司幫我&lt;a href="http://mib.moker.com.tw/main/article.php?id=000450225009&amp;amp;maga_id=00045&amp;amp;vol=0225"&gt;投稿adm的文章&lt;/a&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;a href="http://2.bp.blogspot.com/-IKsfPJTIECE/Tdaa3F_huiI/AAAAAAAABMI/-BHDLRqJLa8/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-21+%25E4%25B8%258A%25E5%258D%258812.45.57.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="338" src="http://2.bp.blogspot.com/-IKsfPJTIECE/Tdaa3F_huiI/AAAAAAAABMI/-BHDLRqJLa8/s400/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-21+%25E4%25B8%258A%25E5%258D%258812.45.57.png" width="400" /&gt;&lt;/a&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&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;
【oracle 與 ef 的bug】&lt;/div&gt;
&lt;div&gt;
Entity Framework的edmx檔案會包含以下三個XML的Section，而經過編譯之後，會產生3個ssdl , csdl , msl 檔案，而主要的解釋如下：&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
SSDL：定義資料庫物件的Schema。&lt;/div&gt;
&lt;div&gt;
CSDL：定義概念性的資料模型，可以把這個看成Model Class。&lt;/div&gt;
&lt;div&gt;
MSL：SSDL 及 CSDL 之間的對應。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
而我最近是用EF與Oracle 做整合，一來我對Oracle不熟，還遇到蠻多小問題的，只好去天瓏朝聖，敗一本Oracle DBA的書，好好瞭解一下整個Oracle架構，表達尊敬之意。講到這個，我就想講，學習一個新的不管是技術還是工具(Oracle對我來說就是工具)，最好是從頭開始瞭解，不要只是看看網路上的sample，做過幾遍，就認為會了、熟了，你可以看輕自已，但不要看輕任何一門技術，好好的買本書來看，至少表現出該有的尊重，相信它也會給予要入門的你最大的空間及方便，就像一夜情是不會有什麼好結果的(誤)。&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
【bug】&lt;/div&gt;
&lt;div&gt;
Entity Framework與Oracle Table物件是有個小Bug，熟Oracle的人都知道，要設定Table Auto_increment 的主鍵須透過 sequence 及 trigger 互相搭配，不像MS Sql，只要設定主鍵的屬性即可，而Entity Framework的bug 就是當 Insert 一個Entity Framework的物件到Oracle去的時候，主鍵的值並不會馬上更新到Entity Framework的物件中主鍵屬性的值，這是因為透過visaul studio 工具產生edmx檔的時候，SSDL並沒有完全正確的產生，只要修改一個屬性，告訴Entity Framework這個是主鍵，在新刪、修改時要特別去更新它。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
SSDL 主鍵的屬性&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;StoreGeneratedPattern&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;None&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;Computed&lt;/span&gt; : 在新增、修改的時候會更新物件所有的屬性。&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;Identity&lt;/span&gt;：只有在新增的時候會更新物件的所有的屬性。&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
用工具產生的SSDL並不會自動產生這個屬性，所以要手動設定。&lt;/div&gt;
&lt;br /&gt;
我本來是放棄去解這個問題，也跟同事討論出替代方案，就是用guid檔主鍵值，心裏總覺得不踏實，但更讓我覺得不踏實的是，我對Entity Framework 的架構及原理完全不瞭解，只會靠者工具產生檔案，所以我開了MSDN，從頭K到尾，從edmx檔案組成、life time. ..等等都看過一遍，當我瞭解 SSDL、CSDL及MSL是幹嘛用的時候，這個問題就輕鬆的解決了，所以你說讀書重要不要，書到用時方恨少，有讀有保佑，平常要多讀一些MSDN，這個問題也不會卡了，所以真的不要只會看網路的Sample Code，共勉之~&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://leehom59.blogspot.com/2010/09/entity-framework.html"&gt;Entity Framework 學習筆記(一)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;2011/09/07 更新：&lt;/b&gt;&lt;/span&gt;&lt;a href="http://support.microsoft.com/kb/2561001/en-us"&gt;StoreGeneratedPatter 無法從設計模式被更正的 bug 修正。&lt;/a&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-3651300935636574316?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/R9mdlIxHkSA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/3651300935636574316/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/05/entity-framework.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/3651300935636574316?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/3651300935636574316?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/R9mdlIxHkSA/entity-framework.html" title="Entity Framework學習筆記(二)" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-NB_6Qq26s-g/TdjvhqF00vI/AAAAAAAABMQ/6Wf3MI4RVNA/s72-c/EF+image.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/05/entity-framework.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQMRXc-fSp7ImA9WhZXE0k.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-7705655117853303320</id><published>2011-05-02T20:32:00.006+08:00</published><updated>2011-05-02T20:46:24.955+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-02T20:46:24.955+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Play Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="facebook" /><title>簡單的擴充restfb取得access token 流程</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jyJAJncoNd0vgTAdX2_qp95lf-8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jyJAJncoNd0vgTAdX2_qp95lf-8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jyJAJncoNd0vgTAdX2_qp95lf-8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jyJAJncoNd0vgTAdX2_qp95lf-8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;(貼心提醒：在閱讀之前，最好先瞭解 facebook graph api &lt;a href="http://developers.facebook.com/docs/authentication/"&gt;認證與授權&lt;/a&gt;的原理喔)&lt;br /&gt;
&lt;br /&gt;
Play framework也有整合了與 facebook graph api溝通的module，名稱叫做 &lt;a href="http://www.playframework.org/modules/fbgraph-0.1/home"&gt;fbgraph&lt;/a&gt;，有分 0.1版及0.2版，而這個module主要是整合一個叫做「&lt;a href="http://restfb.com/"&gt;restfb&lt;/a&gt;」的套件，而我在一開始在使用restfb的時候，發現他並沒有把取得access token的流程整合進來，所以這個部分要自行處理，像C# facebook API 就有包含這部分。&lt;br /&gt;
而以下是在 Play Framework 使用 fbgraph的流程。&lt;br /&gt;
&lt;br /&gt;
1. Play Install fbgraph-0.2&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-FkDBpvUhG_k/Tb6Yyub21lI/AAAAAAAABLA/nTaWJVTzT5c/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-02+%25E4%25B8%258B%25E5%258D%25887.23.41.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://2.bp.blogspot.com/-FkDBpvUhG_k/Tb6Yyub21lI/AAAAAAAABLA/nTaWJVTzT5c/s320/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-02+%25E4%25B8%258B%25E5%258D%25887.23.41.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;2.設定application.conf ,&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 12px;"&gt;&lt;span class="s1"&gt;module.fbgraph&lt;/span&gt;=${play.path}/modules/fbgraph-0.2&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;3.重新產生eclipse的專案(我是用eclipse開發), import project 即可。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-KD-8O1jW4XI/Tb6YzpXToYI/AAAAAAAABLE/6qdqD_JFZAs/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-02+%25E4%25B8%258B%25E5%258D%25887.24.57.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://4.bp.blogspot.com/-KD-8O1jW4XI/Tb6YzpXToYI/AAAAAAAABLE/6qdqD_JFZAs/s320/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-02+%25E4%25B8%258B%25E5%258D%25887.24.57.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;API實際用法可以參考 : &lt;a href="http://restfb.com/"&gt;http://restfb.com/&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
而如果你看了該網站的示範之後，會發現一開始的範例就直接開始使用access_token，裏面並沒有把「取得access_token」這個部分的流程包到這個module 來，所以自已要額外的去做一些取得 access_token 流程的處理。如果這時你不太清楚facebook graph api 驗證、授權流程，需要先看&lt;a href="http://developers.facebook.com/docs/authentication/"&gt;這裏&lt;/a&gt;。&lt;br /&gt;
所以我就另外擴充了FacebookOauthClient類別，主要是用來處理「取得Access_Token」這一段流程，擴充類別如下圖：&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-0Loy1rhUff0/Tb6b-D48H3I/AAAAAAAABLQ/RxBZ1uYSNlo/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-02+%25E4%25B8%258B%25E5%258D%25887.31.14.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="71" src="http://1.bp.blogspot.com/-0Loy1rhUff0/Tb6b-D48H3I/AAAAAAAABLQ/RxBZ1uYSNlo/s200/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-02+%25E4%25B8%258B%25E5%258D%25887.31.14.png" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
介面：&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;FacebookApplication : 包含了所有appid、secretid、domain等等定義，需要類別實作。&lt;/li&gt;
&lt;/ul&gt;類別：&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;FacebookOauthClient：針對實作FacebookApplication介面的類別實體來與facebook graph api做rest溝通，用來取得login url，code以及 access token。&lt;/li&gt;
&lt;li&gt;FacebookUtils：一些參數轉換的工作。&lt;/li&gt;
&lt;/ul&gt;而實際用法如下：&lt;br /&gt;
&lt;br /&gt;
1 .定義實作FacebookApplication的類別。&lt;br /&gt;
&lt;pre class="java" name="code"&gt;public class DemoFbApp implements FacebookApplication {

 public String getAppId() {
  // TODO Auto-generated method stub
  return "app id";
 }
 public String getAppSecret() {
  // TODO Auto-generated method stub
  return "secret id";
 }
 public String getCancelUrlPath() {
  // TODO Auto-generated method stub
  return null;
 }
 public String getSiteUrl() {
  // TODO Auto-generated method stub
  return "http://localhost/";
 }
}
&lt;/pre&gt;2.在Controller用取得 facebook login url，並導向。&lt;br /&gt;
&lt;pre class="java" name="code"&gt;//自行定義的 demofbapp
protected static FacebookApplication app = new DemoFbApp();
//定義要導回來的url
protected static String RedirectUrl = "http://localhost:1112/HomeController/LogOk";
public static void Oauth()
{
 FacebookOauthClient oauthClient = new FacebookOauthClient(app);
 oauthClient.setReturnUrl(new URI(RedirectUrl));
  
 //可額外定義參數,例如防止CSRF的Status或者授權項目的scope
 //有關 授權項目的 scope 
 //請參考:http://developers.facebook.com/docs/authentication/permissions/ 
 HashMap ppp = new HashMap();
 String url = oauthClient.getLoginUri(ppp).toString();
 redirect(url);
}
&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-B_suZp6vl98/Tb6iFu08h1I/AAAAAAAABLY/fEL6dyn97k8/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-02+%25E4%25B8%258B%25E5%258D%25888.22.24.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="169" src="http://4.bp.blogspot.com/-B_suZp6vl98/Tb6iFu08h1I/AAAAAAAABLY/fEL6dyn97k8/s320/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-02+%25E4%25B8%258B%25E5%258D%25888.22.24.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;將會導向登入畫面。&lt;/div&gt;&lt;br /&gt;
3.在導回來的url中，取得 code 的參數，再拿這個code 去跟 facebook graph api 要到 access_token。&lt;br /&gt;
&lt;pre class="java" name="code"&gt;public static void LogOk(String code){
 FacebookOauthClient oauthClient = new FacebookOauthClient(app);
 oauthClient.setReturnUrl(new URI(RedirectUrl));
 HashMap ppp = new HashMap();
 ppp.put("code", code);
 String accessToken = oauthClient.getAccessToken(ppp);
 //即取得 accessToken 及 Expire ,再自行反序列化成物件即可。
 renderText(accessToken);
}
&lt;/pre&gt;&lt;br /&gt;
是的，成功取得Access Token之後，就可以開始使用restfb來使用你想要的功能了，應該算方便又容易使用的架構，enjoy it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-7705655117853303320?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/TkyKoFD2hOE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/7705655117853303320/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/05/play-frameworkfacebook-graph-api.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/7705655117853303320?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/7705655117853303320?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/TkyKoFD2hOE/play-frameworkfacebook-graph-api.html" title="簡單的擴充restfb取得access token 流程" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-FkDBpvUhG_k/Tb6Yyub21lI/AAAAAAAABLA/nTaWJVTzT5c/s72-c/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2011-05-02+%25E4%25B8%258B%25E5%258D%25887.23.41.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/05/play-frameworkfacebook-graph-api.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DQnYzfCp7ImA9WhZXE04.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-5071656467265623648</id><published>2011-04-30T01:02:00.007+08:00</published><updated>2011-05-02T19:32:53.884+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-02T19:32:53.884+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Active Directory" /><title>Active Directory , ASP.NET 整合相關文章</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eFTXPSoe0JeKKzVBwmbImYJNuw4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eFTXPSoe0JeKKzVBwmbImYJNuw4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eFTXPSoe0JeKKzVBwmbImYJNuw4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eFTXPSoe0JeKKzVBwmbImYJNuw4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;出來混的遲早都要還,就花點時間還一還。&lt;br /&gt;
&lt;br /&gt;
Wiki - AD 常識&lt;br /&gt;
&lt;a href="http://zh.wikipedia.org/wiki/Active_Directory"&gt;http://zh.wikipedia.org/wiki/Active_Directory&lt;/a&gt;&lt;br /&gt;
Wiki - ADSI&lt;br /&gt;
&lt;a href="http://zh.wikipedia.org/wiki/Active_Directory_Service_Interface"&gt;http://zh.wikipedia.org/wiki/Active_Directory_Service_Interface&lt;/a&gt;&lt;br /&gt;
原文 , C# Sample Code 簡單易懂&lt;br /&gt;
&lt;a href="http://www.codeproject.com/KB/system/everythingInAD.aspx"&gt;http://www.codeproject.com/KB/system/everythingInAD.aspx&lt;/a&gt;&lt;br /&gt;
ASP.NET 應用程式整合(一) (中文)&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/zh-tw/library/aa302397.aspx"&gt;http://msdn.microsoft.com/zh-tw/library/aa302397.aspx&lt;/a&gt;&lt;br /&gt;
ASP.NET 應用程式整合(二)&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/zh-tw/library/ms180890(VS.80).aspx"&gt;http://msdn.microsoft.com/zh-tw/library/ms180890(VS.80).aspx&lt;/a&gt;&lt;br /&gt;
Linq To Active Directory&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/zh-tw/ee853258"&gt;http://msdn.microsoft.com/zh-tw/ee853258&lt;/a&gt;&lt;br /&gt;
Active Directory Schema 屬性清單&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms675089(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms675089(VS.85).aspx&lt;/a&gt;&lt;br /&gt;
Active Directory Schema 資料型別&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms684419(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/ms684419(VS.85).aspx&lt;/a&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/6821770336424218668-5071656467265623648?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/d8UxG0NpMmI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/5071656467265623648/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/04/ad.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/5071656467265623648?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/5071656467265623648?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/d8UxG0NpMmI/ad.html" title="Active Directory , ASP.NET 整合相關文章" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/04/ad.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQASHY7eyp7ImA9WhZXEUk.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-795005231341653722</id><published>2011-04-26T02:05:00.006+08:00</published><updated>2011-04-30T13:45:49.803+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T13:45:49.803+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Google App Engine" /><category scheme="http://www.blogger.com/atom/ns#" term="Play Framework" /><title>Intergrate Play Framework Into GAE(一)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DAxcQUDEj7I1JFW7dZfpocioXGY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DAxcQUDEj7I1JFW7dZfpocioXGY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DAxcQUDEj7I1JFW7dZfpocioXGY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DAxcQUDEj7I1JFW7dZfpocioXGY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://www.playframework.org/"&gt;&lt;img alt="2011-04-25_161035" border="0" height="233" src="http://lh6.ggpht.com/_Lg_bqtXQWro/TbUs5KZgoRI/AAAAAAAABKE/8xaveEz27qw/2011-04-25_161035%5B5%5D.jpg?imgmax=800" style="background-image: none; border: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="2011-04-25_161035" width="389" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
我用的是 play 1.2 , 目前最新release.&lt;br /&gt;
1.先建立 play project&lt;br /&gt;
&lt;img alt="" height="391" src="http://lh4.ggpht.com/_Lg_bqtXQWro/TbWsg0PXkJI/AAAAAAAABKQ/NKvPDWZokuI/%5BUNSET%5D.png" width="588" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.再安裝 gae、siena (如果已安裝,直接跳到 3.)&lt;br /&gt;
&lt;img alt="" height="390" src="http://lh4.ggpht.com/_Lg_bqtXQWro/TbWtJdB5pEI/AAAAAAAABKU/w7lLoJB98Us/%5BUNSET%5D.png" width="587" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" height="390" src="http://lh3.ggpht.com/_Lg_bqtXQWro/TbWtQ3N609I/AAAAAAAABKY/mZ0gXrPUYmA/%5BUNSET%5D.png" width="583" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3.設定app config , &amp;nbsp;{ application root}/conf/application.conf &lt;span style="color: #222222; font-family: arial, 'Trebuchet MS', verdana, tahoma; line-height: 14px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #222222; font-family: arial, 'Trebuchet MS', verdana, tahoma; line-height: 14px;"&gt;&lt;img alt="" height="76" src="http://lh5.ggpht.com/_Lg_bqtXQWro/TbWvEST221I/AAAAAAAABKc/BXwG2_YVpbI/%5BUNSET%5D.png" width="397" /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #222222; font-family: arial, 'Trebuchet MS', verdana, tahoma; line-height: 14px;"&gt;4.因為我是用eclipse，play framework 也有整進來，可以幫你產生eclipse 專案。&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #222222; font-family: arial, 'Trebuchet MS', verdana, tahoma; line-height: 14px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;-play eclipsify gaesample (注意:  gaesample 是專案名稱,並非資料夾名稱喔)&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;h2 style="border-width: 0px; color: #333333; font-family: georgia; font-size: 1.6em; font-weight: normal; line-height: 1.4em; margin: 0px 0px 5px; outline-width: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;"&gt;&lt;img alt="" height="393" src="http://lh4.ggpht.com/_Lg_bqtXQWro/TbWvn26TE8I/AAAAAAAABKg/J0fcftjSfjs/%5BUNSET%5D.png" width="586" /&gt;&lt;/h2&gt;&lt;br /&gt;
&lt;br /&gt;
5 .gae +  play framework on  eclips 整合完成, 超簡單的吧, play 真的很方便呢。&lt;br /&gt;
&lt;img alt="" height="393" src="http://lh5.ggpht.com/_Lg_bqtXQWro/TbWwnFAr8wI/AAAAAAAABKk/NHlvfmWbj6M/%5BUNSET%5D.png" width="586" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
為什麼要整合 play + google app eingine 呢? &amp;nbsp;一直以來我都很喜歡 google app eingine 這個免費的服務，前一陣子都是用python在寫，一直沒有用 java 來寫google app engine，直到最近常常碰到小林介紹 play framework，想到是不是可以把 play 整合在一起，查了一下官方文件，原來1.0 版的 play 就有整到google app eingine，這樣一來就算沒有主機，也可以好好來感受一下java 社群的新一代 web framework 結晶。&lt;br /&gt;
&lt;br /&gt;
那可以利用這些免費資源做些什麼呢? 搞些什麼名堂呢? 其實這些應用層的技術說真的，都不難，多看點書，看點範例，爛蘋果多吃幾顆，這些東西都難不倒你的，真的難的是，一堆技術要怎麼去整合，然後產生更多不一樣的東西，創造更多價值出來，我想 整合、創造 這是玩應用層技術最困難、也是最有趣的地方。&lt;br /&gt;
&lt;br /&gt;
1 + 1 = 2 是常識、是常態。&lt;br /&gt;
&lt;br /&gt;
1 + 1 &amp;gt; 2 是生產力，也是老闆最希望看到的。&lt;br /&gt;
&lt;br /&gt;
而一個優秀有企圖心的PG，不該因此而滿足，我們應該去看更多，想更多，因為&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="color: #e06666;"&gt;1 + 1 != 2 是創造力&lt;/span&gt;&lt;/b&gt;，&lt;br /&gt;
&lt;br /&gt;
如何讓1 + 1 != 2 呢，有讓人驚艷、意想不到的創意，PG 不該只有拿到文件，照本宣科的coding，當然不是叫你不要按照文件coding，有時候就連測試，也可以很有新創意，當然前提是你要有 1 + 1 = 2 的常識 及 1 + 1 &amp;gt; 2 的生產力，只有不斷的努力，才可能有更多新的想法，我認為這才是寫程式最好玩，也是最有趣的地方。&lt;br /&gt;
&lt;br /&gt;
今天看到一則新聞說，google 在面試新人時出的題目是：&lt;br /&gt;
&lt;br /&gt;
1.1台校車能塞進多少顆高爾夫球。&lt;br /&gt;
2.用三句話跟小孩解釋什麼是資料庫。&lt;br /&gt;
3.清洗所有西雅圖窗戶要收取多少費用。&lt;br /&gt;
&lt;br /&gt;
看就知道是沒有標準答案的問題，只是這些問題，都是用來測試你的思考模式，你的想法，很有意思吧。&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #e06666;"&gt;(後記：後來有報導指出，google的資深面試官提出，google 根本不會問這種問題，所以看看就好了)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
又扯遠了，&lt;br /&gt;
&lt;br /&gt;
最近就是用這個 solution 在幫人家寫一個簡單的社群服務功能，主機、流量暫時都不用煩惱，專注在資料模型及流程的開發，真的蠻爽的。但是假設有一天，這個社群服務功能有了流量，或者想獨立空間主機了，或者想整金流了…etc，很多情況讓它必須離開google app engine去獨立運作，「移植性」將會是一大需要考量的點，我需要時間設計及思考中間這一層的架構及移植的可能性。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-795005231341653722?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/BE1L0dlm0Pg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/795005231341653722/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/04/how-to-intergrate-play-framework-into.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/795005231341653722?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/795005231341653722?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/BE1L0dlm0Pg/how-to-intergrate-play-framework-into.html" title="Intergrate Play Framework Into GAE(一)" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_Lg_bqtXQWro/TbUs5KZgoRI/AAAAAAAABKE/8xaveEz27qw/s72-c/2011-04-25_161035%5B5%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/04/how-to-intergrate-play-framework-into.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUDRX44eyp7ImA9WhZRF0w.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-8103774968978835814</id><published>2011-04-14T00:06:00.009+08:00</published><updated>2011-04-14T00:31:14.033+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-14T00:31:14.033+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="心得分享" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>什麼是 web 開發人員【最重要的小事】</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Dp83AvJml2mhllHFT6JoLnGGinw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Dp83AvJml2mhllHFT6JoLnGGinw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Dp83AvJml2mhllHFT6JoLnGGinw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Dp83AvJml2mhllHFT6JoLnGGinw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;真他媽的是有感而發，故事是這樣的…&lt;br /&gt;
&lt;br /&gt;
有一個私底下常合作的朋友，在前一陣子某個星期二晚上，正在家看書的我(裝乖)，接到他的來電，電話那頭的他說有個很急的案子，是國內某大遊戲代理商他們外包給個人工作室的案子，後來那個程式人員做一做跑了，而專案的前後台資安檢測結果有300多個需要修改的弱點，看了一下資料庫也才幾個表格，不算大案子，怎麼一經資安軟體檢測有300多個錯誤，過3天案子就要上線，要給大老闆看，拜託我是否能幫忙改這個檢測的部分。&lt;br /&gt;
&lt;br /&gt;
首先我先看他的弱點有哪些，看完了整個程式專案，發現其實也沒有多難改，因為全部都是最基本的SQL Injection,XSS,CSRF，這些最基本該做到的弱點防範，都沒做到，雖然他是用舊式的ADO.Net做法，但從2.0開始，.Net Framework就 已經提供足的 solution 來解決這方面的問題，我很懷疑，為什麼這樣的程式設計師也敢出來個人接案? 會看一點程式，會複製貼上，就要出來跟人家混飯吃，我越看越生氣。生氣的點並不是在說他搞了一個爛攤子，結果由我來做(其實我也可以拒絕)，只是&lt;span class="Apple-style-span" style="color: red;"&gt;憑什麼他敢出來獨立接案&lt;/span&gt;，而又不付責任的走了。&lt;br /&gt;
&lt;br /&gt;
下面要講的就是 web 開發人員 &lt;span class="Apple-style-span" style="color: red;"&gt;【最重要的小事】&lt;/span&gt;，千真萬確都是最基本該做到的，如果你是web應用程式的程式設計師，如果有不懂的，就勸你不要再出來害人了，丟臉啊。&lt;br /&gt;
&lt;br /&gt;
【SQL Injection】&lt;br /&gt;
最基本常見的就是串資料庫 SQL 語法，而對於clinet 端所傳入的參數，沒有做任何白名單或黑名單的驗證，再加上SQL權限管理一沒做好，任何人就可以對你的資料庫做任何事，以下是我所看到的程式碼。&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;String sqlCom = "select * from dbo.member where name='" + textbox1.text +  "'";
&lt;/pre&gt;很幸運的是，在我大學開始做web ap的時候，就有一個很棒的團隊朋友，剛好那時候.Net進入2.0的年代，都在用Typed Dataset來與資料庫做溝通，這樣串SQL的方式我真的倒一行都沒寫過(不過老實說，在很久很久以前，我曾用jsp這樣串過語法，不過那只是交作業啦)。現在.Net與資料庫溝通有Linq to SQL、Entity Framework、Java 有 hibernate、Python有 Autumn 等 O/R Mapping 等技術，基本上就提供了很不錯的Injection防護作用。&lt;br /&gt;
&lt;br /&gt;
而這個部分怎麼解呢? 用 SqlParameter 就對了啊，還要sample code嗎? google 打上SqlParameter 就有一堆解，沒那麼難吧。&lt;br /&gt;
&lt;br /&gt;
【XSS】&lt;br /&gt;
就是可以讓Client端使用者任意的輸入html tag，或者是從資料庫來的資料，未經認證，也未經Html Encode，就直接Response到View的頁面，尤其是帶有script的tag，有心人士可以藉由外部的java script，取得cookie，取得cookie 又怎樣呢? cookie 通常都存有session_id 或者是一些機密資料，這樣一來就可以取得其他人的機密資料。&lt;br /&gt;
&lt;br /&gt;
還有我看到他引用外部網站的 java script，當然這裏指的不是google map提供的那種外部script，是直接引用別人網站的script，如果對方有trace到你的ip，及你的網站在使用他的script，他也可以任意的取得你的網站使用者的機密cookie。&lt;br /&gt;
&lt;br /&gt;
最好的做法是白名單，不管是接參數還是render 參數到view當中，建立白名單是最安全的作法，再來就是建立黑名單，直接html .Encode 也是能解決直接印出tag的問題，但是有些資安檢測軟體是不吃這一套，非常嚴格。&lt;br /&gt;
&lt;br /&gt;
【CSRF】&lt;br /&gt;
跨網站的假要求，假設你今天有一個申請會員的功能頁，post的url為apply.aspx，帶2個參數，帳號及密碼，即可申請到會員，那麼我只要用程式不斷送帶有參數的request，就可以一直新增許許多多的會員，解決辦法很簡單，只要在每次runtime時，產生一個valid key到client，而server在每次被request的時候，需要去檢查這個valid key，最簡單的說就是提供驗證碼。&lt;br /&gt;
&lt;br /&gt;
其實 .Net Framework有提供ViewState 加密的這個 hidden value，他都用.Net Framework了，還能被檢測出這個弱點，&lt;span class="Apple-style-span" style="color: red;"&gt;我真是他媽的佩服他了&lt;/span&gt;。雖然我不是個很優秀的programer，但是基本該做的，我至少都會做到，這個案子讓我真的見識到了什麼才是出來騙吃騙喝的，有夠扯了。&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/6821770336424218668-8103774968978835814?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/Kvtw_5xm3e0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/8103774968978835814/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/04/web.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/8103774968978835814?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/8103774968978835814?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/Kvtw_5xm3e0/web.html" title="什麼是 web 開發人員【最重要的小事】" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/04/web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcNSHg-cSp7ImA9WhZRFEw.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-4066830213660183518</id><published>2011-04-10T13:16:00.003+08:00</published><updated>2011-04-10T13:24:59.659+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-10T13:24:59.659+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="心得分享" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><category scheme="http://www.blogger.com/atom/ns#" term="iOS" /><title>2011 Mac Book Pro 13" 開箱心得文來囉</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wLmGemWcuITlteKx39nYupkLkGQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wLmGemWcuITlteKx39nYupkLkGQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wLmGemWcuITlteKx39nYupkLkGQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wLmGemWcuITlteKx39nYupkLkGQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;2011 的 Mac Book Pro 總算到台灣了，最後還是請瑞慈小妹幫我用教育價買了一台，從此加入了水果教，開始學習水果神功(誤)。&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;其實我買Mac不只是想玩iOS app的開發，這樣想就太狹隘，每種作業系統都有他的文化背景，我只是想去瞭解它，就像有些人喜歡環遊世界，去深入瞭解許許多多國家的歷史，對我來說也是如此，很簡單，沒有什麼壓力與預設立場。之前聽小林的linux的第一堂課，讓我啟發很多，小林從Unix的歷史介紹起，在學校只是背指令，用指令，考試就可以很高分，沒有另外花時間去瞭解它，這是很可惜的。&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;不過我也不是希望學校會花了幾堂課的時間來交待它歷史及成長過程，這是不對的，因為這些東西是留給好奇的學生們自已去挖掘的。有時候我們接觸另一個領域的技術時，常常會忽略它的成長過程，其實那是很有趣的，也很有幫助的，試著去瞭解這個部分，可能會得到很多新的想法及對新事物的看法。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;記得上個月參加台科資管系友回娘家活動，老師問大家對資管系的教學有沒有什麼建議呢? 慢慢的很多學長姐發表了自已對資管系教學的一些看法，有些人說學校應該跟隨潮流，教一些android、iOS 等等現在很火紅的行動裝置開發，有些人覺得學校教的語言太多，應該專注在一種程式語言就好。我個人認為都沒錯，學校應該去跟隨潮流，也應該去洞察未來潮流，但不可以本末倒置，更不該盲從。現在手持裝置開發很火紅、很潮流，好像沒有學一下就是個lkk的程式設計師。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;畢竟手持裝置app開發是ap層的技術，其實這些東西有興趣的人買買書自修就可以做出很不錯的東西，學校如果開這種課程而且當成必修的話，是有點浪費。有個學長說的很好，C跟OS才是最需要加強的。學校應該給的就是更觀念的東西，而這些觀念的東西就是要跟上潮流，教大家怎麼應用在這些潮流的東西之上，而不是一昧重複舊的教學方式。有些學生不知道自已畢業後能幹嘛，要做什麼工作，學校的教育是要負一點責任，當然最大的責任就在於學生自已。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
過與不及都不好，中庸之道卻是最難做到的。&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;好久沒來灌水一下，不小心又廢話太多，照片先po了。。。。。&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;a href="http://2.bp.blogspot.com/-ErDeq9aIDpo/TaE7nWcSEyI/AAAAAAAABIM/gQqjke4lDJc/s1600/IMAG0670.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-ErDeq9aIDpo/TaE7nWcSEyI/AAAAAAAABIM/gQqjke4lDJc/s320/IMAG0670.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;a href="http://2.bp.blogspot.com/-g2dEjPPGiUQ/TaE7oo8U23I/AAAAAAAABIQ/de2GLxo9ktk/s1600/IMAG0671.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-g2dEjPPGiUQ/TaE7oo8U23I/AAAAAAAABIQ/de2GLxo9ktk/s320/IMAG0671.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;a href="http://3.bp.blogspot.com/-dZQJyYyDbkw/TaE7pp-utiI/AAAAAAAABIU/kJGknuWPlj4/s1600/IMAG0672.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-dZQJyYyDbkw/TaE7pp-utiI/AAAAAAAABIU/kJGknuWPlj4/s320/IMAG0672.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;a href="http://2.bp.blogspot.com/-4wG5t4boYlk/TaE7q0wjVfI/AAAAAAAABIY/T9F2k9sDTJ0/s1600/IMAG0673.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-4wG5t4boYlk/TaE7q0wjVfI/AAAAAAAABIY/T9F2k9sDTJ0/s320/IMAG0673.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;a href="http://3.bp.blogspot.com/-CegwbVNd2Ok/TaE7sLDbGGI/AAAAAAAABIc/3BOCVbX2Skg/s1600/IMAG0674.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-CegwbVNd2Ok/TaE7sLDbGGI/AAAAAAAABIc/3BOCVbX2Skg/s320/IMAG0674.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;a href="http://3.bp.blogspot.com/-L_21xoGQF04/TaE7tM4Gs8I/AAAAAAAABIg/Kx_5oDEot38/s1600/IMAG0675.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-L_21xoGQF04/TaE7tM4Gs8I/AAAAAAAABIg/Kx_5oDEot38/s320/IMAG0675.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;a href="http://3.bp.blogspot.com/-_2Dqv0XUbKQ/TaE7ur64udI/AAAAAAAABIk/LZryPkNAHJ4/s1600/IMAG0676.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-_2Dqv0XUbKQ/TaE7ur64udI/AAAAAAAABIk/LZryPkNAHJ4/s320/IMAG0676.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;a href="http://1.bp.blogspot.com/-R1bkA1qj1vU/TaE7v9KsUDI/AAAAAAAABIo/tqoidVTeyN0/s1600/IMAG0677.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://1.bp.blogspot.com/-R1bkA1qj1vU/TaE7v9KsUDI/AAAAAAAABIo/tqoidVTeyN0/s320/IMAG0677.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;a href="http://3.bp.blogspot.com/-LNNNSI08aoo/TaE7xJtYLeI/AAAAAAAABIs/n_tw2AFxniE/s1600/IMAG0678.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-LNNNSI08aoo/TaE7xJtYLeI/AAAAAAAABIs/n_tw2AFxniE/s320/IMAG0678.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;a href="http://4.bp.blogspot.com/-cgJSe0_p0c4/TaE7yoTZPAI/AAAAAAAABIw/DyGA1ARiQe0/s1600/IMAG0679.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://4.bp.blogspot.com/-cgJSe0_p0c4/TaE7yoTZPAI/AAAAAAAABIw/DyGA1ARiQe0/s320/IMAG0679.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;a href="http://3.bp.blogspot.com/-fxDgi1q7Y7w/TaE7z6Uy7LI/AAAAAAAABI0/9KKlUi8JoGU/s1600/IMAG0680.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-fxDgi1q7Y7w/TaE7z6Uy7LI/AAAAAAAABI0/9KKlUi8JoGU/s320/IMAG0680.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;a href="http://4.bp.blogspot.com/-gP0MuZEo040/TaE71OOnuLI/AAAAAAAABI4/I3QZhjdcxMI/s1600/IMAG0681.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://4.bp.blogspot.com/-gP0MuZEo040/TaE71OOnuLI/AAAAAAAABI4/I3QZhjdcxMI/s320/IMAG0681.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;a href="http://2.bp.blogspot.com/-5PTT2LE1zAc/TaE72eReH8I/AAAAAAAABI8/_KTDN0JfP0g/s1600/IMAG0682.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-5PTT2LE1zAc/TaE72eReH8I/AAAAAAAABI8/_KTDN0JfP0g/s320/IMAG0682.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;a href="http://4.bp.blogspot.com/-jSGQ0pqNlA0/TaE74b81sYI/AAAAAAAABJA/pAfupyY7sb8/s1600/IMAG0683.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://4.bp.blogspot.com/-jSGQ0pqNlA0/TaE74b81sYI/AAAAAAAABJA/pAfupyY7sb8/s320/IMAG0683.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;a href="http://2.bp.blogspot.com/-NkZ0n9vdoCQ/TaE752CJjcI/AAAAAAAABJE/Tik2kiklQpk/s1600/IMAG0684.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-NkZ0n9vdoCQ/TaE752CJjcI/AAAAAAAABJE/Tik2kiklQpk/s320/IMAG0684.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;a href="http://4.bp.blogspot.com/-7Z9yRzNziyI/TaE77Ik34EI/AAAAAAAABJI/kM36r-34u88/s1600/IMAG0685.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://4.bp.blogspot.com/-7Z9yRzNziyI/TaE77Ik34EI/AAAAAAAABJI/kM36r-34u88/s320/IMAG0685.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;a href="http://1.bp.blogspot.com/-BdY2VcMbRVY/TaE78IRRPaI/AAAAAAAABJM/3vaRewZJzhc/s1600/IMAG0686.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://1.bp.blogspot.com/-BdY2VcMbRVY/TaE78IRRPaI/AAAAAAAABJM/3vaRewZJzhc/s320/IMAG0686.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;a href="http://3.bp.blogspot.com/-n1Cu-USrNfs/TaE79WqsykI/AAAAAAAABJQ/KGzKWujFwbE/s1600/IMAG0687.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-n1Cu-USrNfs/TaE79WqsykI/AAAAAAAABJQ/KGzKWujFwbE/s320/IMAG0687.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;a href="http://4.bp.blogspot.com/-YB8BFt4uW3k/TaE7-oplznI/AAAAAAAABJU/sacQgFWAMxw/s1600/IMAG0688.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://4.bp.blogspot.com/-YB8BFt4uW3k/TaE7-oplznI/AAAAAAAABJU/sacQgFWAMxw/s320/IMAG0688.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;a href="http://2.bp.blogspot.com/-6I5Hsm6zkAA/TaE8AQ8F60I/AAAAAAAABJY/GJLIIoFN1a8/s1600/IMAG0689.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-6I5Hsm6zkAA/TaE8AQ8F60I/AAAAAAAABJY/GJLIIoFN1a8/s320/IMAG0689.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;a href="http://2.bp.blogspot.com/-nprBYlVgcVo/TaE8DLoBBDI/AAAAAAAABJg/uURo7TgL8U8/s1600/IMAG0691.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-nprBYlVgcVo/TaE8DLoBBDI/AAAAAAAABJg/uURo7TgL8U8/s320/IMAG0691.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;a href="http://2.bp.blogspot.com/-j3DBgjUQwgA/TaE8ESGhckI/AAAAAAAABJk/NBrRr4QhwBc/s1600/IMAG0692.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-j3DBgjUQwgA/TaE8ESGhckI/AAAAAAAABJk/NBrRr4QhwBc/s320/IMAG0692.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;a href="http://2.bp.blogspot.com/-KIHDlYNDb_Y/TaE8BuaHoJI/AAAAAAAABJc/6j69hixJBB8/s1600/IMAG0690.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://2.bp.blogspot.com/-KIHDlYNDb_Y/TaE8BuaHoJI/AAAAAAAABJc/6j69hixJBB8/s320/IMAG0690.jpg" width="320" /&gt;&lt;/a&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;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-4066830213660183518?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/OcTVM8VAs_Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/4066830213660183518/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/04/2011-mac-book-pro-13.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/4066830213660183518?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/4066830213660183518?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/OcTVM8VAs_Y/2011-mac-book-pro-13.html" title="2011 Mac Book Pro 13&quot; 開箱心得文來囉" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-ErDeq9aIDpo/TaE7nWcSEyI/AAAAAAAABIM/gQqjke4lDJc/s72-c/IMAG0670.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/04/2011-mac-book-pro-13.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08HQXY5eyp7ImA9WhdTEEU.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-1826201757121955242</id><published>2011-04-01T10:40:00.005+08:00</published><updated>2011-07-08T09:50:30.823+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-08T09:50:30.823+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PowerShell" /><title>人生第一支Power Shell</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uyjopgAleNba0jqeKZop2o33Rs0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uyjopgAleNba0jqeKZop2o33Rs0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uyjopgAleNba0jqeKZop2o33Rs0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uyjopgAleNba0jqeKZop2o33Rs0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;一陣子沒發文了，最近說忙也不是很忙，時間都安排的恰恰好，到新公司服務也1個半月了，這段期間有很多獲得，也由於一直在 pick up 進度，實在也沒有什麼時間整理一些心得來更新我的網誌，今天是4天連假的第3天，為了不讓網誌過於荒涼就灌水一篇 - 我的第一支Power Shell。其實也沒什麼特別的，就只是想灌水。&lt;br /&gt;
&lt;br /&gt;
故事是這樣的：   &lt;br /&gt;
我有一些任務是有排程的，並且是分好幾台機器在執行這些任務，然而要在所有的機器執行完這個階段的任務之後，再繼續請下一批的機器們去執行下一個階段的任務，那機器之間是透過網芳來傳遞檔案，所以我們需要在每台機器執行完該階段性的任務後，要去目的地產生flag，代表「我已經完成任務」，而下一階段的機器會持續檢查上一階段的機器們是否有正常完成工作。   &lt;br /&gt;
&lt;br /&gt;
以上聽起來很繞舌，但透過power shell ，很輕鬆就能達成任務。比起bat，更有彈性，也更能與.net 結合在一起。   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;# 檢查Flag
# 取得 Script 檔所在目錄
function Get-ScriptDirectory
{
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value
    Split-Path $Invocation.MyCommand.Path
}
$Flags = 2
$SleepSeconds = 2
$today = Get-Date -Format "yyyyMMdd"
$pt = (Join-Path (Get-ScriptDirectory) $today)

if (-not (Test-Path $pt))
{
    echo $pt
    New-Item -Path $pt -type directory
}

while ((Get-ChildItem $pt).Count -lt $Flags)
{
    echo "wait..."
    Start-Sleep -Seconds $SleepSeconds
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="C#" name="code"&gt;clear 
$FlagName = "Flag_1" 
$today = Get-Date -Format "yyyyMMdd" 
$flags = 2 
$UNCPathArray = 
  "\\myServier_a\c$\solution\Flags\", 
  "\\myServier_b\c$\solution\Flags\", 
  "\\myServier_c\c$\solution\Flags\", 
  "\\myServier_d\c$\solution\Flags\" 

# echo $UNCPathArray.length 
for ($index = 0; $index -lt ($UNCPathArray.length) ; $index ++) 
{ 
  $UNCPath = $UNCPathArray[$index] + $today + "\" 
  # Flag_n 
  $path = $UNCPath + $FlagName 
  echo $UNCPath 
  if (-not (Test-Path $UNCPath)) 
  { 
    New-Item -Path $UNCPath -type directory 
  } 

  if (-not (Test-Path $path)) 
  { 
    New-Item -Path $path -type file 
    $path2 = $path + "_2" 
    New-Item -Path $path2 -type file 
  } 

  if ((Get-ChildItem $UNCPath).Count -eq $flags) 
  { 
    .(Join-Path ($UNCPathArray[$index]) "Go.bat") 
  } 
}

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-1826201757121955242?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/RvmbLUEJNyI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/1826201757121955242/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/04/power-shell.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/1826201757121955242?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/1826201757121955242?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/RvmbLUEJNyI/power-shell.html" title="人生第一支Power Shell" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/04/power-shell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQHRHs9cSp7ImA9WhZTF0o.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-2454482092824996902</id><published>2011-03-18T01:04:00.001+08:00</published><updated>2011-03-22T13:55:35.569+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-22T13:55:35.569+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Understanding User Interface in Android</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PUIJiqt3bO6sycpKK5GSmbBLEPY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PUIJiqt3bO6sycpKK5GSmbBLEPY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PUIJiqt3bO6sycpKK5GSmbBLEPY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PUIJiqt3bO6sycpKK5GSmbBLEPY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;透過小林介紹的一個網站得知, 超美麗的Android Layout教學文章, 看不懂也可以當做來逛逛的,&lt;/p&gt;  &lt;p&gt;真少看到教學文章排版如此精美,推一個!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mobiforge.com/designing/story/understanding-user-interface-android-part-1-layouts"&gt;Understanding User Interface in Android - Part 1: Layouts&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;特別提到 Scroll View Note: Do not use a ListView together with the ScrollView. The ListView is designed for showing a list of related information and is optimized for dealing with large lists. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://mobiforge.com/designing/story/understanding-user-interface-android-part-2-views"&gt;Understanding User Interface in Android - Part 2: Views&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mobiforge.com/designing/story/understanding-user-interface-android-part-3-more-views"&gt;Understanding User Interface in Android - Part 3: More Views&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mobiforge.com/designing/story/understanding-user-interface-android-part-4-even-more-views"&gt;Understanding User Interface in Android - Part 4: Even More Views&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://mobiforge.com/" href="http://mobiforge.com/"&gt;http://mobiforge.com/&lt;/a&gt; 這網站真不錯!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-2454482092824996902?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/3oGIuOLOeuk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/2454482092824996902/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/03/understanding-user-interface-in-android.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/2454482092824996902?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/2454482092824996902?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/3oGIuOLOeuk/understanding-user-interface-in-android.html" title="Understanding User Interface in Android" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/03/understanding-user-interface-in-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUDRHk9cCp7ImA9Wx9aFUo.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-1169306574178958575</id><published>2011-03-05T11:11:00.001+08:00</published><updated>2011-03-08T15:44:35.768+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-08T15:44:35.768+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="LINQ" /><title>dbLinq</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0g6f-9urtCQWCntvfNJGWyTb1YQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0g6f-9urtCQWCntvfNJGWyTb1YQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0g6f-9urtCQWCntvfNJGWyTb1YQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0g6f-9urtCQWCntvfNJGWyTb1YQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;如果專案的資料庫由ms Sql 突然要求變成 my Sql 又想用Linq To SQL的時候怎麼辦?&lt;/p&gt;  &lt;p&gt;dbLinq is good &lt;a title="http://code.google.com/p/dblinq2007/" href="http://code.google.com/p/dblinq2007/"&gt;http://code.google.com/p/dblinq2007/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;有夠強大.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;稍為用一點時間弄個win form UI,截圖一下。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;dbmetal General&amp;#160; v1.0.0：(第一版也是最後一版,絕版)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh5.ggpht.com/_Lg_bqtXQWro/TXGpyl3lVhI/AAAAAAAABGo/0zP-eGiheEk/s1600-h/2011-03-04_160450%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2011-03-04_160450" border="0" alt="2011-03-04_160450" src="http://lh6.ggpht.com/_Lg_bqtXQWro/TXGpzawTPCI/AAAAAAAABGs/nraCwod2KL0/2011-03-04_160450_thumb%5B1%5D.jpg?imgmax=800" width="347" height="265" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_Lg_bqtXQWro/TXGpz1K3R5I/AAAAAAAABGw/aRiCXIuH2gY/s1600-h/2011-03-04_160505%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2011-03-04_160505" border="0" alt="2011-03-04_160505" src="http://lh6.ggpht.com/_Lg_bqtXQWro/TXGp0vZKhlI/AAAAAAAABG0/9Vw9W7hVo9Y/2011-03-04_160505_thumb%5B1%5D.jpg?imgmax=800" width="361" height="245" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;        &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_Lg_bqtXQWro/TXGp0xPnl3I/AAAAAAAABG4/1uij4FsROko/s1600-h/2011-03-04_160524%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2011-03-04_160524" border="0" alt="2011-03-04_160524" src="http://lh4.ggpht.com/_Lg_bqtXQWro/TXGp1kNkt0I/AAAAAAAABG8/PYxlz0JpqhQ/2011-03-04_160524_thumb.jpg?imgmax=800" width="87" height="86" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_Lg_bqtXQWro/TXGp1-OB4uI/AAAAAAAABHA/-W3xBUTB4Hk/s1600-h/2011-03-04_160716%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2011-03-04_160716" border="0" alt="2011-03-04_160716" src="http://lh6.ggpht.com/_Lg_bqtXQWro/TXGp2ZDrEhI/AAAAAAAABHE/l1Kp9TiN10E/2011-03-04_160716_thumb.jpg?imgmax=800" width="254" height="53" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_Lg_bqtXQWro/TXGp27Dl_qI/AAAAAAAABHI/LE3JWDTJ4Os/s1600-h/2011-03-04_160836%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2011-03-04_160836" border="0" alt="2011-03-04_160836" src="http://lh5.ggpht.com/_Lg_bqtXQWro/TXGp3dC-CcI/AAAAAAAABHM/JpNlpxBnwis/2011-03-04_160836_thumb.jpg?imgmax=800" width="260" height="129" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_Lg_bqtXQWro/TXGp35NCsnI/AAAAAAAABHQ/upn3_zSYXxo/s1600-h/2011-03-04_160858%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2011-03-04_160858" border="0" alt="2011-03-04_160858" src="http://lh5.ggpht.com/_Lg_bqtXQWro/TXGp4aRaCKI/AAAAAAAABHU/MwmgZ5lvPPA/2011-03-04_160858_thumb.jpg?imgmax=800" width="268" height="74" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Gridview測試&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_Lg_bqtXQWro/TXGp4yxaXSI/AAAAAAAABHY/Di7Yfq9l_I8/s1600-h/2011-03-04_160941%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2011-03-04_160941" border="0" alt="2011-03-04_160941" src="http://lh6.ggpht.com/_Lg_bqtXQWro/TXGp5YgLl2I/AAAAAAAABHc/NYRXO_htz1s/2011-03-04_160941_thumb.jpg?imgmax=800" width="488" height="163" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;純灌水文…………&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-1169306574178958575?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/wlyYDJVPTzs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/1169306574178958575/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/03/dblinq.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/1169306574178958575?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/1169306574178958575?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/wlyYDJVPTzs/dblinq.html" title="dbLinq" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_Lg_bqtXQWro/TXGpzawTPCI/AAAAAAAABGs/nraCwod2KL0/s72-c/2011-03-04_160450_thumb%5B1%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/03/dblinq.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IDQnkzeCp7ImA9Wx9bGEQ.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-6393125803429328332</id><published>2011-02-28T20:18:00.002+08:00</published><updated>2011-02-28T21:26:13.780+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-28T21:26:13.780+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="BLOG" /><category scheme="http://www.blogger.com/atom/ns#" term="心得分享" /><title>Blog調整完畢</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ni2gIMhdcN9wtQqZtjsJJsA6Tmw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ni2gIMhdcN9wtQqZtjsJJsA6Tmw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ni2gIMhdcN9wtQqZtjsJJsA6Tmw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ni2gIMhdcN9wtQqZtjsJJsA6Tmw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;228 放假日，好久沒好好的整理一下Blog的一些引用資源，散落各地，之前都把靜態檔案放在google pages，但google pages的服務已經改成sites協作平台，雖然之前放的靜態檔案還能用，但總覺得很零亂，索性花了一點時間更新一下版本及一些lose掉的靜態檔(想整理已經想很久了，一直很懶的弄)。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;更新內容&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;更新jquery 1.2.4a 至 1.4.4&amp;#160;&amp;#160;&amp;#160; (&lt;font color="#ff0000" size="2"&gt;&lt;strong&gt;1.2.4a 看我多久沒更新&lt;/strong&gt;&lt;/font&gt;) &lt;/li&gt;    &lt;li&gt;加入jquery.blockUI plug (&lt;font color="#ff0000" size="2"&gt;&lt;strong&gt;後來想想加這個要幹嘛&lt;/strong&gt;&lt;/font&gt;) &lt;/li&gt;    &lt;li&gt;把所有的圖檔、css、js檔移至google app engine，及抓回一些lose掉的靜態檔。 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;換到新環境2個星期了，適應的還不錯，也有很多東西可以去嚐試去學習，電腦也配得很棒，提升不少工作效率，也可能是產業的關係，主管同事們似乎沒那麼瘋狂(&lt;strong&gt;&lt;font color="#ff0000" size="2"&gt;或許我還不夠熟&lt;/font&gt;&lt;/strong&gt;) ，不過這都無所謂，我愛我自已所選擇的工作。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;接下來hadoop的導入、iPad&amp;#160; app、RESTfull web Service的開發，真讓我期待又熱血啊。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;截圖記錄一下。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeksjen.appspot.com/blogger/images/aaa.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="大冒險。阿健與皮皮1" border="0" alt="大冒險。阿健與皮皮1" src="http://geeksjen.appspot.com/blogger/images/aaa.jpg" width="504" height="4142" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-6393125803429328332?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/ZZ0uKIceH4I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/6393125803429328332/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/02/blog.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/6393125803429328332?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/6393125803429328332?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/ZZ0uKIceH4I/blog.html" title="Blog調整完畢" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/02/blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYEQnw9cSp7ImA9Wx9bGEQ.&quot;"><id>tag:blogger.com,1999:blog-6821770336424218668.post-4131028392710415829</id><published>2011-02-28T18:41:00.000+08:00</published><updated>2011-02-28T19:55:03.269+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-28T19:55:03.269+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jQuery" /><title>jQuery Cache簡單範例</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RimoqDNIXraLAKU3_beBPhYEJlo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RimoqDNIXraLAKU3_beBPhYEJlo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RimoqDNIXraLAKU3_beBPhYEJlo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RimoqDNIXraLAKU3_beBPhYEJlo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;延伸之前 &lt;a href="http://leehom59.blogspot.com/2011/02/jquery-right-way.html"&gt;jquery the rightway&lt;/a&gt; 文章，來一個小範例。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;最近我有一段code是這樣寫的，主要是要找tabs，然後在每個tabs上註冊新的事件：&lt;/p&gt;  &lt;pre class="JavaScript" name="code"&gt;var ary_Tabs = new Object();
function cateInit() {
    //一開始用id來縮小找dom的範圍，找 ul 裏面的a
    var list = $('#brandTabs ul:eq(0) a');
    //然後把事件註冊好
    for (var i = 0; i &amp;lt; list.length; i++) {
        $(list[i]).bind('click', function () {
            $('#ddl_cate').val($(this).attr('href'));
        });
        //快取到ary_tabs這個dictionary
        ary_Tabs[$(list[i]).attr('href')] = list[i];
    }
}

$(function () {
    //初始化快取
    cateInit();
    $('#ddl_cate').bind('change', function () {
        var $parent = $('#brandTabs');
        //取用快取,不用再尋找.
        var object = $('a[href=' + $(this).val() + ']:eq(0)', $parent);
        $(object).trigger('click');
    });
});&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;之前我們可能不會用到像上面ary_Tabs這個dictionary來做快取的功能，有個重點就是，&lt;strong&gt;&lt;font color="#ff0000"&gt;只要你使用這個$('') ，就是讓jquery重新搜尋一次&lt;/font&gt;&lt;/strong&gt;，如果利用dictionary來做快取就可以不用再重新搜尋，如果有人問我比較快嗎? 我不確定，有些時候就不需要，反正很多東西都是要看情況用的，不是人家介紹就是好。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;最近換到新環境，感覺還不錯，繼續加油。還蠻期待iPad電子書城的開發，Rock’n Roll La!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6821770336424218668-4131028392710415829?l=leehom59.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/ZhcPP/~4/GMHGHDWRMP8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leehom59.blogspot.com/feeds/4131028392710415829/comments/default" title="張貼意見" /><link rel="replies" type="text/html" href="http://leehom59.blogspot.com/2011/02/jquery-cache.html#comment-form" title="0 個意見" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/4131028392710415829?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6821770336424218668/posts/default/4131028392710415829?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/ZhcPP/~3/GMHGHDWRMP8/jquery-cache.html" title="jQuery Cache簡單範例" /><author><name>阿健</name><uri>http://www.blogger.com/profile/10118448223145998411</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://1.bp.blogspot.com/-xKlWcgmyE2A/TWJ3u8eNerI/AAAAAAAABEQ/I3svliO2eUE/s220/4596190-big4.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leehom59.blogspot.com/2011/02/jquery-cache.html</feedburner:origLink></entry></feed>

