<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6505213162600961434</id><updated>2012-01-23T11:49:17.597+08:00</updated><category term='WebUserControl'/><category term='Visual Studio'/><category term='ThreadLocalStorage'/><category term='Yahoo mail'/><category term='SQL'/><category term='encoding'/><category term='ItemTemplate'/><category term='Excel VBA'/><category term='Security Development Lifecycle SDL'/><category term='RAID'/><category term='vs2008'/><category term='帳號管理'/><category term='smtp verification'/><category term='跨頁傳值'/><category term='ConvertZ'/><category term='MasterPage'/><category term='民國年'/><category term='regexp'/><category term='鼠標位置'/><category term='passwd'/><category term='word'/><category term='time machine'/><category term='broadcom'/><category term='DataSource'/><category term='ASP.NET'/><category term='asset management'/><category term='面試'/><category term='HP-UX NTP'/><category term='Crash'/><category term='DOM'/><category term='iphone'/><category term='RED HAT'/><category term='Other'/><category term='grep'/><category term='匯入 Excel'/><category term='MSDTC'/><category term='JAWStats'/><category term='創新'/><category term='Solaris'/><category term='UI Design Performance'/><category term='macro'/><category term='求職'/><category term='公益'/><category term='User Control'/><category term='AP.C#.NET'/><category term='RedHat reboot hang'/><category term='匯出 Excel'/><category term='WEB PI'/><category term='.NET 3.5'/><category term='CodeSnippets'/><category term='FireFox'/><category term='IBM'/><category term='facebook'/><category term='Time Management'/><category term='LINQ'/><category term='SSMSE'/><category term='主頁'/><category term='jQuery'/><category term='MySQL'/><category term='PYTHON'/><category term='infoQ'/><category term='QA'/><category term='SecureCRT'/><category term='COM VB6 ProgID'/><category term='windows NIC bonding'/><category term='scheduled backup'/><category term='Tips'/><category term='import/export'/><category term='Chart Control'/><category term='IIS'/><category term='口試'/><category term='C#.NET'/><category term='ie8'/><category term='智慧畫居住空間展示中心'/><category term='Yahoo mail contact'/><category term='Chat'/><category term='心得'/><category term='改變滑鼠位置'/><category term='notepad++'/><category term='mac'/><category term='coding'/><category term='HTML'/><category term='Widget'/><category term='.NET Language F#'/><category term='資料剖析'/><category term='feedly'/><category term='bug goal'/><category term='itunes'/><category term='google'/><category term='Excel'/><category term='virtualization'/><category term='FireGestures'/><category term='Windows Mobile'/><category term='Microsoft'/><category term='MVC'/><category term='javascript'/><category term='becky email client'/><category term='Change Mouse Position'/><category term='joomla'/><category term='Exchange'/><category term='jpgraph'/><category term='專案管理'/><category term='perl'/><category term='SQL Server'/><category term='Sandcastle'/><category term='xargs'/><category term='Silverlight MS RIA'/><category term='Programming'/><category term='GAME'/><category term='Distributed file system'/><category term='win7'/><category term='TechEd 2008'/><category term='win7 firewall'/><category term='Infomation Security'/><category term='.NET Compact Framework'/><category term='Hadoop'/><category term='Pocket PC'/><category term='vs2010'/><category term='Scripts'/><category term='SIKULI'/><category term='multi-thread'/><category term='windows'/><category term='Surface'/><category term='DotNET'/><category term='SHFB'/><category term='DNN'/><category term='.NET Upgrade'/><category term='vs2005'/><category term='phpMyBackupPro'/><category term='routine'/><category term='living 3.0'/><category term='apache'/><category term='linux'/><category term='pMBP'/><category term='phpMyAdmin'/><category term='shell script'/><category term='基礎數學'/><category term='BetterAWStats'/><category term='openfind'/><category term='vi'/><category term='php'/><category term='Cloud Computing'/><category term='NPOI'/><category term='WCG'/><category term='行動版面 手機版面 Blogger Touch'/><category term='rename'/><category term='CrossPagePostback'/><category term='Readability'/><category term='tar'/><category term='FormView'/><category term='ADO.NET'/><category term='regex'/><category term='outlook'/><category term='合約'/><category term='sudo'/><category term='AWStats'/><category term='Google Chrome'/><category term='unix'/><category term='Tools'/><category term='filezilla server'/><category term='windows SharePoint Service'/><category term='排程'/><category term='TLS'/><category term='Fabrik'/><category term='TaiwanCalendar'/><category term='ftp'/><category term='Silverlight'/><title type='text'>~.:.': .NET碎碎念:'.':.~</title><subtitle type='html'>2012世界末日就快到了，你想好要和誰一起過了嗎?</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default?start-index=101&amp;max-results=100'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>247</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-8754158130872444139</id><published>2011-12-31T15:24:00.001+08:00</published><updated>2011-12-31T15:24:24.609+08:00</updated><title type='text'>iPhone 4S 預購心得</title><content type='html'>每年的 iPhone 預購，已經成為我工作上最重要的大事(就這兩年的經驗來說，也是必定出包的大事Orz)，過程中累積了一些經驗，上週更是有機會請設計/維運另一個知名訂票系統的同事來分享心得，整理如下。&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;系統架構愈簡單，request 經過的節點愈少，就更好調整相關參數，當發生異常時也比較容易掌握是哪裡出了問題，系統效能也會更好。&lt;/li&gt;&lt;li&gt;當預購開始時，瞬間湧入的超大流量不管準備多少實體設備都不夠應付(畢竟預算&amp;amp;機房空間有限)，因此在request經過的各節點設定限流是必要的手段，包括 Firewall, Switch, AP/DB Server 之間的流量限制。但是最佳的參數為何，需要在&lt;b&gt;相同的系統環境(軟硬體規格)下&lt;/b&gt;持續進行調整才能得到。&lt;/li&gt;&lt;li&gt;承上，叢集系統若為異質平台組成，或者硬體規格有明顯差異者，管理起來會很麻煩，最好能針對每一台設備去調整限流的參數，才能得到最大的 throughput。若要降低管理/調校的成本，最好能用相同的硬體規格/平台，否則就要有很強大的軟體架構(網路層/AP層)，能夠&lt;b&gt;自動&lt;/b&gt;根據每一台機器去設定相關參數，才能讓每一台設備都發揮最大的效能。&lt;/li&gt;&lt;li&gt;IDP/IPS/Firewall等資安設備的參數調校是很大的學問，在平日沒有承載足夠流量下所做的設定，面對瞬間/持續超高流量時不一定能運作的很好，甚至可能會造成&lt;b&gt;反效果&lt;/b&gt;，因為誤判而將正常流量給block掉，處理起來非常頭痛(可能要臨時把相關policy disable，甚至改接網路線將流量bypass這些資安設備)。&lt;/li&gt;&lt;li&gt;減少系統內紀錄的log對於效能會有所幫助(還可以避免因磁碟存取異常造成整個系統效能下降的問題)，但要考量萬一產生客訴，需要調閱資料的時候能否取得足夠的資料，原則上log還是要能免則免，非得要紀錄的話寫到另一個獨立的 DB 效能會比寫到 file system 好。&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;大概就這樣啦，2012會是忙碌的一年，年中有倫敦奧運，第三季可能就會有 iPhone5 預購啦，希望可以順利度過！&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/6505213162600961434-8754158130872444139?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/8754158130872444139/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=8754158130872444139&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/8754158130872444139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/8754158130872444139'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/12/iphone-4s.html' title='iPhone 4S 預購心得'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3716150056343760955</id><published>2011-12-31T10:37:00.001+08:00</published><updated>2011-12-31T10:37:54.550+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='心得'/><title type='text'>2011年回顧</title><content type='html'>&lt;p&gt;又到了一年一度的這個時候了&lt;/p&gt;  &lt;p&gt;今年坎尼比較專心在研究所課業上，所以發文量很明顯下降了，看到去年寫的&lt;a href="http://dotnetmis91.blogspot.com/2011/01/2010.html" target="_blank"&gt;回顧文&lt;/a&gt;內容說，要給更多優質內容就不禁汗顏 (汗)&lt;/p&gt;  &lt;p&gt;坎尼這一整年有三分之一的日子去參加了某創業比賽，但嚴格說起來應該就只是&lt;strong&gt;創業過程體驗&lt;/strong&gt;比賽，雖然花了不少時間，但仍收獲良好，未來有機會再跟各位分享&lt;/p&gt;  &lt;p&gt;接著要分享的是本學期所修的一門課，這門課的內容在談資訊系統怎麼幫助企業達成目標，其實上課的時候坎尼有些感觸：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;很多公司在推資訊系統時，只是跟進其他同業，並未想過組織目標為何，所以系統買了或是開發了就放在那邊沒用…&lt;/li&gt;    &lt;li&gt;工程師並未全盤了解組織策略為何，這樣開發出來的系統肯定無法符合需求，到頭來就只是在使用者端不斷地來回，修改需求。     &lt;br /&gt;(是說為什麼不用 prototype 開發方法?)&lt;/li&gt;    &lt;li&gt;不符合工作目標的系統，上線日就等於系統的死亡日&lt;/li&gt;    &lt;li&gt;現在出去的大學生/研究生連Code都不會Code了…更別提了解策略並規劃資訊系統。&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;總覺得老師也是鄉民來著，很酸 XD&lt;/p&gt;  &lt;p&gt;今天是今年的最後一天了，也總算在本月看到 Nokia 和 Microsoft 合作的 Lumia 系列手機在台灣上市，希望這是智慧型手機 OS 即將三分天下的預兆!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3716150056343760955?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3716150056343760955/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3716150056343760955&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3716150056343760955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3716150056343760955'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/12/2011.html' title='2011年回顧'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-6099120312710931060</id><published>2011-12-31T10:19:00.001+08:00</published><updated>2011-12-31T10:21:21.052+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSMSE'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>[SQL SERVER] SQL SERVER 無法使用帳號登入之原因</title><content type='html'>&lt;p&gt;坎尼和同學們最近要為論文寫資訊系統    &lt;br /&gt;剛好以 SQL Server 2008 R2 當資料庫系統     &lt;br /&gt;沒想到同學們沒用過，所以發生了不少設定上問題     &lt;br /&gt;所以把初心者在使用 SSMSE 時，無法登入的可能原因整理成一篇 &lt;/p&gt;  &lt;hr /&gt;  &lt;h3&gt;I. 伺服器安全性設定&lt;/h3&gt; S 同學照著網路上的範例建立好資料庫   &lt;br /&gt;沒想到寫好一個程式之後，怎樣都無法用帳號登入   &lt;br /&gt;但用 Windows 整合驗證是正常的   &lt;br /&gt;  &lt;br /&gt;坎尼檢查了一下才發現，S同學忘了修改&lt;font color="#0000ff"&gt;伺服器驗證屬性&lt;/font&gt;   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-PQkvDgKbhp0/Tv5xOIKNMMI/AAAAAAAAKko/a5FMZz89_QY/s1600-h/SL01%25255B4%25255D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SL01" border="0" alt="SL01" src="http://lh6.ggpht.com/-OGflZ2Asqgk/Tv5xPOMDX_I/AAAAAAAAKkw/6rdjnXBZai0/SL01_thumb%25255B2%25255D.png?imgmax=800" width="1018" height="729" /&gt;&lt;/a&gt; 如上圖把&lt;font color="#0000ff"&gt;伺服器驗證&lt;/font&gt;改為&lt;font color="#0000ff"&gt;SQL Server及Windows驗證模式&lt;/font&gt;即可  &lt;br /&gt;   &lt;br /&gt;  &lt;h3&gt;II. 帳號安全性&lt;/h3&gt; C同學已修改過上述屬性，但仍是有帳號無法登入之問題   &lt;br /&gt;檢查之後才發現同學在帳號屬性中，選了&lt;font color="#0000ff"&gt;強制執行密碼逾期&lt;/font&gt;   &lt;br /&gt;所以寫程式去連接時，會有帳號密碼已逾期之例外發生   &lt;br /&gt;&lt;strike&gt;無奈現在年輕人都不怎麼靜下心來看錯誤訊息寫什麼   &lt;br /&gt;&lt;/strike&gt;   &lt;br /&gt;坎尼修改該帳號登入屬性之後程式就可以跑了，可喜可賀   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/-IBACGs7dSHA/Tv5xQKJ0tzI/AAAAAAAAKk4/bApr4MdPE_8/s1600-h/SL02%25255B4%25255D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SL02" border="0" alt="SL02" src="http://lh5.ggpht.com/-nRi8Hg5ANO0/Tv5xRqvsgMI/AAAAAAAAKlA/DGVACiUDu5c/SL02_thumb%25255B2%25255D.png?imgmax=800" width="1022" height="731" /&gt;&lt;/a&gt;   &lt;h3&gt;III. 小結 &lt;/h3&gt; 最近在幫同學們處理這些問題，發現並不是工具不好用   &lt;br /&gt;反而是使用者常常會忽略工具所提供的訊息   &lt;ul&gt;   &lt;li&gt;看到警告視窗→&lt;strong&gt;&lt;font color="#ff0000"&gt;確定&lt;/font&gt;&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;不管內容寫什麼，點 &lt;strong&gt;&lt;font color="#ff0000"&gt;同意&lt;/font&gt;&lt;/strong&gt; 就對了 &lt;/li&gt; &lt;/ul&gt; 不知道是不是現在人接觸太多資訊科技   &lt;br /&gt;已經被一些好用的應用程式慣壞了?   &lt;br /&gt;  &lt;br /&gt;但反過來想，程式設計師在設計這些訊息的時候   &lt;br /&gt;是不是也該想想使用者會有什麼樣的反應發生呢?    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-6099120312710931060?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/6099120312710931060/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=6099120312710931060&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6099120312710931060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6099120312710931060'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/12/sql-server-sql-server.html' title='[SQL SERVER] SQL SERVER 無法使用帳號登入之原因'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-OGflZ2Asqgk/Tv5xPOMDX_I/AAAAAAAAKkw/6rdjnXBZai0/s72-c/SL01_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-7440695976264092034</id><published>2011-11-16T22:57:00.001+08:00</published><updated>2011-11-16T23:19:37.810+08:00</updated><title type='text'>如何將各種不同短網址服務(URL Shortening Services)產生的短網址還原</title><content type='html'>最近遇到一個需求，要用程式將大量的短網址還原為原始的完整網址，以便進一步對這些網址作分析，在 .NET 中可以很容易的完成這個功能。&lt;br /&gt;&lt;br /&gt;首先要先擬出個大概的流程，也就是利用程式送出 HTTP GET request，然後針對收到的 HTTP response 去解析完整的網址為何。&lt;br /&gt;&lt;br /&gt;有了大概的概念之後，大概 Google 一下就會找到這篇 MSDN 參考資料：&lt;a href="http://msdn.microsoft.com/en-us/library/debx8sh9.aspx"&gt;How to: Send Data Using the WebRequest Class&lt;/a&gt;. 從裡面可以知道，WebRequest 和 WebResponse 會是最重要的兩個 class。&lt;br /&gt;&lt;br /&gt;重點程式如下：&lt;br /&gt;&lt;br /&gt;一：以短網址作為參數，建立一個新的 WebRequest 物件，並設定要使用 HTTP GET:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;WebRequest request = WebRequest.Create("http://goo.gl/UjDtF");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;request.Method = "GET";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;二：若你的環境需要透過 proxy 才可以連外，則加入以下這行:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;request.Proxy = WebProxy.GetDefaultProxy();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;三：發出 request，並解析收到的 response，原始的網址就是 response 的 ResponseUri.AbsoluteUri:&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;WebResponse response =&amp;nbsp;request.GetResponse();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;string originalURL =&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;response.ResponseUri&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;.AbsoluteUri;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;就這麼簡單，完整的範例程式碼請參考&lt;a href="https://skydrive.live.com/?cid=e25b289c2766addf&amp;amp;sc=documents&amp;amp;id=E25B289C2766ADDF%21419#"&gt;RestoreShortURL.zip&lt;/a&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-7440695976264092034?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/7440695976264092034/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=7440695976264092034&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7440695976264092034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7440695976264092034'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/11/url-shortening-services.html' title='如何將各種不同短網址服務(URL Shortening Services)產生的短網址還原'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-2311537539052353806</id><published>2011-08-02T14:49:00.000+08:00</published><updated>2011-08-02T14:49:36.536+08:00</updated><title type='text'>MIS 必備技能：製作光碟映像檔（.iso files）</title><content type='html'>前陣子被問到如何在沒有光碟機的 NB 上播放 DVD 光碟（或者是如何安裝軟體），這才發現連唸資訊相關科系的學生也有很多人不懂如何製作光碟映像檔。&lt;br /&gt;&lt;br /&gt;除了在沒有光碟機時必須要使用到映像檔以外，使用映像檔也可以避免光碟片因經常使用而損壞，所以現在我拿到如 WebCam 的 driver 之類的光碟片，就會把光碟片做成映像檔，之後都用映像檔安裝/移除軟體，光碟就封存備用了（或者直接拿去回收）。&lt;br /&gt;&lt;br /&gt;未來光碟機的使用可能會越來越少，因為影音檔案/軟體安裝檔都可以從網路上取得，online video streaming 也已經到達 HD 高畫質的地步，光碟機這種速度慢又很吵的設備就越來越無用武之地了（大概只會剩下高階的藍光光碟機）。&lt;br /&gt;&lt;br /&gt;從 Apple 的產品策略可看出 Apple 認為未來光碟機將會消失，例如：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;去年底發表新款 MacBook Air 時就&lt;a href="http://chinese.engadget.com/2010/10/20/new-macbook-airs-come-with-software-reinstall-usb-drive/"&gt;改為提供系統重新安裝專用 USB 隨身碟&lt;/a&gt;&lt;/li&gt;&lt;li&gt;前陣子發表的新款 Mac mini 也&lt;a href="http://big5.eastday.com:82/gate/big5/it.eastday.com/352837/211171121975.shtml"&gt;取消了原本內建的吸入式光碟機&lt;/a&gt;（本文也提到 Apple 也是率先取消內建軟碟機的製造商）&lt;/li&gt;&lt;li&gt;&lt;a href="http://tw.tech.yahoo.com/apple_computer/article/id/15119/"&gt;最新款的 MacBook Pro 也取消還原光碟&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mobile01.com/print.php?f=482&amp;amp;t=2265689&amp;amp;p=1"&gt;最新版的 Mac OS X Lion 首日下載超過一百萬次&lt;/a&gt;，沒有販售實體光碟&lt;/li&gt;&lt;/ul&gt;至於未來市場發展是否會如 Apple 的定位，大家就拭目以待囉。&lt;br /&gt;&lt;br /&gt;其實只要直接 Google「製作映像檔」就可以找到一堆軟體介紹以及圖文並茂的使用說明，例如：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://briian.com/?p=6414"&gt;重灌狂人：[免費] Free ISO Creator 製作 ISO 檔、可開機光碟映像檔&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.soft.idv.tw/?p=791"&gt;軟體玩家：免費又好用的虛擬光碟及映像檔製作工具-MagicDisc&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.xuite.net/yh96301/blog/37256673"&gt;軟體使用教學：光碟映像檔製作與掛載軟體-DAEMON Tools Lite&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://portable.easylife.tw/934?category=48"&gt;綠色工廠 Easylife Blog：ImgBurn v2.5.5.0 - 映像檔燒錄小幫手&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;我就不狗尾續貂啦。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;我自己是習慣用 ImgBurn + VirtualCloneDrive (因為當初 Win7 在 beta 的時候包括酒精之類的一大堆軟體都無法掛載映像檔，用久就習慣這個組合了)，用了很久都沒啥問題，如果有需要的人可以試試看。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-2311537539052353806?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/2311537539052353806/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=2311537539052353806&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/2311537539052353806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/2311537539052353806'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/08/mis-iso-files.html' title='MIS 必備技能：製作光碟映像檔（.iso files）'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-8326064555374645937</id><published>2011-07-19T15:23:00.000+08:00</published><updated>2011-07-19T15:23:12.435+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sudo'/><title type='text'>設定 sudo 時要記得禁止一般權限使用者執行 sudo sudo</title><content type='html'>在設定一般權限使用者可用 sudo 執行何種指令時，有以下兩種作法 (參考&lt;a href="http://linux.vbird.org/linux_basic/0410accountmanager.php#sudo"&gt;鳥哥的文章&lt;/a&gt;)：&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;白名單：明確列出使用者&lt;span class="Apple-style-span" style="color: red;"&gt;可以&lt;/span&gt;執行哪些指令，如：&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;Cmnd_Alias USERADM = /bin/more, /bin/cat &lt;span class="Apple-style-span" style="font-family: 'LiHei Pro'; white-space: normal;"&gt;&lt;pre xml:space="preserve"&gt;user     ALL=USERADM&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;使用者只能以 sudo 執行 more 和 cat 指令。&lt;/li&gt;&lt;li&gt;黑名單：明確列出使用者&lt;span class="Apple-style-span" style="color: red;"&gt;不可&lt;/span&gt;執行哪些指令，如：&lt;br /&gt;&lt;pre xml:space="preserve"&gt;Cmnd_Alias NSU = /bin/su&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'LiHei Pro'; white-space: normal;"&gt;&lt;pre xml:space="preserve"&gt;user &amp;nbsp; &amp;nbsp; ALL=ALL, !NSU&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;使用者不可以 sudo 執行 su 指令，其他指令都可以。&lt;/li&gt;&lt;/ul&gt;sudo sudo 問題只會發生在使用黑名單時，因為除了黑名單中所列的指令，其他指令都可以執行，而 OS 中的指令很多，有時候會發生漏擋的現象，而造成意想不到的結果。&lt;br /&gt;&lt;br /&gt;上禮拜中無意發現，原本的黑名單中只有禁止 su 和 visudo 等指令，沒有禁止 sudo 指令，因此若執行「sudo passwd root」會出現「Sorry, user &lt;i&gt;xxx&lt;/i&gt; is not allowed to execute '/usr/bin/passwd root' as root on &lt;i&gt;server&lt;/i&gt;.」的訊息，這跟預料中的一樣，顯示黑名單有正確發揮作用。&lt;br /&gt;&lt;br /&gt;但是若執行「&lt;span class="Apple-style-span" style="color: red;"&gt;sudo sudo&lt;/span&gt; passwd root」(因為當時眼殘，沒注意到已經打了一次 sudo，就重複了)，則可以成功變更 root 密碼！因此若要使用黑名單，除了禁止 su、visudo、passwd root、userdel root 等等指令以外，還要記得禁止 sudo 指令，才不會留下漏洞！&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/6505213162600961434-8326064555374645937?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/8326064555374645937/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=8326064555374645937&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/8326064555374645937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/8326064555374645937'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/07/sudo-sudo-sudo.html' title='設定 sudo 時要記得禁止一般權限使用者執行 sudo sudo'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-4938543903665409187</id><published>2011-07-14T16:31:00.001+08:00</published><updated>2011-07-15T09:12:06.560+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openfind'/><title type='text'>Openfind 2011 Solution Day 筆記</title><content type='html'>上週四（7/7）去參加 Openfind 2011 Solution Day，活動辦的還不錯。昨天收到行銷寄來的 mail，說是完整的 session 投影片和錄影可以到他們家網站線上觀看，分為&lt;a href="http://www.openfind.com/2011solutionday/movie.html"&gt;影片欣賞&lt;/a&gt;和&lt;a href="http://www.openfind.com/2011solutionday/download.html"&gt;簡報下載&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;我覺得最精采的是第二個 session：CEH (白帽駭客) OpenBlue 雲端入侵-郵件攻擊與密碼竊取，在現場講師直接用 VM demo 受害人打開惡意的電子郵件，點了惡意的 URL 或者圖片以後，電腦就被植入後門，此時攻擊者便可為所欲為，包括鍵盤側錄、即時螢幕擷取、web cam 擷取等等。現場看到 demo 真的非常 high 阿！&lt;br /&gt;&lt;br /&gt;以下列出一些心得：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;由於 &lt;a href="http://en.wikipedia.org/wiki/GPGPU"&gt;GPGPU&lt;/a&gt; 愈來愈盛行，加上 CPU 的運算能力仍在持續提高，現在長度在 16 位以下的密碼都不夠安全，很容易被暴力破解。參考：&lt;a href="http://www.techbang.com.tw/posts/6117-gpu-explosive-force-to-crack-the-code-the-establishment-of-high-strength-password-to-see-here"&gt;T客邦-iPhone 密碼被公開、GPU 極速破解密碼，教你建立高強度密碼&lt;/a&gt;。（看來近期內要趕快研究一下怎樣用 &lt;a href="http://playpcesor.blogspot.com/2011/05/lastpass.html"&gt;LastPass&lt;/a&gt; 或者 &lt;a href="http://playpcesor.blogspot.com/2008/02/keepass-password-safe.html"&gt;KeePass Password Safe&lt;/a&gt; 之類的解決方案了，重點是要支援 SmartPhone 阿！在 SmartPhone 上面要輸入複雜密碼實在太困難了。）&lt;/li&gt;&lt;li&gt;社交工程電子郵件攻擊非常難擋，郵件內容看來完全沒有異狀，被植入後門之後電腦也完全不覺的有任何異常，真的是無聲無息。另一點是，印象中 demo 的時候受害的 pc 都是 Win XP，如果可以的話應該盡量避免使用這款&lt;span class="Apple-style-span" style="color: red;"&gt;全世界最危險的 OS&lt;/span&gt;。&lt;/li&gt;&lt;li&gt;web cam 平常關閉是沒用的，一旦被入侵，攻擊者可以直接由遠端下指令啟動 web cam，因此除了把網路線拔掉，從此只用電腦玩單機遊戲這種超激進的作法以外，最好的作法就是 web cam 沒有用的時候要&lt;span class="Apple-style-span" style="color: red;"&gt;用厚的黑紙貼起來&lt;/span&gt;，這樣才不會被偷拍，而且使用 web cam 的時候要衣著整齊。當然如果愛用 web cam 玩一些很刺激的視訊的人就只好自求多福了。家中有女性的人一定要特別注意這一點。&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;2011-07-15&lt;/span&gt;：毛哥在 buzz 的回應提醒我，web cam 應該分為外接式和內建的兩種。外接式的web cam沒有使用就應該拔掉，內建的 web cam 沒用的時候最好要貼起來。&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;2011-07-15&lt;/span&gt;：現在很多駭客會把病毒/木馬放到 Dropbox，因為 Dropbox 不會對用戶上傳的檔案進行掃毒。因此除了 email 中的 MS Office 附件 (e.g., .doc, .ppt, 圖檔) 可能很毒以外，在 Dropbox 上公開 share 出來的檔案也可能很毒。我覺得以後這些檔案最好都用 &lt;span class="Apple-style-span" style="color: red;"&gt;Google Docs&lt;/span&gt; 來打開會比較保險，畢竟每個 tab 都是跑在一個 sandbox 裡面，萬一真的開到有毒、又沒有被防毒軟體偵測到的檔案也比較不會造成系統被感染。&lt;/li&gt;&lt;/ul&gt;再來是第三個 session：導入零負擔，個資防護及訊息保全大揭密，也不錯。講師講的很流利，對個資法也蠻熟的，等到法令正式頒佈實施以後對於軟體廠商來講會產生很多商機，所有公司都應該及早全面檢視相關的議題，這種東西突然要趕工是做不完也做不好的。&lt;br /&gt;&lt;br /&gt;以上是今年參加 Openfind Solution Day 的簡單心得，希望明年有機會再去參加 :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-4938543903665409187?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/4938543903665409187/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=4938543903665409187&amp;isPopup=true' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4938543903665409187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4938543903665409187'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/07/openfind-2011-solution-day.html' title='Openfind 2011 Solution Day 筆記'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-4946282082533165820</id><published>2011-04-26T11:50:00.000+08:00</published><updated>2011-04-26T11:50:42.336+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>隨機將雲端/分散式系統中的 processes/services 刪除，以測試系統的容錯能力 - Netflix &amp; Chaos Monkey</title><content type='html'>上禮拜四 (4/21) 在 InfoQ 看到一個大新聞：&lt;a href="http://www.infoq.com/news/2011/04/amazon-ec2-outage"&gt;Major Outage on Amazons EC2 US-East Datacenter - Many Sites Affected&lt;/a&gt;，災情相當慘重，不少最近以 Amazon 的 IaaS solution 為基礎的新興熱門網站都掛了 (e.g., Foursquare, Quora, Heroku)，最後拖了整整3天才完全修復。&lt;br /&gt;&lt;br /&gt;接下來的幾天 Amazon 當然是全力搶修，在週末將服務修復後，網路上陸續出現很多評論 &amp;amp; 分析的文章。昨天早上看到 Phil Wainewright 寫的 &lt;a href="http://www.zdnet.com/blog/saas/seven-lessons-to-learn-from-amazons-outage/1296"&gt;Seven lessons to learn from Amazon's outage&lt;/a&gt;，其中讓我最 shock 的就是第六點「Understanding the trade-offs help you frame what to ask」中所說，Netflix 內部寫了一個叫做 &lt;span style="color: red;"&gt;Chaos Monkey&lt;/span&gt; 的 daemon，它的作用就是隨機的將 Netflix 系統中的各個 processes/service 刪除，看看系統的存活能力是否有達到當初的設計！因此在這次的大災難中 Netflix 的系統仍可正常運作，在眾多倒地不起的網站中顯得一枝獨秀！&lt;br /&gt;(原文請參考 ReadWriteWeb: &lt;a href="http://www.readwriteweb.com/cloud/2010/12/chaos-monkey-how-netflix-uses.php"&gt;Chaos Monkey: How Netflix Uses Random Failure to Ensure Success&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;Chaos Monkey&lt;/span&gt; 的運作方式對於資深的前輩們可能不是什麼新的觀念 (e.g., &lt;a href="http://www.folklore.org/StoryView.py?project=Macintosh&amp;amp;story=Monkey_Lives.txt"&gt;Monkey Lives&lt;/a&gt;)，但是對我來說真的是蠻大的衝擊。在傳統的維運架構中，為了要測試系統的容錯能力，不管是 active/backup 的 Web/DB/AP Server、 NIC binding 要測試 failover/failback，redundant power supply，都必須事先擬定演練計畫，詳列所有操作步驟的 SOP (如何製造 failover 的狀態，如何確認是否 failback，若操作失敗要如何 rollback 等等)，所有相關人員從業務單位的 PM、開發單位到維護單位都如臨大敵，演練當天(有時候還必須要挑凌晨的時段)戰戰兢兢的按表操課。也因此這類的測試頂多一季到半年做一次，而且這還是所有元件都 tightly-coupled、所有環境都在完全掌握中的系統，還不是環境無法 100% 完全掌握的分散式系統呢！&lt;br /&gt;&lt;br /&gt;相較之下，&lt;span style="color: red;"&gt;Chaos Monkey&lt;/span&gt; 的作法則是在 &lt;span style="color: red;"&gt;Production 系統&lt;/span&gt;中常駐一個 daemon (相當於 Windows 中的 Service)，不定時的將系統中的重要 process/services 刪除！例如有個神經病忽然發作登入系統把 Oracle 的 process 通通 kill 掉！&lt;br /&gt;&lt;br /&gt;這時候系統應該如何反應？能否在短時間內偵測到 Oracle fail，趕快在其他地方 (e.g., 另一個 Region / Availability Zone 中) 另起爐灶 (e.g., 啟動 backup Oracle server)？ 在備援機制接手之前，或者此問題無法在短時間內解決時，如何做到 &lt;a href="http://en.wikipedia.org/wiki/Fault-tolerant_system"&gt;graceful degradation&lt;/a&gt; (例如 Netflix 的 recommendation 系統掛了，無法顯示推薦影片，就改為顯示目前最熱門的影片)？這些就是當初建置 &lt;span style="color: red;"&gt;Chaos Monkey&lt;/span&gt; 這套機制希望可以自動測試的，看看系統反應是否如設計的一樣達到很高的容錯能力。&lt;br /&gt;&lt;br /&gt;分散式系統在設計的時候當然會考量到上述的各種情況，系統中的元件會做好適當的切割，設法避免一個元件 fail 以後拖垮整個服務。在高水準的團隊中會採用 Test-Driven Development (TDD) 的方式來開發，透過 Continuous Integration (CI) 來每天驗證系統是否符合設計。但是自動測試有其極限，許多時候更需要透過 mock object 或者 stub 來&lt;span style="color: red;"&gt;模擬&lt;/span&gt;其他元件的反應，並無法 100% 保證系統實際執行時會符合預期，而 &lt;span style="color: red;"&gt;Chaos Monkey&lt;/span&gt; 則是直接把 Production 系統中正在運作的元件給砍掉，如此才能在真實環境中真正去驗證系統的容錯能力，並且發掘設計時沒想到的問題。&lt;br /&gt;&lt;br /&gt;要讓 &lt;span style="color: red;"&gt;Chaos Monkey&lt;/span&gt; 這套機制順利運作，除了技術上的挑戰之外，也要整個組織文化的配合，如果這隻猴子剛好挑在半夜的時候發瘋，真的把系統搞掛了，相關的人就沒辦法安穩的睡個好覺了，而且對於營收以及公司商譽的衝擊也是很大的風險，因此若是想要在已經成熟的系統或者傳統的大公司導入這套機制，想必會遇到重重阻礙。Starup 就比較沒有這種包袱，若能在一開始建立系統的時候就建置並執行如 &lt;span style="color: red;"&gt;Chaos Monkey&lt;/span&gt; 的機制，未來這個系統的體質一定會非常的強健。&lt;br /&gt;&lt;br /&gt;最後就 quote &lt;a href="http://techblog.netflix.com/2010/12/5-lessons-weve-learned-using-aws.html"&gt;Netflix Tech Blog&lt;/a&gt; 中的一句話作結吧：&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;The best way to avoid failure is to fail constantly.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;後記：昨天下午又在 Jeff Atwood 的 Coding Horror 看到一篇：&lt;a href="http://www.codinghorror.com/blog/2011/04/working-with-the-chaos-monkey.html"&gt;Working with the Chaos Monkey&lt;/a&gt; (裡面有隻看起來很機車的猴子插圖)，Jeff 提到他在一年多前就在 Netflix 的 Tech Blog 看到關於 &lt;span style="color: red;"&gt;Chaos Monkey&lt;/span&gt; 的說明 (&lt;a href="http://techblog.netflix.com/2010/12/5-lessons-weve-learned-using-aws.html"&gt;5 Lessons We've Learned Using AWS&lt;/a&gt;)，但後來太忙了就忘記寫心得 XD&amp;nbsp; 在這篇文章的回應中，有人又提到 &lt;a href="http://www.folklore.org/StoryView.py?project=Macintosh&amp;amp;story=Monkey_Lives.txt"&gt;Monkey Lives 的故事&lt;/a&gt;，應該可以說是 automatic monkey teesting 的始祖吧，很值得一讀～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-4946282082533165820?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/4946282082533165820/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=4946282082533165820&amp;isPopup=true' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4946282082533165820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4946282082533165820'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/04/processesservices-netflix-chaos-monkey.html' title='隨機將雲端/分散式系統中的 processes/services 刪除，以測試系統的容錯能力 - Netflix &amp; Chaos Monkey'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-4538164034981442426</id><published>2011-04-01T16:07:00.001+08:00</published><updated>2011-04-01T16:07:35.610+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='排程'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='routine'/><title type='text'>[ASP.NET] 在 Web 專案中進行排程工作</title><content type='html'>其實在很久之前坎尼就想研究這樣的東西了   &lt;br /&gt;概念大致上曉得，只是一直沒時間去實作出來   &lt;br /&gt;這幾天有些時間就去翻了一下資料，把它實作出來   &lt;br /&gt;  &lt;br /&gt;坎尼在以前公司的做法有下列幾個：   &lt;li&gt;另外再寫一個 windows service 來執行 &lt;/li&gt;  &lt;li&gt;用 Windows Form 寫成 AP，再用內建的工作排程來定期執行    &lt;br /&gt;    &lt;br /&gt;不多說，馬上進入正題     &lt;hr /&gt;    &lt;h3&gt;I. 概念&lt;/h3&gt; 排程這個東西，就是&lt;font color="#0000ff"&gt;&lt;strong&gt;指定好時間&lt;/strong&gt;，時間一到程式就會&lt;strong&gt;自動&lt;/strong&gt;去&lt;strong&gt;執行&lt;/strong&gt;&lt;/font&gt;     &lt;br /&gt;在 ASP.NET 裡，坎尼主要是利用 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.threading.timer.aspx" target="_blank"&gt;System.Thread.Timer&lt;/a&gt; 來進行排程設定     &lt;br /&gt;其他說明可詳見Bill叔所寫的 &lt;a href="http://www.dotblogs.com.tw/billchung/archive/2009/05/03/8277.aspx" target="_blank"&gt;&amp;lt;三種時間人&amp;gt;&lt;/a&gt;     &lt;br /&gt;接著在 Timer callback 事件中撰寫要系統做的事 &lt;font color="#808080"&gt;&lt;strike&gt;(抓正妹圖之類的…)&lt;/strike&gt;       &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;    &lt;h3&gt;II.實作 &lt;/h3&gt; 首先，新增一個 Web 專案 (似乎是廢話)     &lt;br /&gt;在專案中新增一個 &lt;strong&gt;&lt;font color="#0000ff"&gt;Global.asax&lt;/font&gt;&lt;/strong&gt; 檔 &lt;font color="#ff0000"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TZWHsqxew7I/AAAAAAAAFF0/5gWNpZr9ayM/s1600-h/wr_01%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wr_01" border="0" alt="wr_01" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TZWHtlOu4bI/AAAAAAAAFF4/_U3sv2nV_QU/wr_01_thumb%5B2%5D.png?imgmax=800" width="806" height="516" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;接著宣告一個全域的 Timer     &lt;br /&gt;並在 &lt;font color="#ff0000"&gt;&lt;strong&gt;Application_Start&lt;/strong&gt;&lt;/font&gt; 中加入要進行 &lt;font color="#ff0000"&gt;&lt;strong&gt;callback&lt;/strong&gt;&lt;/font&gt; 的事件     &lt;br /&gt;最後再設定&lt;strong&gt;&lt;font color="#0000ff"&gt; Timer 的週期&lt;/font&gt;&lt;/strong&gt;，本範例中是以 5 秒當作一個循環 (50000毫秒)     &lt;br /&gt;&lt;font color="#808080"&gt;(第3個參數為 Timer 要在多少毫秒之後啟動事件&lt;/font&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TZWHuN7tehI/AAAAAAAAFF8/VCyecpy-KyE/s1600-h/wr_02%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wr_02" border="0" alt="wr_02" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TZWHuh1ZnaI/AAAAAAAAFGA/MjFUz2wzfNY/wr_02_thumb%5B3%5D.png?imgmax=800" width="605" height="241" /&gt;&lt;/a&gt;     &lt;br /&gt;範例中所做的事就只是把時間寫進一個文字檔     &lt;br /&gt;&lt;font color="#808080"&gt;(由於 sample 沒做好處理，很容易當掉 XD&lt;/font&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TZWHvSID7GI/AAAAAAAAFGE/dsBvasizNmA/s1600-h/wr_03%5B4%5D.png"&gt;      &lt;br /&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wr_03" border="0" alt="wr_03" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TZWHwKrmK7I/AAAAAAAAFGI/ycBUXzUYkXs/wr_03_thumb%5B2%5D.png?imgmax=800" width="713" height="230" /&gt;&lt;/a&gt;     &lt;br /&gt;進行測試，在 Visual Studio 中按 F5 (讓虛擬&lt;font color="#0000ff"&gt;伺服器啟動&lt;/font&gt;)     &lt;br /&gt;    &lt;br /&gt;&lt;font color="#008040"&gt;注意，由於是另外開個 Thread      &lt;br /&gt;所以在伺服器關掉之前都會持續進行 callback事件       &lt;br /&gt;&lt;/font&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TZWHw5Jt7FI/AAAAAAAAFGM/bkvUCzlfKfk/s1600-h/wr_04%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wr_04" border="0" alt="wr_04" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TZWHxh2-fGI/AAAAAAAAFGQ/K3m-vqTqCQ8/wr_04_thumb%5B2%5D.png?imgmax=800" width="547" height="463" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;測試結果，果然有成功的在 background 進行寫時間 log 的動作     &lt;br /&gt;    &lt;br /&gt;    &lt;h3&gt;III. 小結&lt;/h3&gt; 本次的&lt;a href="http://dl.dropbox.com/u/4862785/BlogSrc/WebRoutine.zip" target="_blank"&gt;範例下載&lt;/a&gt;     &lt;br /&gt;有興趣的人可以回去研究如何應用 :p     &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/li&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-4538164034981442426?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/4538164034981442426/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=4538164034981442426&amp;isPopup=true' title='7 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4538164034981442426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4538164034981442426'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/04/aspnet-web.html' title='[ASP.NET] 在 Web 專案中進行排程工作'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_bGOQZqQ9oEM/TZWHtlOu4bI/AAAAAAAAFF4/_U3sv2nV_QU/s72-c/wr_01_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1512707295893476097</id><published>2011-02-11T01:17:00.002+08:00</published><updated>2011-09-16T14:50:51.857+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NPOI'/><category scheme='http://www.blogger.com/atom/ns#' term='WebUserControl'/><title type='text'>[NPOI] 輕鬆地將 GridView 匯出成試算表-修正版</title><content type='html'>之前坎尼有發佈一版 Web User Control，讓 GridView 可以輕鬆匯出成 Excel  &lt;br /&gt;&lt;font color="#808080"&gt;(詳見 &lt;/font&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/12/npoi-gridview.html" target="_blank"&gt;&lt;font color="#808080"&gt;[NPOI] 輕鬆地將 GridView 匯出成試算表&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;)&lt;/font&gt;   &lt;br /&gt;&lt;br /&gt;後來有讀者發信來問：&lt;font color="#008000"&gt;「為什麼他匯出的檔案標題列都是&lt;strong&gt;空白&lt;/strong&gt;?」 &lt;/font&gt;  &lt;br /&gt;經一番追查之後發現，原來是 GridView 啟用了排序 (&lt;strong&gt;AllowSorting&lt;/strong&gt;)   &lt;br /&gt;&lt;font color="#ff0000"&gt;HeaderText 會自動&lt;strong&gt;轉換成 LinkButton&lt;/strong&gt; &lt;/font&gt;  &lt;br /&gt;以至於原本抓取標題部分的程式碼只抓到空白文字   &lt;br /&gt;&lt;br /&gt;於是坎尼稍做了一下修改，如下圖紅框所示   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TVQdkPfNA7I/AAAAAAAAEnU/4GR3i9-McxM/s1600-h/ec_01%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ec_01" border="0" alt="ec_01" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TVQdk5GnXlI/AAAAAAAAEnY/u1g7mB4Win0/ec_01_thumb%5B2%5D.png?imgmax=800" width="857" height="483" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;可以看到，不論標題是否可排序   &lt;br /&gt;新版本的 Web User Control 仍可以抓取標題文字   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TVQdlWfA7XI/AAAAAAAAEnc/PrSg4d4E-8k/s1600-h/ec_02%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ec_02" border="0" alt="ec_02" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TVQdliU-FJI/AAAAAAAAEng/V6ldVVbdMHs/ec_02_thumb%5B2%5D.png?imgmax=800" width="443" height="254" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TVQdmDLy_UI/AAAAAAAAEnk/Uepc1UKJTFg/s1600-h/ec_03%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ec_03" border="0" alt="ec_03" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TVQdmmIW4_I/AAAAAAAAEno/M3JQpejsDcI/ec_03_thumb%5B2%5D.png?imgmax=800" width="446" height="254" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;br /&gt;請有需求的讀者到 &lt;a href="http://dl.dropbox.com/u/4862785/BlogSrc/NPOIExportControlv2.zip" target="_blank"&gt;這邊&lt;/a&gt; 下載&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-1512707295893476097?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/1512707295893476097/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=1512707295893476097&amp;isPopup=true' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1512707295893476097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1512707295893476097'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/02/npoi-gridview.html' title='[NPOI] 輕鬆地將 GridView 匯出成試算表-修正版'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_bGOQZqQ9oEM/TVQdk5GnXlI/AAAAAAAAEnY/u1g7mB4Win0/s72-c/ec_01_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1722037265492693369</id><published>2011-02-10T09:00:00.073+08:00</published><updated>2011-02-10T09:00:01.391+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chart Control'/><category scheme='http://www.blogger.com/atom/ns#' term='DNN'/><title type='text'>在自行撰寫的 DNN Module 中使用 &amp; 列印 Microsoft Chart Controls 的注意事項</title><content type='html'>前陣子因緣際會的又摸了一下 &lt;a href="http://www.dotnetnuke.com/"&gt;DNN&lt;/a&gt;，根據官網上的 &lt;a href="http://www.dotnetnuke.com/Resources/Training/BasicModuleDevelopment/tabid/1606/Default.aspx"&gt;Basic DotNetNuke Module Development Video&lt;/a&gt; 教學影片的說明開始自行撰寫模組，並且在模組中用到 &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c"&gt;Microsoft Chart Controls&lt;/a&gt; 來呈現圖表。過程中陸續遇到一些問題，以下是解法。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;問題一：error: Invalid temp directory in chart handler configuration [c:\TempImageFiles\]&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;這個問題挺好解的，因為錯誤訊息很明確，直接 Google 就可以找到&lt;a href="http://social.msdn.microsoft.com/Forums/en/MSWinWebChart/thread/92238582-9445-4d15-a5a7-5f24fd4bf646"&gt;解法&lt;/a&gt;，重點在於自己新增的 DNN Module 專案（位於 C:\inetpub\wwwroot\dotnetnuke\DesktopModules\&lt;i&gt;[YourModule]&lt;/i&gt;）下的 web.config 是找不到 Chart Handler 的設定的，必須要去找最上層的 DNN 站台的 web.config，位置是&amp;nbsp;C:\inetpub\wwwroot\dotnetnuke\web.config：&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/_qUfPJWk25s0/TUqZg1Ewf3I/AAAAAAAAGCQ/-mRHxFjiGD0/s1600/DNN_SiteConfig.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="330" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TUqZg1Ewf3I/AAAAAAAAGCQ/-mRHxFjiGD0/s400/DNN_SiteConfig.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;找對 web.config 檔案以後，把多餘的「c:\TempImageFiles\」設定刪除，或者指定一個確實存在且有寫入權限的目錄即可。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;問題二：無法列印 Chart Control 圖表，列印時會看到表示圖檔不存在的紅色叉叉&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;經過一番搜尋，最後在 &lt;a href="http://stackoverflow.com/"&gt;StackOverflow&lt;/a&gt; 找到&lt;a href="http://stackoverflow.com/questions/4347220/microsofts-chart-controls-not-printing-in-an-asp-net-application"&gt;這篇文章&lt;/a&gt;，雖然該文作者說在 web.config 的 ChartImageHandler 設定中加上「deleteAfterServcing=false」對他們的專案&lt;span class="Apple-style-span" style="color: red;"&gt;偶爾&lt;/span&gt;也沒作用，但我試著加上這個設定之後，測試到目前為止每次都可以順利的把圖表列印出來！而從這個問題一直到現在都沒人回覆的狀況來看，大概只有極少數狀況在加上此設定以後仍然無法確保100% 正確的執行結果，因此有需要列印 Chart Control 的內容的話，加上這個設定就沒錯啦！（看起來就是叫系統不要把暫存圖檔立刻刪掉）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上就是最近在 DNN Module 中使用 Microsoft Chart Control 遇到的問題 &amp;amp; 解法，有了這次的經驗，下次開發就可以更順利啦！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-1722037265492693369?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/1722037265492693369/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=1722037265492693369&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1722037265492693369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1722037265492693369'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/02/dnn-module-microsoft-chart-controls.html' title='在自行撰寫的 DNN Module 中使用 &amp; 列印 Microsoft Chart Controls 的注意事項'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_qUfPJWk25s0/TUqZg1Ewf3I/AAAAAAAAGCQ/-mRHxFjiGD0/s72-c/DNN_SiteConfig.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3304356431297040610</id><published>2011-02-05T09:00:00.085+08:00</published><updated>2011-02-05T09:00:01.623+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>IIS 7.5 設定網站的實體路徑執行身分 (Physical Path Credentials) 時，AD 帳密輸入錯誤不會跳出錯誤訊息</title><content type='html'>去年底去恆逸上了一堂 &lt;a href="http://www.microsoft.com/systemcenter/en/us/virtual-machine-manager.aspx"&gt;SCVMM&lt;/a&gt; 的課（&lt;a href="http://www.microsoft.com/learning/en/us/course.aspx?ID=6331A&amp;amp;locale=en-us"&gt;Microsoft Official Course 6331A: Deploying and Managing Microsoft System Center Virtual Machine Manager&lt;/a&gt;），在實作的過程中一切都很順利，但是在我要打開 &lt;a href="http://msdn.microsoft.com/en-us/library/ms159106.aspx"&gt;SSRS&lt;/a&gt; 的報表網站來檢視報表時，卻一直跳出類似「網站無法存取」的錯誤，但是老師和課堂上其他同學的系統都很正常。&lt;br /&gt;&lt;br /&gt;接下來就是恐怖的 debug 時間，老師親自過來在我的機器上測試各種設定，從 IIS、SSRS、AD、VMM Admin Console 一路到 SCOM 都查遍了，甚至把 VMM Admin Console 和 SCOM 砍掉重裝，問題還是沒有解決。最後花了將近一個半小時，終於找出問題！原因就是在設定 IIS &amp;amp; SSRS 網站的時候，設定「實體路徑執行身分 (Physical Path Credentials)」時要輸入 AD 的帳密，此時如果帳密輸入錯誤，IIS 是不會跳出錯誤訊息的！！！&lt;br /&gt;&lt;br /&gt;「實體路徑執行身分 (Physical Path Credentials)」的位置在哪裡呢？以 IIS 7.5 為例：&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/_qUfPJWk25s0/TUdfR1LaU6I/AAAAAAAAGB8/3giH3ZDwE4Y/s1600/IIS+7.5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="277" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TUdfR1LaU6I/AAAAAAAAGB8/3giH3ZDwE4Y/s320/IIS+7.5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;在每個網站的 Features View 裡面，右邊的控制面板中間可以看到「Advanced Settings」：&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/_qUfPJWk25s0/TUdgGGBe6oI/AAAAAAAAGCA/7ic75lMsm78/s1600/IIS_SiteDefaultPage.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="287" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TUdgGGBe6oI/AAAAAAAAGCA/7ic75lMsm78/s400/IIS_SiteDefaultPage.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;點進去以後，可以看到「Physical Path Credentials」這個設定值：&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/_qUfPJWk25s0/TUdgqvnjNtI/AAAAAAAAGCE/rM89qxBNKkE/s1600/IIS_AdvancedSettings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TUdgqvnjNtI/AAAAAAAAGCE/rM89qxBNKkE/s400/IIS_AdvancedSettings.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;在接下來的設定畫面中，要把預設的「Application user (pass-through authentication)」改為「Specific user」，並在此處輸入 AD 的帳密：&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/_qUfPJWk25s0/TUdhLdCk9HI/AAAAAAAAGCI/coJ17AEcxnY/s1600/IIS_advancedSettings_AccPwd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="335" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TUdhLdCk9HI/AAAAAAAAGCI/coJ17AEcxnY/s400/IIS_advancedSettings_AccPwd.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&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;在這裡雖然 Password 有 confirm 的機制，但是若連續兩次輸入錯誤（暈倒），IIS 就會接受這個錯誤的密碼，而後當網站實際上執行，以這組帳密去驗證時就會失敗，進而產生「網站無法存取」或者「存取被拒」之類的錯誤訊息了！&lt;br /&gt;&lt;br /&gt;雖然說密碼連續兩次輸入錯誤還蠻扯的，但是若是跟我一樣習慣盲打的人，有時候用到一支鍵位配置跟平常習慣的鍵位不一樣的鍵盤時，是可能會連續兩次輸入錯的一模一樣的字串的。特別是這個欄位是密碼欄位，在畫面上看不到實際輸入的內容，因此當系統顯然沒有真的嘗試用此組帳密進行驗證，只是單純用 confirm password 的方式驗證時，就會發生這次的狀況了！&lt;br /&gt;&lt;br /&gt;在這樣的狀況下，最好的作法就是設定完 AD 帳密以後，馬上試著打開網站看看能否正常運作，如果發現問題的話才有機會回頭檢查設定是否有誤。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;後記：&lt;br /&gt;&lt;br /&gt;雖然我只有用 IIS 7.5 來驗證，但是既然最新版的 IIS 都會有這問題，那麼舊版應該也是免不了的 ~&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3304356431297040610?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3304356431297040610/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3304356431297040610&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3304356431297040610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3304356431297040610'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/02/iis-75-physical-path-credentials-ad.html' title='IIS 7.5 設定網站的實體路徑執行身分 (Physical Path Credentials) 時，AD 帳密輸入錯誤不會跳出錯誤訊息'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qUfPJWk25s0/TUdfR1LaU6I/AAAAAAAAGB8/3giH3ZDwE4Y/s72-c/IIS+7.5.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-5119529189004997431</id><published>2011-02-02T23:06:00.002+08:00</published><updated>2012-01-10T22:16:18.131+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>[無用小工具] 大樂透對獎程式</title><content type='html'>好久沒寫這個系列了    &lt;br /&gt;這次剛好台灣彩卷要開出100組的對獎號碼     &lt;br /&gt;所以坎尼順手寫了個對獎小程式 &lt;font color="#808080"&gt;(不然100組會對到眼花吧…) &lt;/font&gt;  &lt;hr /&gt;首先是 &lt;a href="http://dl.dropbox.com/u/4862785/BlogSrc/BigLot.zip" target="_blank"&gt;程式下載&lt;/a&gt;   &lt;br /&gt;&lt;br /&gt;以下為使用說明：   &lt;br /&gt;解壓之後會有三個檔案   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TUly6MoYF1I/AAAAAAAAElw/kHJTxKCVkUU/s1600-h/bl_00%5B6%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bl_00" border="0" alt="bl_00" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TUly64Nr_JI/AAAAAAAAEl0/zQyPMZLulF0/bl_00_thumb%5B4%5D.png?imgmax=800" width="616" height="184" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;Lottery.exe&lt;/strong&gt; =&amp;gt; 主執行檔   &lt;br /&gt;&lt;strong&gt;l.xml&lt;/strong&gt; =&amp;gt; 預設的開獎號碼&lt;font color="#808080"&gt; (可用 notepad 打開修改)&lt;/font&gt;   &lt;br /&gt;&lt;strong&gt;numbers.xml&lt;/strong&gt; =&amp;gt; 對獎號碼範例 &lt;font color="#808080"&gt;(可用 notepad 打開修改)&lt;/font&gt;   &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;預設的開獎號碼 (l.xml)&lt;/h4&gt;&lt;br /&gt;數字用空格分隔，記得特別號要放在最後一碼   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TUly7TFgbpI/AAAAAAAAEl4/XC39fnxxsP0/s1600-h/bl_05%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bl_05" border="0" alt="bl_05" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TUly8OrQSeI/AAAAAAAAEl8/9fbWElNrARk/bl_05_thumb%5B3%5D.png?imgmax=800" width="411" height="105" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;主程式畫面&lt;/h4&gt;&lt;br /&gt;加入對獎號碼有三種方式   &lt;ol&gt;&lt;li&gt;手輸&lt;font color="#0000ff"&gt; (用空格分隔) &lt;/font&gt;&lt;/li&gt;&lt;li&gt;用選的 &lt;/li&gt;&lt;li&gt;載入 xml 檔 &lt;/li&gt;&lt;/ol&gt;圖中藍色框框則為對獎按鈕   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TUly8x-I79I/AAAAAAAAEmA/Lk_h4t3wENI/s1600-h/bl_01%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bl_01" border="0" alt="bl_01" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TUly92r3kWI/AAAAAAAAEmE/uM39ZFHdLn8/bl_01_thumb%5B2%5D.png?imgmax=800" width="380" height="341" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;手輸，記得用空格區隔數字   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TUly-kWKJDI/AAAAAAAAEmI/w3vFLzsftMs/s1600-h/bl_03%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bl_03" border="0" alt="bl_03" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TUly_R2wdJI/AAAAAAAAEmQ/3h1Xh0OfMwQ/bl_03_thumb%5B2%5D.png?imgmax=800" width="380" height="341" /&gt;&lt;/a&gt;   &lt;br /&gt;用選的，選完六個號碼之後按下&lt;strong&gt;確定&lt;/strong&gt;即會把選好的號碼回傳   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TUlzAALjkuI/AAAAAAAAEmU/IZ51_mXeY5E/s1600-h/bl_02%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bl_02" border="0" alt="bl_02" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TUlzBIaM9qI/AAAAAAAAEmY/fL30ceddTxY/bl_02_thumb%5B2%5D.png?imgmax=800" width="524" height="361" /&gt;&lt;/a&gt;   &lt;br /&gt;xml 檔格式，可開啟範例檔以同樣的方式進行修改   &lt;br /&gt;一樣是用空格來分隔數字   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TUlzB-WbhlI/AAAAAAAAEmc/E6kFvTQHRzM/s1600-h/bl_04%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bl_04" border="0" alt="bl_04" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TUlzCVrS2LI/AAAAAAAAEmg/5uJblaTB-AM/bl_04_thumb%5B2%5D.png?imgmax=800" width="408" height="282" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;對獎&lt;/h4&gt;&lt;br /&gt;確定載入自己的對獎號碼之後，即可進行對獎動作   &lt;br /&gt;點下右下方的對獎按鈕，程式就會自動執行對獎   &lt;br /&gt;並將結果顯示在號碼後方的狀態欄中 (如下圖)   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TUlzDZweWyI/AAAAAAAAEmk/E-gdsDW510I/s1600-h/bl_06%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bl_06" border="0" alt="bl_06" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TUlzEFkfq5I/AAAAAAAAEmo/l4CQSkLpZZI/bl_06_thumb%5B2%5D.png?imgmax=800" width="380" height="341" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;strike&gt;以上為自得其樂的中頭彩示範    &lt;br /&gt;&lt;/strike&gt;  &lt;br /&gt;不過現在&lt;a href="http://www.taiwanlottery.com.tw/lotto/mega/result_all.aspx" target="_blank"&gt;台彩網站&lt;/a&gt;似乎流量爆了   &lt;br /&gt;要得到開獎號碼可能要再等晚一點 XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-5119529189004997431?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/5119529189004997431/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=5119529189004997431&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5119529189004997431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5119529189004997431'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/02/blog-post.html' title='[無用小工具] 大樂透對獎程式'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_bGOQZqQ9oEM/TUly64Nr_JI/AAAAAAAAEl0/zQyPMZLulF0/s72-c/bl_00_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3178662761723581250</id><published>2011-02-02T19:00:00.000+08:00</published><updated>2011-02-02T19:00:17.159+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>如何升級 MacOS X 內建的 vim</title><content type='html'>雖然說 MacOS X 內建的 vim 版本已經很新 (v7.2, 2008-08-09)，但有些軟體會利用到最新版 vim 的功能 (v7.3, 2010-08-15)，如T客邦介紹的：&lt;a href="http://www.techbang.com.tw/posts/4595-gmail-received-with-vim?comment_page=2"&gt;vmail&lt;/a&gt;&amp;nbsp;(see &lt;a href="http://danielchoi.com/software/vmail.html"&gt;Prerequisites&lt;/a&gt;)，就一定要使用 vim v7.3 才能正確運作，那麼要如何升級 MacOS 中內建的 vim 呢？&lt;br /&gt;&lt;br /&gt;我一開始先找到了這個&lt;a href="http://hints.macworld.com/article.php?story=20010421114134645"&gt;參考資料&lt;/a&gt;，直接下載最新版的 vim source code 來自己編譯 &amp;amp; 安裝，雖然步驟看來沒啥特別，但是後來沒有成功。又經過一番搜尋之後，我發現一個更簡單的作法，只要安裝 &lt;a href="http://code.google.com/p/macvim/"&gt;MacVim&lt;/a&gt;&amp;nbsp;(a port of the text editor Vim to MacOS X，之後再開啟 terminal 修改 home 目錄下的 .profile 隱藏檔，加上以下兩行即可：&lt;br /&gt;&lt;br /&gt;alias vim=/Applications/MacVim.app/Contents/MacOS/Vim&lt;br /&gt;alias vi=vim&lt;br /&gt;&lt;br /&gt;簡單說就是把vim這個指令作為MacVim執行檔的alias就可以了。要確認此 alias 是否生效，要先登出再登入 OS，再於 terminal 執行 vim --version 來確認目前執行的是最新版 (v7.3) 的 vim。&lt;br /&gt;&lt;br /&gt;有些資料會寫說在 home 目錄下新增一個原本不存在的 .bash_profile 隱藏檔（跟一般 linux 一樣），而後在 .bash_profile 中加上那兩行就可以，但我測試以後發現 .bash_profile 沒有作用，在 Mac OS 中還是直接修改 home 目錄下原本就已經存在的 .profile 隱藏檔比較正確&amp;amp;有效。&lt;br /&gt;&lt;br /&gt;參考資料：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/macvim/"&gt;macvim 官網&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3178662761723581250?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3178662761723581250/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3178662761723581250&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3178662761723581250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3178662761723581250'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/02/macos-x-vim.html' title='如何升級 MacOS X 內建的 vim'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3626513321152441941</id><published>2011-01-30T11:26:00.000+08:00</published><updated>2011-01-30T11:26:58.447+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='joomla'/><title type='text'>Joomla 1.6 安裝注意事項 (手動編譯 Apache HTTP Server &amp; PHP on RHEL 5)</title><content type='html'>在 2011-01-10 的時候 Joomla 推出了&lt;a href="http://www.joomla.org/announcements/general-news/5348-joomlar-16-has-arrived.html"&gt;最新的 1.6 版&lt;/a&gt;，因此我也灌起來玩了一下，過程中發現由於 RHEL 5.3 (Tikanga) 內建的 PHP (5.1.6) 太老舊了，Joomla 1.6 的&lt;a href="http://docs.joomla.org/Joomla_1.6_technical_requirements"&gt;需求&lt;/a&gt;是 5.2.4 以上，因此必須要升級 PHP，也利用這個機會一併把內建的老舊 &lt;a href="http://httpd.apache.org/"&gt;Apache HTTP Server&lt;/a&gt; (2.2.3) 升級 (最新版：2.2.17)，以下就是升級過程中的注意事項。&lt;br /&gt;&lt;br /&gt;安裝的過程基本上很簡單，主要參考 PHP 官網上的 &lt;a href="http://www.php.net/docs.php"&gt;online documentation&lt;/a&gt; -&amp;gt; 在 View Online 的地方選 &lt;a href="http://www.php.net/manual/en/"&gt;English&lt;/a&gt; -&amp;gt; &lt;a href="http://www.php.net/manual/en/install.unix.php"&gt;Installation on Unix systems&lt;/a&gt; -&amp;gt; &lt;a href="http://www.php.net/manual/en/install.unix.apache2.php"&gt;Apache 2.x on Unix systems&lt;/a&gt;&amp;nbsp;上的步驟照做即可，重點在於步驟 5「&lt;span class="Apple-style-span" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px;"&gt;Now, configure and build PHP&lt;/span&gt;」，在這個 configure 範例中只有使用最基本的「--with-mysql」來加入 MySQL 的支援，但這樣對 Joomla 的安裝來說是不夠的。&lt;br /&gt;&lt;br /&gt;在 Joomla 的安裝過程中，會確認 PHP 有 Zlib compression 支援，否則 Joomla 會無法順利安裝。按照官網上的 configure 方式是不包含 Zlib compression 支援的，必須要在 configure 的 option 裡面加上「--with-zlib」才行，也就是：「&lt;span class="Apple-style-span" style="font-family: Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', Monaco, 'Courier New', Courier, monospace; font-size: 14px; white-space: pre;"&gt;./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql &lt;span class="Apple-style-span" style="color: red;"&gt;--with-zlib&lt;/span&gt;」&lt;/span&gt;。&lt;br /&gt;&lt;br /&gt;那麼萬一像我一樣在 configure &amp;amp; make install PHP 之後，開始安裝 Joomla 時才在 check system requirement 的時候發現 PHP 缺少 Zlib compression 支援的話要怎麼辦呢？沒關係，這時候就要靠上一次執行 configure 時自動產生的 config.nice 檔了，config.nice 檔案會記錄上一次執行 configure 所使用的 options，只要編輯這個檔案，以相同的格式加入「--with-zlib」這個 option，然後執行「./config.nice」，最後再重新 make、make install 來重新安裝 PHP 就可以囉（安裝到相同的目錄，把剛剛安裝的版本蓋掉即可）！&lt;br /&gt;&lt;br /&gt;加入「--with-zlib」的 config.nice 內容如下：&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/_qUfPJWk25s0/TUTXlVt67xI/AAAAAAAAGB4/RCi59HODd-0/s1600/Screen+shot+2011-01-30+at+%25E4%25B8%258A%25E5%258D%258811.00.27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TUTXlVt67xI/AAAAAAAAGB4/RCi59HODd-0/s400/Screen+shot+2011-01-30+at+%25E4%25B8%258A%25E5%258D%258811.00.27.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;以第二次根據 config.nice 產生的 Make file 來執行 make 的時候，只會重新編譯新增的部份，因此速度很快。有了 config.nice 千萬要好好利用，不要傻傻的重新執行 configure，這樣會浪費很多時間阿！&lt;br /&gt;&lt;br /&gt;基本上要注意的地方就只有這裡，其他的步驟都按照官網上的範例來做就可以了。Joomla 的安裝也很簡單，基本上就是先檢查執行環境是否符合最低需求，而後把 Joomla 網站複製到指定的目錄，最後產生 configuration.php 的內容就可以運作了。&lt;br /&gt;&lt;br /&gt;可惜的是目前 &lt;a href="http://extensions.joomla.org/extensions/contacts-and-feedback/forms/1659"&gt;Fabrik&lt;/a&gt; 套件的最新版 - 2.0.3 還不支援 Joomla 1.6，一整個就是裝不上去阿，只好過一陣子再測試囉！&lt;br /&gt;&lt;br /&gt;另外順便補充IT黑傑克前陣子寫的 Joomla &amp;amp; Drupal 比較文：&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blackjack.blog.ithome.com.tw/post/110/87576"&gt;不專業架站經驗：架站軟體Joomla還是Drupal？（上）&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blackjack.blog.ithome.com.tw/post/110/87990"&gt;不專業架站經驗：Joomla還是Drupal？（下）&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3626513321152441941?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3626513321152441941/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3626513321152441941&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3626513321152441941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3626513321152441941'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/01/joomla-16-apache-http-server-php-on.html' title='Joomla 1.6 安裝注意事項 (手動編譯 Apache HTTP Server &amp; PHP on RHEL 5)'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qUfPJWk25s0/TUTXlVt67xI/AAAAAAAAGB4/RCi59HODd-0/s72-c/Screen+shot+2011-01-30+at+%25E4%25B8%258A%25E5%258D%258811.00.27.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-4832607550181871445</id><published>2011-01-07T21:54:00.002+08:00</published><updated>2011-01-07T21:59:08.324+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ie8'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>[IE8] 應用 Developer Tool 進行網頁內容自動填寫</title><content type='html'>又到了學期末，在忙不完的報告海之中   &lt;br /&gt;學校的教務系統突然來了一封信，提醒坎尼快去把教學意見調查表填完   &lt;br /&gt;填自己喜愛的課沒問題，但同樣的動作要做幾百次可是麻煩至極   &lt;br /&gt;&lt;strike&gt;尤其是沒什麼收獲的課&lt;/strike&gt;&amp;#160; &lt;br /&gt;於是坎尼就寫了一段 javascript 讓機器自動填答 Orz   &lt;hr /&gt;&lt;h3&gt;I. 找尋 Pattern&lt;/h3&gt;這類型的作業最重要的就是找到可利用的 Pattern   &lt;br /&gt;我們來看一下要填寫的 Form   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TScbJBS7PrI/AAAAAAAAEH0/xYArQCIO4Y0/s1600-h/DTQ023.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="DTQ02" border="0" alt="DTQ02" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TScbJnqnrtI/AAAAAAAAEH4/ilqbpLbzYMc/DTQ02_thumb1.png?imgmax=800" width="242" height="156" /&gt;&lt;/a&gt;   &lt;br /&gt;可以看到，要填答的選項很明顯的是用 input radio 組成   &lt;br /&gt;打開 IE8 的 DevTool (快速鍵為 F12)   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TScbJ7UZn3I/AAAAAAAAEH8/VSoOTKeNWZc/s1600-h/DTQ034.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="DTQ03" border="0" alt="DTQ03" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TScbKQMlGAI/AAAAAAAAEIA/l2h7onSHmD0/DTQ03_thumb2.png?imgmax=800" width="397" height="410" /&gt;&lt;/a&gt;   &lt;br /&gt;果然沒錯，所以只要取出所有的 radio 物件   &lt;br /&gt;再決定要填寫哪個 value 即可   &lt;h3&gt;II. 撰寫 script&lt;/h3&gt;上面得知了目前狀況，稍微來厘清一下步驟: (以非常同意為例)   &lt;br /&gt;&lt;ol&gt;&lt;li&gt;取得 radio 物件 &lt;/li&gt;&lt;li&gt;找出 value 為 1 的物件 &lt;/li&gt;&lt;li&gt;選取      &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;由於要選取物件，這邊坎尼載入擁有有強大選擇器的 jQuery   &lt;br /&gt;&lt;pre  class='brush: js'&gt;var script;&lt;br /&gt;script = document.createElement(&amp;quot;script&amp;quot;);&lt;br /&gt;script.setAttribute('language', 'javascript');&lt;br /&gt;script.setAttribute('type', 'text/javascript');&lt;br /&gt;script.setAttribute('src', 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js');&lt;br /&gt;var head = document.getElementsByTagName('head')[0];&lt;br /&gt;head.appendChild(script);&lt;br /&gt;// 1 非常同意 3 普通 5 非常不同意&lt;br /&gt;$(&amp;quot;input:radio[value=1]&amp;quot;).attr(&amp;quot;checked&amp;quot;,&amp;quot;checked&amp;quot;); &lt;/pre&gt;接著打開 DevTool，把 Tab 切換至指令碼 &lt;br /&gt;將上述程式碼輸入並執行 &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TScbLCaE5cI/AAAAAAAAEIE/-nCOg2JOZoM/s1600-h/DTQ014.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="DTQ01" border="0" alt="DTQ01" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TScbLox9edI/AAAAAAAAEII/dMm3Hutz82Q/DTQ01_thumb2.png?imgmax=800" width="1010" height="710" /&gt;&lt;/a&gt; &lt;br /&gt;很快地，30幾個單選選項都自動填答完成 &lt;br /&gt;&lt;strike&gt;接著只要改幾個自己覺得不滿意的選項即可...&lt;/strike&gt; &lt;br /&gt;&lt;h3&gt;III. 小結&lt;/h3&gt;其實從這邊就可以看出自動化的威力 &lt;br /&gt;簡單的幾行程式就可以把整個 Form 填完 &lt;br /&gt;&lt;br /&gt;&lt;font color="#808080"&gt;(以下為抱怨) &lt;br /&gt;從上面的 sample 其實能夠得知網路問卷的&lt;a href="http://wiki.mbalib.com/zh-tw/%E4%BF%A1%E5%BA%A6" target="_blank"&gt;信度&lt;/a&gt;有多差 &lt;br /&gt;總覺得研究者該做的不是把問卷發一發等著回收就好 &lt;br /&gt;要了解對象的 Deep insight 才是重點 &lt;br /&gt;可惜坎尼看到的都是隨意做一做就放進論文的資料來源 &lt;br /&gt;這樣的論文真的會對世界有幫助嗎?&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-4832607550181871445?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/4832607550181871445/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=4832607550181871445&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4832607550181871445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4832607550181871445'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/01/ie8-developer-tool.html' title='[IE8] 應用 Developer Tool 進行網頁內容自動填寫'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_bGOQZqQ9oEM/TScbJnqnrtI/AAAAAAAAEH4/ilqbpLbzYMc/s72-c/DTQ02_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3227998861804462986</id><published>2011-01-07T09:00:00.135+08:00</published><updated>2011-01-07T09:00:02.190+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='time machine'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>如何將外接硬碟格式化給 Mac 做 Time Machine 備份，同時又可繼續在 Windows/Linux 系統中使用</title><content type='html'>從去年12月多開始，我開始使用&amp;nbsp;&lt;a href="http://www.apple.com/tw/macmini/"&gt;Mac mini&lt;/a&gt; 作為工作機（要遠端連到 Mac Pro / Xserve 的話必須使用 Mac 上特殊的專屬軟體）。這台機器出廠時所附的 OS 是 Mac OS 10.5 Leopard，我用了一陣子以後想要升級到最新版的 10.6 Snow Leopard (10.6.5)，在升級前就順便熟悉一下 Mac 內建的系統備份機制-Time Machine，沒想到在把我的 2.5" 外接硬碟設定為 Time Machine 備份媒體時遇到一些小問題。&lt;br /&gt;&lt;br /&gt;在 Time Machine 的設定畫面中可以看到，若該 partition 的檔案系統不支援作為 Time Machine 的備份媒體（也就是非 Mac OS Extended (Journaled) 的檔案系統格式），就會出現「reformat required (incompatible filesystem)」的訊息（如「DATA」那個 partition）：&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/_qUfPJWk25s0/TSQjNl0JZLI/AAAAAAAAF6E/P_ZTMZdoMUw/s1600/Time+Machine+settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TSQjNl0JZLI/AAAAAAAAF6E/P_ZTMZdoMUw/s400/Time+Machine+settings.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;經過一番摸索，為了使用上的便利性，加上現在外接硬碟容量多半都很大用不完 (500/640G 起跳)，因此我決定把這顆硬碟切成兩個 partition：一個使用 Mac OS Extended (Journaled) 檔案系統（for Time Machine），另一個使用 NTFS 檔案系統（for Windows/Linux），這樣比較不傷腦筋。&lt;br /&gt;&lt;br /&gt;（如果把整個磁碟格式化成 Mac OS Extended (Journaled)，不管是 Windows/Linux 都無法寫入；&lt;windows 甚至無法掛載這個磁碟，linux="" 起碼可以讀取=""&gt;若把整個磁碟格式化成 NTFS，又無法用來作為 Time Machine 的備份磁碟。）&lt;/windows&gt;&lt;br /&gt;&lt;br /&gt;這個工作可以輕易的使用 MacOS 內建的 Disk Utility 完成，首先從 Applications -&amp;gt; Utilities 中執行 Disk Utility，接著右邊的幾個 tab 就是主要的功能，都很簡單易用，切到「Partition」後，因為懶惰的關係我就直接在 Volume Scheme 選了2 Partitions（就是把整個磁碟對切成兩半）：&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/_qUfPJWk25s0/TSQkE0CjQ9I/AAAAAAAAF6I/--MWT7fe6To/s1600/Mac+Partition+setting.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="345" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TSQkE0CjQ9I/AAAAAAAAF6I/--MWT7fe6To/s400/Mac+Partition+setting.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;分別命名以及設定 Format 以後，點選右下角的 Apply 就可以了。&lt;br /&gt;&lt;br /&gt;完成後的兩個 partition 格式如下 (在 MacOS 中看到的 partition 資訊)：&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/_qUfPJWk25s0/TSQkeCyKCyI/AAAAAAAAF6Q/zSponTHtj7U/s1600/Disk+Info.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TSQkeCyKCyI/AAAAAAAAF6Q/zSponTHtj7U/s400/Disk+Info.png" width="332" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Windows 只能讀到 DATA 這個格式為 NTFS 的 partition:&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/_qUfPJWk25s0/TSQkxdvuEFI/AAAAAAAAF6U/IpR3ENAYs6A/s1600/Windows-NTFS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TSQkxdvuEFI/AAAAAAAAF6U/IpR3ENAYs6A/s400/Windows-NTFS.png" width="318" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;接下來回到 Time Machine 的設定畫面，在 Select Disk 的地方選擇剛剛格式化成 Mac OS Extended (Journaled) 的那個 partition 就可以了：&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/_qUfPJWk25s0/TSQkVpTkrNI/AAAAAAAAF6M/HG-CgXsyZsc/s1600/Time+Machine+setting+-+Select+Disk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TSQkVpTkrNI/AAAAAAAAF6M/HG-CgXsyZsc/s400/Time+Machine+setting+-+Select+Disk.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;至於 Mac 不支援 NTFS 寫入的問題，請教過 Mac 老手以後，發現有以下幾個解決方案：&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://ntfsmounter.com/"&gt;NTFS Mounter&lt;/a&gt;：可開啟MacOS內建的NTFS寫入功能(預設僅唯讀)，這是免費軟體，缺點是必須手動掛載。我覺得用起來還蠻簡單的，目前使用上也沒什麼問題。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.paragon-software.com/home/ntfs-mac/"&gt;Paragon NTFS for Mac® OS X 8.0&lt;/a&gt;：目前有特價 USD $19.95 (聽說原價是 USD $39.95)，由於目前我還不想花錢買 Mac 的軟體所以沒測試，但既然是商業軟體，應該要有不錯的品質。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;用 MacOSX 10.6.5 內建的 exFAT，可參考 &lt;a href="http://www.macuknow.com/node/7302"&gt;http://www.macuknow.com/node/7302&lt;/a&gt;。要注意的是 exFAT 要在 MacOSX 10.6.5 才有內建支援，10.5.X 是無法掛載 exFAT partition 的。我自己測試的結果是，雖然在 Windows 7 中對磁碟格式化時可選擇 exFAT 格式，但由 Mac 格式化成 exFAT 的磁碟在 Windows 7 中也無法正確掛載，也就無法讀取磁碟中的檔案了。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;根據該老手的說法，Paragon NTFS for Mac 使用起來相當穩定。&lt;br /&gt;&lt;br /&gt;以上就是我第一次在 Mac 上設定 Time Machine 備份的心得，希望以後會有更多跟 Mac 有關的文章 :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3227998861804462986?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3227998861804462986/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3227998861804462986&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3227998861804462986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3227998861804462986'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/01/mac-time-machine-windowslinux.html' title='如何將外接硬碟格式化給 Mac 做 Time Machine 備份，同時又可繼續在 Windows/Linux 系統中使用'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_qUfPJWk25s0/TSQjNl0JZLI/AAAAAAAAF6E/P_ZTMZdoMUw/s72-c/Time+Machine+settings.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-5502885339754512900</id><published>2011-01-03T21:40:00.000+08:00</published><updated>2011-01-03T21:40:20.916+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jpgraph'/><title type='text'>jpgraph 如何顯示中文</title><content type='html'>前陣子處理 php 繪製圖表的問題，用到 &lt;a href="http://jpgraph.net/"&gt;jpgraph&lt;/a&gt; 這個有名的繪圖函式庫，一開始用的都很順，但是 jpgraph 預設是無法正確顯示中文的，必須調整一些設定。&lt;br /&gt;&lt;br /&gt;Google 「jpgraph 顯示中文」以後，發現前幾篇文章都很有用，我覺得設定步驟寫得最完整而且最正確的是「&lt;a href="http://mike7120.blogspot.com/2010/10/jpgraph.html"&gt;麥克筆記：JPGraph如何顯示中文&lt;/a&gt;」，而「&lt;a href="http://www.jaceju.net/blog/archives/14"&gt;網站製作學習誌：如何讓 JpGraph 顯示中文&lt;/a&gt;」的範例也很清楚易懂。&lt;br /&gt;&lt;br /&gt;上面兩篇文章都寫的非常清楚，我就不用多說啦，這篇就當作是個小小的筆記吧 :D&lt;br /&gt;&lt;br /&gt;參考資料：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jaceju.net/blog/archives/14"&gt;網站製作學習誌：如何讓 JpGraph 顯示中文&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mike7120.blogspot.com/2010/10/jpgraph.html"&gt;麥克筆記：JPGraph如何顯示中文&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-5502885339754512900?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/5502885339754512900/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=5502885339754512900&amp;isPopup=true' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5502885339754512900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5502885339754512900'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/01/jpgraph.html' title='jpgraph 如何顯示中文'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-7259748841436116139</id><published>2011-01-01T23:24:00.003+08:00</published><updated>2011-01-02T12:28:39.188+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='心得'/><category scheme='http://www.blogger.com/atom/ns#' term='Other'/><title type='text'>回顧2010年</title><content type='html'>&lt;p&gt;又過了一年，這個 blog 也已經2歲半了    &lt;br /&gt;&lt;br /&gt;今年也是發生許許多多的事    &lt;br /&gt;&lt;strike&gt;像是 Tim 本來要去考研究所，結果卻變成坎尼在念研究所     &lt;br /&gt;Tim 反倒是跑去某家園藝公司…      &lt;br /&gt;&lt;/strike&gt;    &lt;br /&gt;技術方面，.NET 4.0 出了、Silverlight 4 也出了，要學的東西又更多了    &lt;br /&gt;Sun Micro 被 Oracle 買下、Microsoft Courier 專案中止    &lt;br /&gt;iPad 及各式各樣平板也在年底資訊展吵的火熱    &lt;br /&gt;&lt;br /&gt;雲端技術百家爭鳴，Amazon Web Service 也可以免費試用    &lt;br /&gt;&lt;br /&gt;Kinect 在 25 天賣了 250 萬台 (坎尼的同學也貢獻了一台)    &lt;br /&gt;支援裸眼3D的N3DS也即將發售    &lt;br /&gt;&lt;br /&gt;還有許許多多無法塞進此篇文章的資訊    &lt;br /&gt;過了這麼豐富的一年，希望大家都有從中得到什麼    &lt;br /&gt;&lt;br /&gt;今天是 2011/01/01    &lt;br /&gt;坎尼除了把書念好之外，或許會開始研究一些比較新的技術    &lt;br /&gt;希望未來的365天能夠提供更優質的部落格內容 :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-7259748841436116139?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/7259748841436116139/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=7259748841436116139&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7259748841436116139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7259748841436116139'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/01/2010.html' title='回顧2010年'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1552062922823246882</id><published>2011-01-01T21:27:00.000+08:00</published><updated>2011-01-01T21:27:55.955+08:00</updated><title type='text'>在 Blogger 官方的分享按鈕中新增「推到噗浪」</title><content type='html'>今天在 Inside 網站看到一篇「&lt;a href="http://www.inside.com.tw/01/01/addthis?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+inside-blog-taiwan+(%E7%B6%B2%E8%B7%AF%E8%B6%A8%E5%8B%A2%E8%A1%8C%E9%8A%B7%E8%88%87%E9%96%8B%E7%99%BC)"&gt;AddThis：快速建置整合分享按鈕，還送你免費分析&lt;/a&gt;」，本來想要試用看看 AddThis 服務，但是發現要先註冊帳號就就放棄了。&lt;br /&gt;&lt;br /&gt;Google 了一下「blogger 分享按鈕」，發現官方早在今年年中已經有內建分享按鈕了！有支援 Google Buzz, GMail, Facebook, Twitter 等，但是仔細看一下才發現本部落格的文章並沒有出現這些按鈕，後來找到「&lt;a href="http://happy-yblog.blogspot.com/2010/06/bloggernew-share-buttons.html"&gt;Blogger最新推出「New Share Buttons」分享按鈕，超有質感!&lt;/a&gt;」這篇文章，根據說明就可以順利的讓分享按鈕顯示出來啦！&lt;br /&gt;（由此可知 Blogger 有些內建的範本對分享按鈕的支援還沒更新，才會導致漏掉 share button 那個 div 的狀況）&lt;br /&gt;&lt;br /&gt;接下來的問題是 Blogger 官方內建的分享按鈕中不包括台灣 &amp;amp; 東南亞地區流行的噗浪 (Plurk)，因此經過一番搜尋，又找到「&lt;a href="http://etblue.blogspot.com/2010/12/seamlessly-insert-plurk-share-button-in.html"&gt;新作法！換樣板也不失效 - Blogger 插入 Plurk 分享按鈕，跟官方按鈕無縫整合，並自訂按鈕順序&lt;/a&gt;」這篇文章，我跟作者的習慣一樣，能用官方的東西就盡量用官方的，以避免一些奇怪的小問題 (所以&lt;a href="http://dotnetmis91.blogspot.com/2010/12/blogger-touchnet.html"&gt;前陣子才會把blogger touch服務換成Blogger內建的行動版網頁服務&lt;/a&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/_qUfPJWk25s0/TR8rZTpGqnI/AAAAAAAAF54/1qvzWaKSvDc/s1600/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="331" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TR8rZTpGqnI/AAAAAAAAF54/1qvzWaKSvDc/s400/Screenshot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;以上是2011年第一天的新氣象，今年也要繼續努力阿！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-1552062922823246882?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/1552062922823246882/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=1552062922823246882&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1552062922823246882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1552062922823246882'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2011/01/blogger.html' title='在 Blogger 官方的分享按鈕中新增「推到噗浪」'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qUfPJWk25s0/TR8rZTpGqnI/AAAAAAAAF54/1qvzWaKSvDc/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-2217462129091562271</id><published>2010-12-24T09:00:00.079+08:00</published><updated>2010-12-24T09:00:00.781+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DNN'/><title type='text'>DotNetNuke (DNN) 05.06.00 以 Auto 模式進行安裝之注意事項</title><content type='html'>前陣子幫忙安裝了一套 DotNetNuke (DNN)，這個 Open Source 的 CMS 平台在我們大學畢業專題就使用過了（當時是開發了幾個模組，等於是在這個平台上提供新的加值服務），當時版本大概是 2.x 還是 3.x，經過這幾年持續的進步，目前最新版是 05.06.00 了。這個版本可支援以免費的 SQL Server Express 作為 DB，在安裝時稱為「Auto模式」，但是在 Win7 的預設環境下是無法直接以Auto模式進行安裝的，必須要做些調整，以下是設定的步驟。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #202020; font-family: 'Droid Sans', arial, sans-serif;"&gt;透過 Microsoft Web Platform Installer (Web PI) 這個超方便的工具將 SQL Server 2008 R2 Express &amp;amp; DNN 等元件安裝好以後，從 Computer -&amp;gt; Manage -&amp;gt; Services and Applications -&amp;gt; Services 裡面可以看到，SQL Server (SQLEXPRESS) 服務預設是以「Network Service」這個系統內建帳戶來執行的：&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/_qUfPJWk25s0/TRH8lEP6JmI/AAAAAAAAF0g/pFPcSyA7vo8/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TRH8lEP6JmI/AAAAAAAAF0g/pFPcSyA7vo8/s320/1.png" width="283" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #202020; font-family: 'Droid Sans', arial, sans-serif;"&gt;而啟動 IIS Manager (Start -&amp;gt; Run -&amp;gt; inetmgr 或者 Control Panel -&amp;gt; System and Security -&amp;gt; Administrative Tools -&amp;gt; IIS Manager &lt;control and="" panel\system="" security\administrative="" tools=""&gt; ) 後可看到，位於 Default Web Site 下的 dotnetnuke Web Application 是在 DefaultAppPool 中執行的：&lt;/control&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/span&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TRH8lu1ZPYI/AAAAAAAAF0k/rahAhWp5OzM/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="258" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TRH8lu1ZPYI/AAAAAAAAF0k/rahAhWp5OzM/s400/2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #202020; font-family: 'Droid Sans', arial, sans-serif;"&gt;而 DefaultAppPool 預設是以 ApplicationPoolIdentity 身份來執行的：&lt;br /&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/_qUfPJWk25s0/TRH8mYxRDkI/AAAAAAAAF0o/TJ7njDhsG_c/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="111" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TRH8mYxRDkI/AAAAAAAAF0o/TJ7njDhsG_c/s400/3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #202020; font-family: 'Droid Sans', arial, sans-serif;"&gt;&lt;span class="Apple-style-span"&gt;因此在&amp;nbsp;&lt;a href="http://localhost/dotnetnuke" style="color: #67753a;" target="_blank" wotsearchprocessed="true"&gt;http://localhost/dotnetnuke&lt;/a&gt;&amp;nbsp;這個安裝頁面中就無法選擇以&amp;nbsp; Auto 模式進行安裝（被判定為系統中不存在 SQL Server Express）：&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TRH8gLXn_KI/AAAAAAAAF0c/36IpjuFckvE/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="201" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TRH8gLXn_KI/AAAAAAAAF0c/36IpjuFckvE/s320/4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #202020; font-family: 'Droid Sans', arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;因此只要把 DefaultAppPool 改為以 Network Service 身份來執行：&lt;br /&gt;&lt;/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/_qUfPJWk25s0/TRH8m7KkxrI/AAAAAAAAF0s/9x0t07W8fOw/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="194" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TRH8m7KkxrI/AAAAAAAAF0s/9x0t07W8fOw/s320/5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #202020; font-family: 'Droid Sans', arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;並且重新啟動 IIS：&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_qUfPJWk25s0/TRH8nuFh1jI/AAAAAAAAF0w/l74E2IyaAjo/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TRH8nuFh1jI/AAAAAAAAF0w/l74E2IyaAjo/s320/6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #202020; font-family: 'Droid Sans', arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;在&amp;nbsp;&lt;a href="http://localhost/dotnetnuke" style="color: #67753a;" target="_blank" wotsearchprocessed="true"&gt;http://localhost/dotnetnuke&lt;/a&gt;&amp;nbsp;安裝畫面中就可以使用 Auto 模式來進行安裝：&lt;/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/_qUfPJWk25s0/TRH8oOcGPTI/AAAAAAAAF00/5wFeX721doM/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TRH8oOcGPTI/AAAAAAAAF00/5wFeX721doM/s320/7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #202020; font-family: 'Droid Sans', arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;安裝完成後，DB 的 data file 會位於以下位置：C:\inetpub\wwwroot\&lt;wbr&gt;&lt;/wbr&gt;dotnetnuke\App_Data, Database.mdf、Database_log.ldf&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #202020; font-family: 'Droid Sans', arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;以上就是一些需要特別注意的地方，只要做完這一步，後續的安裝就非常簡單啦！&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-2217462129091562271?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/2217462129091562271/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=2217462129091562271&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/2217462129091562271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/2217462129091562271'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/12/dotnetnuke-dnn-050600-auto.html' title='DotNetNuke (DNN) 05.06.00 以 Auto 模式進行安裝之注意事項'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qUfPJWk25s0/TRH8lEP6JmI/AAAAAAAAF0g/pFPcSyA7vo8/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-675417362341279559</id><published>2010-12-22T19:33:00.000+08:00</published><updated>2010-12-22T19:33:00.557+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xargs'/><category scheme='http://www.blogger.com/atom/ns#' term='AWStats'/><title type='text'>AWStats 重新分析特定時段 log 的方法 - 以指令批次修改大量 AWStats 統計資料檔</title><content type='html'>在七月中的時候曾經寫過一篇&lt;a href="http://dotnetmis91.blogspot.com/2010/07/awstats-log.html"&gt;AWStats 重新分析特定時段 log 的方法&lt;/a&gt;，當時是第一次遇到 AWStats 報表執行失敗的問題，很不幸的後來又陸續遇到幾次需要重跑 AWStats 報表的需求。原本是參考&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 20px;"&gt;&lt;a href="http://www.neo.com.tw/archives/000555" style="color: #cc3300; text-decoration: none;"&gt;Neo's Blog - awstats 加入/重新計算分析某時段的方法&lt;/a&gt;&lt;/span&gt;，老老實實的手動去修改 AWStats 統計資料檔中的「LastLine」、「LastTime」、「LastUpdate」三個參數，但由於我要計算的報表多達 26 個，連續 26 次用 vi 去編輯統計資料檔中的三行資料不但累人，而且很容易出錯！經過一番摸索，終於利用三個指令就把 26 個檔案中的資料一次修改完成！&lt;br /&gt;&lt;br /&gt;其實這次用到的技巧跟前陣子分享的&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 15px;"&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/12/shell-script-v2.html" style="color: #cc3300; text-decoration: none;"&gt;[Shell Script] 批次修改使用者的密碼有效期限 - V2&lt;/a&gt;&lt;/span&gt;差不多，主要是利用 xargs -i 來濃縮大量、只有一個參數不同的指令。這次要用到的指令範例如下：&lt;br /&gt;&lt;br /&gt;批次將 26 個 AWStats 統計資料檔的 LastTime 修改為「&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;LastTime 20100630000000&lt;/span&gt;」：&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;find /path/to/awstats/statistic/files -name &lt;span class="Apple-style-span" style="color: red;"&gt;awstats&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;12&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;2010*&lt;/span&gt; | xargs -i sed -i '/&lt;span class="Apple-style-span" style="color: red;"&gt;^&lt;/span&gt;LastTime/&lt;span class="Apple-style-span" style="color: lime;"&gt;c&lt;/span&gt; LastTime 20100630000000' &lt;span class="Apple-style-span" style="color: red;"&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;首先利用 find 指令找出要修改的月份的所有統計資料檔（-name 參數支援 Regular Expression），此例是要找出2010年12月的檔案。因為 find 的結果會是完整的檔案路徑（e.g., /etc/fstab），因此可作為 sed 指令的參數，用以指定要修改的檔案。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;下一步是利用 sed -i 指令來編輯檔案，在此也支援 Regular Expression，因此「&lt;span class="Apple-style-span" style="color: red;"&gt;^&lt;/span&gt;LastTime」就是以「LastTime」開頭的那一行文字，這裡的「&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red; font-family: arial, sans-serif;"&gt;^&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;」很重要，表示這一行文字的開頭第一個字就是「L」，若去掉「&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red; font-family: arial, sans-serif;"&gt;^&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;」，則會一併編輯到「#LastTime」的註解文字。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;找到 LastTime 開頭的那行文字以後，「&lt;/span&gt;&lt;span class="Apple-style-span" style="color: lime; font-family: arial, sans-serif;"&gt;c&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;」表示整行取代，因此「&lt;/span&gt;&lt;span class="Apple-style-span" style="color: lime; font-family: arial, sans-serif;"&gt;c&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;」後面接的就是我們想要這行變成怎樣的最後內容：「&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;LastTime 20100630000000」（不一定要指定成2010年6月30號，只要日期比今天更早就可以了）。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;最後最重要的就是「&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red; font-family: arial, sans-serif;"&gt;{}&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;」了，xargs -i 會把 find pipe 過來的完整檔案路徑代入&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;「&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red; font-family: arial, sans-serif;"&gt;{}&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;」中（一次代入一個檔案），因此就看 find 指令可以找到多少檔案（以我的例子來說是 26 個），這行指令就可以一次修改多少檔案中的「LastTime」的內容了！&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;接下來要編輯「LastLine」和「LastUpdate」的內容就很簡單了：&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;find /var/lib/awstats/ -name &lt;span class="Apple-style-span" style="color: red;"&gt;awstats&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;12&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;2010*&lt;/span&gt; | xargs -i sed -i '/&lt;span class="Apple-style-span" style="color: red;"&gt;^&lt;/span&gt;LastLine/&lt;span class="Apple-style-span" style="color: lime;"&gt;c&lt;/span&gt; LastLine 20100630000000 0 0 0' &lt;span class="Apple-style-span" style="color: red;"&gt;{}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;find /var/lib/awstats/ -name &lt;span class="Apple-style-span" style="color: red;"&gt;awstats&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;12&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;2010*&lt;/span&gt; | xargs -i sed -i '/&lt;span class="Apple-style-span" style="color: red;"&gt;^&lt;/span&gt;LastUpdate/&lt;span class="Apple-style-span" style="color: lime;"&gt;c&lt;/span&gt; LastUpdate 20100630000000 0 0 0 0 0' &lt;span class="Apple-style-span" style="color: red;"&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;學會 xargs -i 以後真的是太好用了，很快就越用越上手，想忘也忘不掉啦！&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-675417362341279559?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/675417362341279559/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=675417362341279559&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/675417362341279559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/675417362341279559'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/12/awstats-log-awstats.html' title='AWStats 重新分析特定時段 log 的方法 - 以指令批次修改大量 AWStats 統計資料檔'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-763783821134072720</id><published>2010-12-18T02:22:00.002+08:00</published><updated>2011-05-24T17:20:26.339+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='匯入 Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='NPOI'/><title type='text'>[NPOI] Excel 上傳用 User Control</title><content type='html'>上篇坎尼寫了 &lt;a href="http://dotnetmis91.blogspot.com/2010/12/npoi-gridview.html" target="_blank"&gt;[NPOI] 輕鬆地將 GridView 匯出成試算表&lt;/a&gt;   &lt;br /&gt;坎尼的朋友就問：&lt;strong&gt;&lt;font color="#008000"&gt;那有沒有上傳的?&lt;/font&gt;&lt;/strong&gt;   &lt;br /&gt;當然有，要什麼有什麼 :D   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TQuqQpx9GdI/AAAAAAAADRM/W7wwb_w6sSE/s1600-h/nic_00x%5B2%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_00x" border="0" alt="nic_00x" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TQuqRu19kbI/AAAAAAAADRQ/nJU1QqM9Am4/nic_00x_thumb.png?imgmax=800" width="244" height="205" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;hr /&gt;&lt;h3&gt;I. 實作過程&lt;/h3&gt;&lt;p&gt;首先，建立一個 WebUserControl    &lt;br /&gt;加入一個 FileUpload、兩個 Button、一個 GridView &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;FileUpload&lt;/font&gt; 及&lt;font color="#0000ff"&gt;&lt;strong&gt;上傳&lt;/strong&gt;按鈕&lt;/font&gt;用來進行&lt;font color="#ff0000"&gt;檔案上傳&lt;/font&gt;的動作 &lt;/li&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;確認&lt;/strong&gt;按鈕&lt;/font&gt;則是&lt;font color="#ff0000"&gt;給使用者自行定義事件&lt;/font&gt; &lt;/li&gt;&lt;li&gt;&lt;font color="#0000ff"&gt;GridView&lt;/font&gt; 用來&lt;font color="#ff0000"&gt;顯示上傳完成的檔案&lt;/font&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TQuqSPJMGxI/AAAAAAAADRU/bpSvqdjIDgo/s1600-h/nic_01%5B7%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_01" border="0" alt="nic_01" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TQuqSqXmQMI/AAAAAAAADRY/YVEisrRG9gM/nic_01_thumb%5B5%5D.png?imgmax=800" width="367" height="209" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;h4&gt;&lt;br /&gt;建立委派事件&lt;/h4&gt;接著建立 User 可以委派的事件：&lt;strong&gt;&lt;font color="#0000ff"&gt;ImportToDB&lt;/font&gt;&lt;/strong&gt;   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQuqTEmtYkI/AAAAAAAADRc/LHTyVe3QwCw/s1600-h/nic_02%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_02" border="0" alt="nic_02" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TQuqTcYHncI/AAAAAAAADRg/k8sltIHBkvc/nic_02_thumb%5B2%5D.png?imgmax=800" width="278" height="93" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;確認按鈕的 Click 事件&lt;font color="#ff0000"&gt;則去呼叫 User 的委派事件&lt;/font&gt;   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TQuqT6MvYCI/AAAAAAAADRk/6z5UGwuoL3k/s1600-h/nic_03%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_03" border="0" alt="nic_03" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TQuqUs58fyI/AAAAAAAADRo/ASh9huFIBgY/nic_03_thumb%5B3%5D.png?imgmax=800" width="431" height="110" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;h4&gt;&lt;br /&gt;建立屬性&lt;/h4&gt;建立上傳資料屬性，以利使用者進行後續的資料匯入動作   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TQuqUx0oXiI/AAAAAAAADRs/gsXMqaZF1y0/s1600-h/nic_04%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_04" border="0" alt="nic_04" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TQuqVuBq6hI/AAAAAAAADRw/PdMQLq_R2oU/nic_04_thumb%5B2%5D.png?imgmax=800" width="314" height="86" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;由於 PostBack 之後不會記住屬性的資料   &lt;br /&gt;所以&lt;font color="#ff0000"&gt;用 ViewState 把資料記住&lt;/font&gt;，並在 Page_Load 事件檢查   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TQuqV-xjZCI/AAAAAAAADR0/28POoTeYKhY/s1600-h/nic_05%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_05" border="0" alt="nic_05" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQuqWYus6UI/AAAAAAAADR4/6D5r4ozztxc/nic_05_thumb%5B2%5D.png?imgmax=800" width="461" height="110" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;h4&gt;&lt;br /&gt;上傳按鈕事件&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;第一個紅框為呼叫 NPOI 上傳事件      &lt;br /&gt;把 Excel 內容傳到 DataTable 之中並回傳 &lt;/li&gt;&lt;li&gt;第二個紅框為將資料存到 ViewState 之中      &lt;br /&gt;另外把確認按鈕改成可作用 &lt;/li&gt;&lt;li&gt;第三個紅框則是把資料顯示到畫面上 &lt;/li&gt;&lt;/ul&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQuqW6BaVdI/AAAAAAAADR8/QWLQH2XeU-c/s1600-h/nic_06%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_06" border="0" alt="nic_06" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TQuqXjMp9-I/AAAAAAAADSA/n5xM7oFgF7E/nic_06_thumb%5B2%5D.png?imgmax=800" width="442" height="465" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;NPOI 匯入事件&lt;/h4&gt;這邊的程式碼引用 hunterpo 大所寫的 &lt;a href="http://www.dotblogs.com.tw/hunterpo/archive/2010/02/25/13759.aspx" target="_blank"&gt;利用 NPOI Library 合併多個 Excel 檔&lt;/a&gt;   &lt;br /&gt;但要注意的一點是，1.2.3 版本的 NPOI 在以下紅框處需進行轉型的動作&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TQuqYMt2u_I/AAAAAAAADSE/1uuGS2XGw_A/s1600-h/nic_07%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_07" border="0" alt="nic_07" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TQuqYyMYeCI/AAAAAAAADSI/e5eyjGjvCE0/nic_07_thumb%5B2%5D.png?imgmax=800" width="635" height="720" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;h3&gt;II. 使用方法&lt;/h3&gt;建立新的頁面，把 User Control 放到畫面上   &lt;br /&gt;另外再加入一個 GridView，用來&lt;font color="#ff0000"&gt;確認資料是否真的上傳到 server&lt;/font&gt;   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TQuqZUbnrvI/AAAAAAAADSM/ZBwDqzSwoNw/s1600-h/nic_08%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_08" border="0" alt="nic_08" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TQuqZyogQRI/AAAAAAAADSQ/ArA5ixe_puU/nic_08_thumb%5B2%5D.png?imgmax=800" width="673" height="247" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;h4&gt;自行撰寫事件&lt;/h4&gt;這邊可以看到坎尼自己定義了新的事件：&lt;strong&gt;&lt;font color="#0000ff"&gt;ImportToDB&lt;/font&gt;&lt;/strong&gt;   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQuqaZU4tnI/AAAAAAAADSU/fR-2bEY03Kw/s1600-h/nic_09%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_09" border="0" alt="nic_09" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TQuqa0OXM3I/AAAAAAAADSY/hApGhC2xz-8/nic_09_thumb%5B2%5D.png?imgmax=800" width="380" height="61" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;動作只是很簡單地判斷 UserControl 的 DataTable 有沒有資料   &lt;br /&gt;有的話就把資料繫結到畫面上的 GridView 之中   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TQuqbejzdLI/AAAAAAAADSc/5jKH-qZdQr8/s1600-h/nic_10%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_10" border="0" alt="nic_10" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQuqb6HKw3I/AAAAAAAADSg/knjUYu4VMIs/nic_10_thumb%5B2%5D.png?imgmax=800" width="452" height="179" /&gt;&lt;/a&gt;   &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;執行畫面&lt;/h4&gt;上傳資料，成功的話 UserControl 會將資料顯示出來   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TQuqcST7HFI/AAAAAAAADSk/zygRpHW-apI/s1600-h/nic_11%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_11" border="0" alt="nic_11" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQuqc5jaFII/AAAAAAAADSo/MeoDs9C-bcI/nic_11_thumb%5B3%5D.png?imgmax=800" width="580" height="432" /&gt;&lt;/a&gt; 點下確認之後，使用者自行定義的事件會把資料繫結到另一個 GridView   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TQuqdqYBnQI/AAAAAAAADSs/9uXgk5ISKos/s1600-h/nic_12%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nic_12" border="0" alt="nic_12" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TQuqeYbDXcI/AAAAAAAADSw/AMJwUskV8mo/nic_12_thumb%5B2%5D.png?imgmax=800" width="789" height="468" /&gt;&lt;/a&gt; 大功告成!!!   &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;III. 小結&lt;/h3&gt;本次範例是用 NPOI 1.2.3 寫的 &lt;font color="#808080"&gt;(上一篇是用舊版)&lt;/font&gt;   &lt;br /&gt;所以還沒用此版本的讀者記得去 &lt;a href="http://npoi.codeplex.com/" target="_blank"&gt;codeplex 下載&lt;/a&gt;新版本   &lt;br /&gt;&lt;br /&gt;另外上傳的 Excel 檔案需為 97-2003 的格式   &lt;br /&gt;若是用 office 2007 或是 office 2010 的朋友，記得改存為舊格式   &lt;br /&gt;&lt;br /&gt;此次的&lt;a href="http://dl.dropbox.com/u/4862785/BlogSrc/NPOIUI.zip" target="_blank"&gt;範例下載&lt;/a&gt; (含 npoi library)   &lt;br /&gt;&lt;br /&gt;參考資料：   &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.dotblogs.com.tw/hunterpo/archive/2010/02/25/13759.aspx" target="_blank"&gt;利用 NPOI Library 合併多個 Excel 檔&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-763783821134072720?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/763783821134072720/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=763783821134072720&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/763783821134072720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/763783821134072720'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/12/npoi-excel-user-control.html' title='[NPOI] Excel 上傳用 User Control'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_bGOQZqQ9oEM/TQuqRu19kbI/AAAAAAAADRQ/nJU1QqM9Am4/s72-c/nic_00x_thumb.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-7114272445396274181</id><published>2010-12-13T15:22:00.000+08:00</published><updated>2010-12-13T15:22:43.246+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='帳號管理'/><category scheme='http://www.blogger.com/atom/ns#' term='shell script'/><title type='text'>[Shell Script] 批次修改使用者的密碼有效期限 - V2</title><content type='html'>之前寫過一篇&lt;a href="http://dotnetmis91.blogspot.com/2010/03/shell-script-v1.html"&gt;[Shell Script] 批次修改使用者的密碼有效期限 - V1&lt;/a&gt;，當時是自己寫了一個有點囉唆的 shell script 來處理這樣的需求，最麻煩的問題是「如何判斷哪些帳號是使用者帳號」，過濾 /etc/passwd 檔案有以下困難：&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;在 RHEL 系統中，通常使用者帳號的 uid 是從 500 開始，但是在 Solaris 系統中是從 100 開始。&lt;/li&gt;&lt;li&gt;上次寫的：&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14px; line-height: 20px;"&gt;加強過濾 /etc/passwd 檔案時使用的 regular expression，雖然目前實務上接觸到的主機還不至於帳號多到 uid &amp;gt; 600 或者更高，但可以當作一個練習 regular expression 的機會。&lt;/span&gt;&amp;lt;--相當麻煩&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;最近又要去修改使用者密碼的到期日（每三個月就要做一次），因為不想再跑這個很麻煩的 script，因此研究出一個更方便的指令，主要是以 echo -e 搭配 xargs 來完成。&lt;br /&gt;&lt;br /&gt;要設定「密碼有效期為90天」以及「密碼到期前30天警告」可使用以下指令：&lt;br /&gt;&lt;br /&gt;echo -e "&lt;span class="Apple-style-span" style="color: blue;"&gt;account1&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;\n&lt;/span&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;account2&lt;/span&gt;" | xargs -i chage -M 90 -W 30&lt;span class="Apple-style-span" style="color: red;"&gt; {}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;echo 加上 -e 參數後會讓兩個帳號間的「\n」換行字元生效（不加 -e 的話 xargs 會收到「&lt;span class="Apple-style-span" style="color: blue;"&gt;account1&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;\n&lt;/span&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;account2&lt;/span&gt;」這個完整的字串），再搭配 xargs -i 的置換效果（&lt;span class="Apple-style-span" style="color: red;"&gt;{}&lt;/span&gt;會被置換成透過 pipeline 接收的字元），上面一行指令相當於下面兩行指令：&lt;br /&gt;&lt;br /&gt;chage -M 90 -W 30&amp;nbsp;&lt;span class="Apple-style-span" style="color: blue;"&gt;account1&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;chage -M 90 -W 30&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;account2&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;這樣的寫法的彈性在於，要 echo 哪些帳號出來完全可以自由控制，不用考慮不同系統中 uid 的起始數字不同，也不用考慮例外狀況。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;在我管的系統中每個 OS 中的帳號都類似（大概是5~8個），透過 xargs 可以把 5~8 行指令濃縮成一行執行，非常省事。&lt;br /&gt;&lt;br /&gt;接下來的幾個指令就依樣畫葫蘆：&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;檢查上述指令是否生效：echo -e&amp;nbsp;&lt;/span&gt;&lt;/span&gt;"&lt;span class="Apple-style-span" style="color: blue;"&gt;account1&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;\n&lt;/span&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;account2&lt;/span&gt;" | xargs -i chage -l&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;{}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;設定最後一次變更密碼的日期：&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;echo -e&amp;nbsp;&lt;/span&gt;&lt;/span&gt;"&lt;span class="Apple-style-span" style="color: blue;"&gt;account1&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;\n&lt;/span&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;account2&lt;/span&gt;" | xargs -i chage -d YYYY-MM-DD&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;{}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;在 Unix 系統（e.g., Solaris）上設定密碼90天到期、到期30天前提醒：&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;echo -e&amp;nbsp;&lt;/span&gt;&lt;/span&gt;"&lt;span class="Apple-style-span" style="color: blue;"&gt;account1&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;\n&lt;/span&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;account2&lt;/span&gt;" | xargs -i passwd -x 90 -w 30&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;{}&lt;/span&gt;（Solaris預設沒有 chage 指令）&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;xargs 真的是非常好用，下一篇再來介紹怎樣用 find、sed 搭配 xargs 來批次修改 awstats 統計資料檔（純文字檔）的內容。&lt;br /&gt;&lt;br /&gt;參考：[2010-03-17]&amp;nbsp;&lt;a href="http://dotnetmis91.blogspot.com/2010/03/shell-script-v1.html"&gt;[Shell Script] 批次修改使用者的密碼有效期限 - V1&lt;/a&gt;&lt;br /&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/6505213162600961434-7114272445396274181?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/7114272445396274181/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=7114272445396274181&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7114272445396274181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7114272445396274181'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/12/shell-script-v2.html' title='[Shell Script] 批次修改使用者的密碼有效期限 - V2'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1147343270598827276</id><published>2010-12-12T21:20:00.031+08:00</published><updated>2010-12-18T20:49:57.589+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='行動版面 手機版面 Blogger Touch'/><title type='text'>利用Blogger Touch服務快速建立.NET碎碎唸手機版</title><content type='html'>最近偶爾會把iPad測試機帶回家玩，今天熊熊想到之前在電腦玩物看過一篇&lt;a href="http://bloggertouch.appspot.com/playpc/post/6757285517275052346"&gt;邀請大家測試電腦玩物手機版，與Feedburner被牆二三事&lt;/a&gt;，裡面提到Sopili 軟體邦製作了一個新的網路服務：&lt;a href="http://bloggertouch.sopili.net/"&gt;Blogger Touch&lt;/a&gt;，專門幫採用Google Blogger平台的部落格轉換出手機適用的閱讀版面，當時一直沒有認真的去試用。但最近適逢iPad正式開賣，各家廠商的Android Pad也蓄勢待發，所以還是不要偷懶，趕快把手機/平板電腦適用的行動版面作出來吧XD&lt;br /&gt;&lt;br /&gt;Blogger Touch的使用非常簡單，首先連到&lt;a href="http://bloggertouch.sopili.net/"&gt;Blogger Touch&lt;/a&gt;，點選Mobile Edition Maker的連結，依序輸入Blogger的網址、登入用來建立部落格的Google帳號、選擇一個在Blogger Touch服務上不重複的id、調整Blogger的設定，最後把Blogger Touch的js組件新增到部落格的版面就可以了。&lt;br /&gt;&lt;br /&gt;調整前的PC版版面如下：&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TQTcbwDyCxI/AAAAAAAAFz0/eVSu4fM0TPk/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TQTcbwDyCxI/AAAAAAAAFz0/eVSu4fM0TPk/s320/1.png" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;由Blogger Touch 產生的行動版面如下：&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_qUfPJWk25s0/TQTcjm2bS0I/AAAAAAAAFz4/XWTkSz8GQDU/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TQTcjm2bS0I/AAAAAAAAFz4/XWTkSz8GQDU/s320/2.png" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;如果有特殊需求，要在手機/平版電腦上閱讀PC版的版面(例如要在iPad上新增一篇新增一篇Bloggerr文章)，只要移到畫面最下方，關閉「Mobile Theme」就可以了：&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TQTcno_2PFI/AAAAAAAAFz8/z31NjDSoLjY/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TQTcno_2PFI/AAAAAAAAFz8/z31NjDSoLjY/s320/3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;希望未來用手機/平版電腦閱讀本部落格的讀者能有更好的閱讀體驗^_^&lt;br /&gt;&lt;br /&gt;2010-12-18 更新：今天看到電腦玩物的一篇，&lt;a href="http://playpcesor.blogspot.com/2010/12/google-blogger.html"&gt;Google Blogger幫部落格擴增行動版，自動切換手機專用網頁模板&lt;/a&gt;，於是又去嘗試了官方提供的行動版網頁，測試以後發現一頁顯示的文章比較少，但是字比較大，顯示速度也更快，所以暫時就先換成官方版的囉 XD&lt;br /&gt;&lt;br /&gt;Ps. 本文除了插入圖片外，其餘編輯都在iPad上完成，iPad的中文輸入鍵盤真的是很不錯用啊！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-1147343270598827276?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/1147343270598827276/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=1147343270598827276&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1147343270598827276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1147343270598827276'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/12/blogger-touchnet.html' title='利用Blogger Touch服務快速建立.NET碎碎唸手機版'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qUfPJWk25s0/TQTcbwDyCxI/AAAAAAAAFz0/eVSu4fM0TPk/s72-c/1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-4092793975988950849</id><published>2010-12-11T20:05:00.001+08:00</published><updated>2011-02-11T01:18:41.984+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='匯出 Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NPOI'/><category scheme='http://www.blogger.com/atom/ns#' term='WebUserControl'/><title type='text'>[NPOI] 輕鬆地將 GridView 匯出成試算表</title><content type='html'>相信大家都遇過要將資料匯出成 Excel 的問題   &lt;br /&gt;這次坎尼用 &lt;a href="http://msdn.microsoft.com/zh-tw/ee818993.aspx" target="_blank"&gt;NPOI&lt;/a&gt; 製作匯出用的 WebUserControl   &lt;br /&gt;如果以後有相同需求，不介意就直接拿去用吧 :D   &lt;hr /&gt;  &lt;h3&gt;I. 實作過程&lt;/h3&gt; 首先，建立一個 WebUserControl   &lt;br /&gt;在畫面上加入按鈕，用來觸發匯出事件 &lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TQNow9IzAwI/AAAAAAAADPs/kdA8vLkYIaM/s1600-h/nec_01%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nec_01" border="0" alt="nec_01" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQNox9jy4MI/AAAAAAAADPw/TOBYlNAc3ug/nec_01_thumb%5B1%5D.png?imgmax=800" width="436" height="118" /&gt;&lt;/a&gt;   &lt;br /&gt;接著建立兩個屬性：&lt;strong&gt;&lt;font color="#0000ff"&gt;TargetGridViewID&lt;/font&gt;&lt;/strong&gt;、&lt;strong&gt;&lt;font color="#0000ff"&gt;SheetName&lt;/font&gt;&lt;/strong&gt;   &lt;br /&gt;TargetGridViewID 用來&lt;font color="#ff0000"&gt;指定要匯出的 GridView    &lt;br /&gt;&lt;/font&gt;SheetName 則是&lt;font color="#ff0000"&gt;匯出的試算表名稱&lt;/font&gt; &lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TQNoy_cjc7I/AAAAAAAADP0/c4eUipAimbA/s1600-h/nec_02%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nec_02" border="0" alt="nec_02" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TQNo0COm5SI/AAAAAAAADP4/FS_kFqBPPxQ/nec_02_thumb%5B1%5D.png?imgmax=800" width="388" height="146" /&gt;&lt;/a&gt;   &lt;br /&gt;進入按鈕事件，這邊唯一要做的事，就是去&lt;font color="#ff0000"&gt;找引用頁面的 GridView    &lt;br /&gt;&lt;/font&gt;找到之後丟給 &lt;strong&gt;ExportToFile&lt;/strong&gt; 這個 method 就沒事了 &lt;strike&gt;&lt;font color="#808080"&gt;(十分輕鬆)&lt;/font&gt;&lt;/strike&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQNo1EJNDlI/AAAAAAAADP8/xVP6FfEBOlU/s1600-h/nec_03%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nec_03" border="0" alt="nec_03" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TQNo16mMW4I/AAAAAAAADQA/4OUU6JBmDZo/nec_03_thumb%5B1%5D.png?imgmax=800" width="605" height="176" /&gt;&lt;/a&gt;接著到 &lt;font color="#004000"&gt;ExportToFile(GridView gv)    &lt;br /&gt;&lt;/font&gt;這邊可參考 NPOI 建立試算表的方法，不再多提   &lt;br /&gt;要注意的就是抓取 GridView 欄位數時，不用要 Columns.Count   &lt;br /&gt;而是改用 &lt;strong&gt;&lt;font color="#0000ff"&gt;HeaderRow.Cell.Count&lt;/font&gt;&lt;/strong&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQNo4ENtWKI/AAAAAAAADQE/4SwlR7Mnw1s/s1600-h/nec_04%5B3%5D.png"&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nec_04" border="0" alt="nec_04" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TQNo5MuMY7I/AAAAAAAADQI/6QGGIqSHEDw/nec_04_thumb%5B1%5D.png?imgmax=800" width="851" height="471" /&gt;&lt;/a&gt; 大功告成，其他部分的 Code 有興趣的話可以到&lt;a href="http://dragon-wind.myweb.hinet.net/NPOIExportControl.zip" target="_blank"&gt;這邊&lt;/a&gt;下載   &lt;br /&gt;  &lt;h3&gt;II. 測試&lt;/h3&gt; 建立一個測試頁面，把剛做好熱騰騰的 WebUserControl 放上去   &lt;br /&gt;接著再加入 GridView 及設定其繫結事件   &lt;br /&gt;&lt;font color="#ff0000"&gt;設定 UserControl 的 TargetGridViewID 及 SheetName 屬性 &lt;/font&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQNo6MGN3gI/AAAAAAAADQM/DgZyv4813Gc/s1600-h/nec_05%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nec_05" border="0" alt="nec_05" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TQNo7tINItI/AAAAAAAADQQ/xh6XfVFjuCg/nec_05_thumb%5B1%5D.png?imgmax=800" width="535" height="165" /&gt;&lt;/a&gt; 執行測試頁面，點下匯出之後即會把資料轉換成試算表 &lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TQNo8nKMYxI/AAAAAAAADQU/ChhIdrePz2A/s1600-h/nec_06%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="nec_06" border="0" alt="nec_06" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TQNo93nynGI/AAAAAAAADQY/-b9GCv7sCbY/nec_06_thumb%5B1%5D.png?imgmax=800" width="375" height="424" /&gt;&lt;/a&gt;   &lt;br /&gt;怎樣，是不是很簡單呢?   &lt;h3&gt;III. 小結&lt;/h3&gt; 這次只陽春地做出了匯出功能   &lt;br /&gt;&lt;font color="#ff0000"&gt;使用上也限制了 GridView 不能啟動分頁&lt;/font&gt;   &lt;br /&gt;  &lt;br /&gt;如果要加入自定樣式或是分頁也可以匯出的功能   &lt;br /&gt;可將 &lt;a href="http://dragon-wind.myweb.hinet.net/NPOIExportControl.zip" target="_blank"&gt;Source Code&lt;/a&gt;下載回去自行修改   &lt;br /&gt;坎尼有空再來擴充這個 UserControl 的功能 : )   &lt;p&gt;&lt;font color="#004000"&gt;2011/02/11 修改：User Control 已有新版本，請前往 &lt;a href="http://dotnetmis91.blogspot.com/2011/02/npoi-gridview.html" target="_blank"&gt;&lt;strong&gt;連結&lt;/strong&gt;&lt;/a&gt; 下載新的檔案&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-4092793975988950849?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/4092793975988950849/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=4092793975988950849&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4092793975988950849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/4092793975988950849'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/12/npoi-gridview.html' title='[NPOI] 輕鬆地將 GridView 匯出成試算表'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_bGOQZqQ9oEM/TQNox9jy4MI/AAAAAAAADPw/TOBYlNAc3ug/s72-c/nec_01_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-6669896910708724443</id><published>2010-12-05T10:22:00.004+08:00</published><updated>2011-01-07T21:59:33.027+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scripts'/><category scheme='http://www.blogger.com/atom/ns#' term='Readability'/><category scheme='http://www.blogger.com/atom/ns#' term='FireFox'/><category scheme='http://www.blogger.com/atom/ns#' term='FireGestures'/><title type='text'>[FireFox] 利用 FireGestures 撰寫 script 呼叫 Readability</title><content type='html'>FireFox 瀏覽器擁有許多好用附加元件是眾所皆知   &lt;br /&gt;而 &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6366/" target="_blank"&gt;FireGestures&lt;/a&gt; (滑鼠手勢)便是其中一項   &lt;br /&gt;&lt;br /&gt;今天就來介紹如何自行撰寫 &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6366/" target="_blank"&gt;FireGestures&lt;/a&gt; 的 scripts   &lt;br /&gt;用來呼叫另一個閱讀用附加元件 - &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/46442/" target="_blank"&gt;Readability&lt;/a&gt;   &lt;br /&gt;&lt;hr /&gt;&lt;h3&gt;I. 實作&lt;/h3&gt;首先，要先安裝 &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6366/" target="_blank"&gt;FireGestures&lt;/a&gt; 及 &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/46442/" target="_blank"&gt;Readability&lt;/a&gt;     &lt;br /&gt;&lt;br /&gt;接著開啟 FireFox 的 &lt;b&gt;Add-on&lt;/b&gt; 視窗，選擇 &lt;b&gt;&lt;span style="color: blue;"&gt;FireGestures –&amp;gt; 選項        &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TPr2kVzlzlI/AAAAAAAADPM/SCDU61Dmweo/s1600-h/FGR_01%5B3%5D.png"&gt;&lt;img alt="FGR_01" border="0" height="721" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TPr2pzDRUVI/AAAAAAAADPQ/2FUJ3PcENfo/FGR_01_thumb%5B1%5D.png?imgmax=800" style="border-width: 0px; display: inline;" title="FGR_01" width="818" /&gt;&lt;/a&gt;     &lt;br /&gt;進入&lt;b&gt;&lt;span style="color: blue;"&gt;手勢對應(Mapping)&lt;/span&gt;&lt;/b&gt;頁籤，選&lt;span style="color: blue;"&gt;&lt;b&gt;新增腳本手勢(Add Script…)        &lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TPr2vfl8DGI/AAAAAAAADPU/ENxkWxmjUT4/s1600-h/FGR_02%5B3%5D.png"&gt;&lt;img alt="FGR_02" border="0" height="555" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TPr22YVHPmI/AAAAAAAADPY/S-vjrtdy7Xg/FGR_02_thumb%5B1%5D.png?imgmax=800" style="border-width: 0px; display: inline;" title="FGR_02" width="887" /&gt;&lt;/a&gt;&amp;nbsp; &lt;br /&gt;填入名稱之後，在&lt;b&gt;&lt;span style="color: blue;"&gt;腳本手勢視窗(Script)&lt;/span&gt;&lt;/b&gt; 裡寫入底下這行指令     &lt;br /&gt;&lt;br /&gt;&lt;pre  class='brush: js'&gt;Readability.enableREADABILITY({target: {id: 'readability-statusbar-icon'}});&lt;/pre&gt;&lt;br /&gt;接著再設定要用的滑鼠手勢指令 &lt;br /&gt;&lt;span style="color: blue;"&gt;在&lt;b&gt;手勢(Gesture)下面的視窗&lt;/b&gt;中，&lt;b&gt;按住滑鼠右鍵不放&lt;/b&gt;，畫出想要的手勢 &lt;br /&gt;&lt;/span&gt;指令確定無誤之後就放開右鍵 &lt;span style="color: grey;"&gt;(手勢指令說明見下列表)&lt;/span&gt; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;U=Up&lt;/li&gt;&lt;li&gt;D=Down&lt;/li&gt;&lt;li&gt;L=Left&lt;/li&gt;&lt;li&gt;R=Right&lt;/li&gt;&lt;/ul&gt;舉例來講，坎尼用的是 &lt;span style="color: red;"&gt;&lt;b&gt;D&lt;/b&gt;&lt;b&gt;U&lt;/b&gt;&lt;b&gt;R&lt;/b&gt; &lt;br /&gt;滑鼠先按住右鍵不放，往下，往上，再往右，放開右鍵即會呼叫指令&lt;/span&gt; &lt;br /&gt;&lt;h3&gt;II. 實際執行畫面&lt;/h3&gt;&lt;span style="color: blue;"&gt;先在要執行指令的頁面&lt;b&gt;按住右鍵&lt;/b&gt;不放，畫下 &lt;b&gt;DUR&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;br /&gt;&lt;/b&gt;&lt;span style="color: grey;"&gt;(左下角會有指令的名稱)&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TPr2_BpCmxI/AAAAAAAADPc/Wqz0V779Ch0/s1600-h/FGR_03%5B3%5D.png"&gt;&lt;img alt="FGR_03" border="0" height="774" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TPr3Io_x_lI/AAAAAAAADPg/325K2K9Ugig/FGR_03_thumb%5B1%5D.png?imgmax=800" style="border-width: 0px; display: inline;" title="FGR_03" width="1037" /&gt;&lt;/a&gt;&amp;nbsp; &lt;br /&gt;放開滑鼠右鍵之後即會執行指令 &lt;br /&gt;&lt;span style="color: grey;"&gt;(原本密密麻麻不是很好讀的文件，瞬間就改成較舒服的閱讀方式)&lt;/span&gt; &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TPr3P_0jxBI/AAAAAAAADPk/6HIGkMCbTOo/s1600-h/FGR_04%5B4%5D.png"&gt;&lt;img alt="FGR_04" border="0" height="774" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TPr3X2TzKgI/AAAAAAAADPo/GAfKiE13CkE/FGR_04_thumb%5B2%5D.png?imgmax=800" style="border-width: 0px; display: inline;" title="FGR_04" width="1037" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;III. 小結&lt;/h3&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6366/" target="_blank"&gt;FireGestures&lt;/a&gt; 的 script 其實是 javascript-based &lt;br /&gt;所以一般的 javascript 指令也能寫在 script 中 &lt;br /&gt;或許可利用這點，開發出好用的&lt;strike&gt;懶人&lt;/strike&gt;手勢指令 : )&lt;br /&gt;&lt;br /&gt;&lt;span style="color: grey;"&gt;最後補充一點，如果有安裝 NoScript&lt;br /&gt;要執行 Readability 之前要先打開該頁主要 domain 的 script 限制&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-6669896910708724443?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/6669896910708724443/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=6669896910708724443&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6669896910708724443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6669896910708724443'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/12/firefox-firegestures-script-readability.html' title='[FireFox] 利用 FireGestures 撰寫 script 呼叫 Readability'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_bGOQZqQ9oEM/TPr2pzDRUVI/AAAAAAAADPQ/2FUJ3PcENfo/s72-c/FGR_01_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-6586510165102054628</id><published>2010-09-02T08:30:00.051+08:00</published><updated>2010-09-02T08:30:00.466+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>傳統的架站方式(非雲端運算/虛擬化環境)要如何應付超大量的流量</title><content type='html'>前陣子我負責維運的網站由於配合行銷活動的關係，在短時間內湧入超大的流量，而這個系統是用傳統的架構(也就是用多台實體 server 做 load-balance，配合網路的 VIP 設定以 IP-hashing 分流)做的，在應付這種超大流量的時候顯得力不從心，以下紀錄採用如此架構要應付超大流量時，要注意的地方。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #8e7cc3;"&gt;流量控管&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;應該請行銷人員事先通知系統管理人員何時會發行銷簡訊，以便提早設定 web server 的流量限制 (concurrent sessions)，以免瞬間倒台。雖然超出流量限制的 user 無法連線成功，但只要 retry 就可能連的上。這樣的作法可確保 web server 不會倒台，在能力範圍內提供最多的服務。&lt;/li&gt;&lt;li&gt;DB server 倒台時可能要花很長時間才能回復，在這些 downtime 時損失的流量是難以挽回的。&lt;/li&gt;&lt;li&gt;平常應該透過壓力測試，或者流量分析的歷史紀錄來評估每台 Web server 最多可接受多少個concurrent sessions，以便進行上述的流量限制。&lt;/li&gt;&lt;li&gt;Web server concurrent sessions 的設定應慢慢逐步放寬，以免瞬間超過 server 的負荷量而倒台。&lt;/li&gt;&lt;li&gt;要注意 Apache httpd.conf 裡面的「&lt;a href="http://httpd.apache.org/docs/1.3/mod/core.html#maxclients"&gt;MaxClients&lt;/a&gt;」設定值，若設定值過高可能造成 server 無法負荷(甚至造成接 console 也無反應，沒有螢幕，必須重開機)。(預設值為256)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span class="Apple-style-span" style="color: #8e7cc3;"&gt;硬體設備&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;上線前要作 end to end 的測試(包含所有備用機)，備用機的狀態應該調整到只要 VIP 一 enable，就會有流量進來的程度，只是在 VIP 設定中暫時 disable，保持隨時可以上線的狀態。本次準備的一台備用機因 OS 環境與正式環境差太多 (如 Apache 版本、Apache modules 版本等)，最後無法即時在當天 config 完成並上線提供服務。&lt;/li&gt;&lt;li&gt;設備的 RAM 應提早估計是否夠用，臨時要調 server 使用的 RAM 相當困難(e.g., 創見門市不賣 server 使用的 RAM，價錢也蠻貴的)，頂多只能把閒置的 server 停機來支援 (等到活動結束又要安排時間把 server 組態回復原狀，又要再花時間測試、驗證)。&lt;/li&gt;&lt;li&gt;IBM X3650/X3850 M2 的 RAM 無法讓 IBM X3850 使用。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;另外補充一點，MySQL DB 瞬間倒台(RAM 被吃光) 以後，除了緊急擴充 RAM 以外，還討論了以下兩種方案：&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;維持 active/standby：如此當 active server 倒台的時候 backup server 可接手服務，資料也比較不會有不一致的問題。但是現況是 backup server 的 RAM 比 active server 還弱！因此若 active server 倒台，backup server 一定撐不住 (而且會更快倒)，也就無法發揮「接手服務」的功能。&lt;/li&gt;&lt;li&gt;將 Web Server &amp;amp; DB Server 分群：如上所述，當倒台時由於 backup server 實際上無法接手 active server 的服務，因此不如設定 n 台 web server 對應 active DB server，另外 m 台 web server 對應到 backup DB server，在兩台 DB Server 資料隨時雙向同步的狀況下，同時讓兩台 DB server 一起提供服務。有的考量是怕資料會不一致，而且萬一某一台 server 倒掉了就沒人接手了。&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;最後經過討論，仍決定維持方案1 (active/standby)，幸好到後來 DB 有撐住。以當天的 loading 來看，若 RAM 沒有擴充可能會撐不住，但研判改寫程式才是 DB loading 能降低的主因(動態網頁--&amp;gt;靜態網頁)，也許未來遇到像這次可預期的超大需求的時候可以提早調整程式。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;個人的感想是採用方案二可以提供更好的效能，因為&lt;/span&gt;發生硬體障礙的機率應該是遠低於把所有的流量都導向 active server 而造成倒台。而且一旦 active server 倒台，服務會完全停擺 (standby server 一接手就會馬上倒)，除非把 web server 的流量限制設定的很嚴格，才能讓 DB 維持運作。&lt;br /&gt;&lt;br /&gt;若採用分群，則兩台 DB server 的 loading 都不會太高，倒台的機率就會大大降低，但最重要的前提是兩台 server 間的資料可以完美的同步，最後每一筆資料都要能由 timestamp 來排序。&lt;br /&gt;&lt;br /&gt;在&amp;nbsp;&lt;a href="http://dev.mysql.com/doc/mysql-ha-scalability/en/ha-overview.html"&gt;MySQL HA Overview&lt;/a&gt;&amp;nbsp;一文中官方也說明了如何提供 HA 的架構，很值得仔細研究。&lt;br /&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #8e7cc3;"&gt;其他感想&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;要擴充實體機器是相當麻煩的，遠比擴充 VM 困難的多，特別是網路設定的部份(設定 IP、VIP 等，不小心還會插錯 switch…而且插錯 switch 挺難查的，可能會造成明明網路有通，但是 apache 接不到 HTTP request 的詭異情況)。&lt;/li&gt;&lt;li&gt;如果活動真的很盛大，瞬間湧入超大的流量，那麼 DB Server 有可能會&lt;span class="Apple-style-span" style="color: red;"&gt;瞬間&lt;/span&gt;倒台，時間推測在幾十秒到一分鐘之間。假設系統架設在 Amazon EC2 上，能不能在這麼短的時間內 clone 一台新的 server 並且立刻上線提供服務？雖然說在虛擬化環境中可在短短數分鐘內就新增一台 server，相較於擴充實體 server 已經是非常快速，但要應付瞬間如此大量的需求可能還是不足，最理想的狀況是能夠在數秒鐘，或者 10 秒內就擴充第一台 server，讓整個 DB cluster 能夠撐下去，之後就比較有餘裕來進一步擴充了。&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt; &lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt; &lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt; &lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt; &lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt; &lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt; &lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #8e7cc3;"&gt;參考資料&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;Apache httpd.conf :&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;a href="http://httpd.apache.org/docs/1.3/mod/core.html#maxclients"&gt;MaxClients&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;a href="http://dev.mysql.com/doc/mysql-ha-scalability/en/ha-overview.html"&gt;MySQL HA Overview&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-6586510165102054628?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/6586510165102054628/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=6586510165102054628&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6586510165102054628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6586510165102054628'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/09/blog-post.html' title='傳統的架站方式(非雲端運算/虛擬化環境)要如何應付超大量的流量'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-6761092077857910793</id><published>2010-08-31T08:30:00.021+08:00</published><updated>2010-08-31T08:30:00.473+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smtp verification'/><category scheme='http://www.blogger.com/atom/ns#' term='becky email client'/><title type='text'>如何設定 Becky email client 的 SMTP 驗證</title><content type='html'>前陣子遇到一個問題，當以 SMTP 寄信的時候，若沒有設定驗證，有時候會發生信件無法寄出的狀況，因此建議還是要手動設定 SMTP 驗證。&lt;br /&gt;&lt;br /&gt;不同的 email client 有不同的設定畫面，而 &lt;a href="http://www.rimarts.co.jp/becky.htm"&gt;Becky&lt;/a&gt; 的 SMTP 驗證設定步驟如下。&lt;br /&gt;&lt;br /&gt;步驟一：進入Becky後，在信箱上點選右鍵，選擇「內容」&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/_qUfPJWk25s0/THuRDT5pF_I/AAAAAAAAFFo/drhHWyjpwn4/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://4.bp.blogspot.com/_qUfPJWk25s0/THuRDT5pF_I/AAAAAAAAFFo/drhHWyjpwn4/s400/1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟二：切換到「雜項」頁籤，勾選「SMTP驗證」，並在下方的「用戶名稱」及「密碼」欄位中輸入mPro的帳號以及密碼。最後按確定即可。&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/_qUfPJWk25s0/THuRUG03MlI/AAAAAAAAFFw/PIQdYvXFqO8/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_qUfPJWk25s0/THuRUG03MlI/AAAAAAAAFFw/PIQdYvXFqO8/s400/2.png" width="376" /&gt;&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/6505213162600961434-6761092077857910793?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/6761092077857910793/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=6761092077857910793&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6761092077857910793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6761092077857910793'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/becky-email-client-smtp.html' title='如何設定 Becky email client 的 SMTP 驗證'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qUfPJWk25s0/THuRDT5pF_I/AAAAAAAAFFo/drhHWyjpwn4/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-696380896796159975</id><published>2010-08-25T08:30:00.071+08:00</published><updated>2010-08-25T08:30:00.113+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outlook'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>[Outlook 2007] 如何將 Exchange Server 上的信件收到本機資料夾</title><content type='html'>以下簡單紀錄之前寫的操作步驟。&lt;br /&gt;&lt;br /&gt;步驟一：從控制台進入「郵件」設定&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_qUfPJWk25s0/THNlvg_M3kI/AAAAAAAAFDk/EAHsvOR9Dkw/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_qUfPJWk25s0/THNlvg_M3kI/AAAAAAAAFDk/EAHsvOR9Dkw/s400/1.png" width="371" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟二：選擇目前 Exchange 帳戶所在的設定檔&lt;br /&gt;(若要新增設定檔，請參考：&lt;a href="http://office.microsoft.com/zh-tw/outlook-help/HP005242382.aspx"&gt;新增 Outlook 電子郵件設定檔&lt;/a&gt;)，之後點選「內容(R)」按鈕&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/_qUfPJWk25s0/THNqvhgtsJI/AAAAAAAAFDs/kmYLrba2CYA/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_qUfPJWk25s0/THNqvhgtsJI/AAAAAAAAFDs/kmYLrba2CYA/s400/2.png" width="342" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟三： 點選「資料檔」按鈕&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_qUfPJWk25s0/THNrBerWlxI/AAAAAAAAFD0/uRIqG6z5848/s1600/3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="252" src="http://1.bp.blogspot.com/_qUfPJWk25s0/THNrBerWlxI/AAAAAAAAFD0/uRIqG6z5848/s400/3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟四：在「帳戶設定」頁面中，點選「新增(A)...」按鈕&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/_qUfPJWk25s0/THNsZQRjGZI/AAAAAAAAFD8/J4JbB1IVlvo/s1600/4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="http://2.bp.blogspot.com/_qUfPJWk25s0/THNsZQRjGZI/AAAAAAAAFD8/J4JbB1IVlvo/s400/4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟五：在「新的Outlook資料檔」畫面中，使用預設值：Office Outlook 個人資料夾檔案 (.pst)&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/_qUfPJWk25s0/THNssnQJ5dI/AAAAAAAAFEE/NGec9GR2NHg/s1600/5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="258" src="http://1.bp.blogspot.com/_qUfPJWk25s0/THNssnQJ5dI/AAAAAAAAFEE/NGec9GR2NHg/s400/5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟六：選擇新增的 .pst 檔的儲存位置，並設定檔案名稱&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/_qUfPJWk25s0/THNs_V-nj_I/AAAAAAAAFEM/i9TFf9uCbMM/s1600/6.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="253" src="http://2.bp.blogspot.com/_qUfPJWk25s0/THNs_V-nj_I/AAAAAAAAFEM/i9TFf9uCbMM/s400/6.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟七：在「建立Microsoft個人資料夾」畫面中，設定此資料檔的名稱，此名稱會顯示在Outlook中。&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/_qUfPJWk25s0/THNtS9aFRNI/AAAAAAAAFEU/d1XYqTdCNEA/s1600/7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://2.bp.blogspot.com/_qUfPJWk25s0/THNtS9aFRNI/AAAAAAAAFEU/d1XYqTdCNEA/s400/7.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟八：在「帳戶設定」畫面中，點選剛剛新增的資料檔，而後再點選上方的「設成預設值(D)」按鈕。&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/_qUfPJWk25s0/THNt1qp7UdI/AAAAAAAAFEc/a7NYY9D-35Q/s1600/8.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="http://3.bp.blogspot.com/_qUfPJWk25s0/THNt1qp7UdI/AAAAAAAAFEc/a7NYY9D-35Q/s400/8.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟九：此時由跳出的對話視窗中可看出，爾後電子郵件會被收到本機的資料夾，Exchange伺服器上的資料會被清空。&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/_qUfPJWk25s0/THNuI2BMbBI/AAAAAAAAFEk/uoLIgYTRGvM/s1600/9.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="107" src="http://1.bp.blogspot.com/_qUfPJWk25s0/THNuI2BMbBI/AAAAAAAAFEk/uoLIgYTRGvM/s400/9.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟十：啟動 Outlook 2007，此時選擇剛剛修改過的「mPro」設定檔&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/_qUfPJWk25s0/THNucVwH4eI/AAAAAAAAFEs/JirUirm8CSA/s1600/10.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://2.bp.blogspot.com/_qUfPJWk25s0/THNucVwH4eI/AAAAAAAAFEs/JirUirm8CSA/s400/10.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟十一：測試收信，可看到新的信件會被收到剛剛在本機上新增的個人資料夾&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_qUfPJWk25s0/THNu8YEG8dI/AAAAAAAAFE0/gnxUYKjlWlM/s1600/11.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="292" src="http://1.bp.blogspot.com/_qUfPJWk25s0/THNu8YEG8dI/AAAAAAAAFE0/gnxUYKjlWlM/s400/11.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟十二：在「個人資料夾」上按右鍵，選擇「”個人資料夾”的內容」，可看出此資料夾(.pst)檔是存在本機上。&lt;br /&gt;此外可登入 Exchange Server 確認是否伺服器上面的信件已經清空。&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/_qUfPJWk25s0/THNvt2V13PI/AAAAAAAAFFM/wY8OKeAOeQY/s1600/12.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_qUfPJWk25s0/THNvt2V13PI/AAAAAAAAFFM/wY8OKeAOeQY/s400/12.png" width="270" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_qUfPJWk25s0/THNvc8cwIlI/AAAAAAAAFFE/gxrOti9GzrY/s1600/13.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_qUfPJWk25s0/THNvc8cwIlI/AAAAAAAAFFE/gxrOti9GzrY/s400/13.png" width="331" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_qUfPJWk25s0/THNvxpNPe6I/AAAAAAAAFFU/fIMiDBNofVk/s1600/14.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="367" src="http://3.bp.blogspot.com/_qUfPJWk25s0/THNvxpNPe6I/AAAAAAAAFFU/fIMiDBNofVk/s400/14.png" width="400" /&gt;&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/6505213162600961434-696380896796159975?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/696380896796159975/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=696380896796159975&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/696380896796159975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/696380896796159975'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/outlook-2007-exchange-server.html' title='[Outlook 2007] 如何將 Exchange Server 上的信件收到本機資料夾'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qUfPJWk25s0/THNlvg_M3kI/AAAAAAAAFDk/EAHsvOR9Dkw/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-5859475669353389272</id><published>2010-08-18T08:30:00.072+08:00</published><updated>2010-08-18T08:30:00.207+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outlook'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo mail'/><category scheme='http://www.blogger.com/atom/ns#' term='Exchange'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>如何批次將Yahoo!信箱中的聯絡人轉到Outlook</title><content type='html'>前陣子被客戶問到「如何批次將 Yahoo! 信箱中的聯絡人轉到 Outlook」，趁機把完整的步驟記錄下來，要特別注意的是&lt;span class="Apple-style-span" style="color: red;"&gt;步驟？和步驟？&lt;/span&gt;，其他的操作倒也不複雜。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;步驟一：清除目前 iPhone 中的 Exchange 聯絡人資訊&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;(取消 iPhone 上 Exchange 帳號的聯絡人同步)&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;在 iPhone 上的「設定」點選「電子郵件/聯絡資訊/行事曆」&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TGZ9KSuMCuI/AAAAAAAAEzw/jt8Qn-BP5sg/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TGZ9KSuMCuI/AAAAAAAAEzw/jt8Qn-BP5sg/s400/1.png" width="267" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;選擇 Exchange 信箱 (e.g., xxx@emome.net)，取消同步「聯絡資訊」(點選「聯絡資訊」右邊的按鈕，讓按鈕變成白色，顯示「&lt;b&gt;O&lt;/b&gt;」。&lt;/li&gt;&lt;li&gt;在跳出的對話視窗中選擇「從 iPhone 刪除」。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TGZ_XYUYnZI/AAAAAAAAEz4/4p5Y4hg8ypc/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TGZ_XYUYnZI/AAAAAAAAEz4/4p5Y4hg8ypc/s400/2.png" width="272" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;步驟二：將&amp;nbsp;Yahoo! 信箱中的聯絡人同步到 iPhone 中&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;開啟 iTunes，點選裝置中的「xxx 的 iPhone」。&lt;/li&gt;&lt;li&gt;切換到「資訊」頁籤，勾選「同步聯絡資訊，與 Yahoo! Address Book」，之後執行 iPhone 同步。&lt;/li&gt;&lt;li&gt;同步完成後 Yahoo! 信箱中的聯絡人就可成功同步到 iPhone 中(存放於「來自我的PC」群組)。(詳細說明請參考：&lt;a href="http://tw.mobile.yahoo.com/mail/iphone"&gt;如何將 Yahoo! 奇摩通訊錄與 iPhone 同步&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_qUfPJWk25s0/TGaA0UJBnPI/AAAAAAAAE0A/_MlmMIhitt0/s1600/3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TGaA0UJBnPI/AAAAAAAAE0A/_MlmMIhitt0/s400/3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;步驟三：將&amp;nbsp;iPhone 中的 Yahoo! 聯絡人資料同步到 Outlook 帳號中&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;確認目前 Outlook 的聯絡人是空的。&lt;/li&gt;&lt;li&gt;將「同步聯絡資訊」改成與「Outlook」，之後執行 iPhone 同步，此時要注意選擇「合併」，以免將 iPhone 中的 Yahoo! 聯絡人資訊清除。&lt;/li&gt;&lt;li&gt;完成後 iPhone 中的 Yahoo! 聯絡人就同步到 Outlook 中了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_qUfPJWk25s0/TGaFB9cjEAI/AAAAAAAAE0I/cedjT6bfzOg/s1600/4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="292" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TGaFB9cjEAI/AAAAAAAAE0I/cedjT6bfzOg/s400/4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;接下來稍等幾分鐘，讓 Outlook 將聯絡人資訊同步到 Exchange Server 上。&lt;/li&gt;&lt;/ol&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;步驟四：取消 iTunes 中的「同步聯絡資訊」&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;為了避免爾後同步時在 iPhone 上產生兩份相同的 Exchange 聯絡人資訊，先取消勾選「同步聯絡資訊」，再執行一次 iPhone 同步。此時原本位於「來自我的 PC」群組的聯絡人會被轉移到「我的 iPhone」群組中。&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/_qUfPJWk25s0/TGaF3GSR6EI/AAAAAAAAE0Q/4HRHubFpwnQ/s1600/5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TGaF3GSR6EI/AAAAAAAAE0Q/4HRHubFpwnQ/s400/5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;步驟五：把 Exchange Server 上的聯絡人資訊同步到 iPhone 中&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;在 iPhone 的「設定」-&amp;gt;「電子郵件/聯絡資訊/行事曆」中，選擇 Exchange 信箱(e.g., xxx@emome.net)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_qUfPJWk25s0/TGaGsf3DlZI/AAAAAAAAE0Y/m1v_ju87UHA/s1600/6.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TGaGsf3DlZI/AAAAAAAAE0Y/m1v_ju87UHA/s400/6.png" width="267" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;設定同步「聯絡資訊」(點選「聯絡資訊」右邊的按鈕，讓按鈕變成藍色，顯示「|」。&lt;/li&gt;&lt;li&gt;在跳出的對話視窗中選擇「刪除」，如此會把「我的 iPhone」群組中的聯絡人資訊刪除，僅保留從 Exchange Server 同步下來的資訊 (位於「xxx@emome.net (Exchange)」群組中)，以免產生兩份相同的聯絡人資料。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TGaHP-N69pI/AAAAAAAAE0g/jVUBYVZR0tc/s1600/7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TGaHP-N69pI/AAAAAAAAE0g/jVUBYVZR0tc/s400/7.png" width="272" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;接下來稍等幾分鐘，讓 iPhone 把 Exchange Server 上的聯絡人資訊同步到手機上即可。若 iPhone 沒有立刻執行同步，請點選主畫面下方的「Mail」應用程式，開啟後就會自動執行同步。&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;將 Yahoo! 信箱聯絡人匯出成符合 Outlook 格式的 .csv 檔後匯入 Outlook&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;步驟一：登入 Yahoo! 信箱後，切換到「通訊錄」畫面&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/_qUfPJWk25s0/TGaHqP2YMnI/AAAAAAAAE0o/eKvAUmKvpks/s1600/8.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TGaHqP2YMnI/AAAAAAAAE0o/eKvAUmKvpks/s400/8.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟二：點選畫面右邊的「工具」-&amp;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/_qUfPJWk25s0/TGaH_VREP6I/AAAAAAAAE04/_c6PnT5JL28/s1600/9.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="215" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TGaH_VREP6I/AAAAAAAAE04/_c6PnT5JL28/s400/9.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟三：點選 Microsoft Outlook 右邊的「立即匯出」按鈕，將 Yahoo! 信箱中所有的聯絡人資料匯出為符合 Outlook 聯絡人資料的 .csv 檔&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/_qUfPJWk25s0/TGaIabZa2ZI/AAAAAAAAE1A/1KGZo8iZxMw/s1600/10.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TGaIabZa2ZI/AAAAAAAAE1A/1KGZo8iZxMw/s400/10.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟四：首先要輸入 Yahoo! 自動產生的認證碼&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/_qUfPJWk25s0/TGaIobmpCcI/AAAAAAAAE1I/BIMTwFOHnQA/s1600/11.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="142" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TGaIobmpCcI/AAAAAAAAE1I/BIMTwFOHnQA/s400/11.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟五：認證碼輸入正確後，會自動開始下載 .csv 檔，預設檔名為「yahoo_ab.csv」，請記住將檔案存到哪個位置&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/_qUfPJWk25s0/TGaJA_njE4I/AAAAAAAAE1Q/RDsOf4HHp5U/s1600/12.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TGaJA_njE4I/AAAAAAAAE1Q/RDsOf4HHp5U/s400/12.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;以下匯入 Outlook 的步驟可參考：&lt;a href="http://dotnetmis91.blogspot.com/2010/06/yahoo-outlook.html"&gt;如何批次將 Yahoo! 信箱中的行事曆匯入到 Outlook&lt;/a&gt;，有差異的地方包括以下兩點：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;選擇目的資料夾時，要選擇「聯絡人」&lt;/li&gt;&lt;li&gt;設定自訂欄位時，要根據聯絡人的各欄位設定對應關係&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;步驟六：開啟Outlook，選擇「檔案」--&amp;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/_qUfPJWk25s0/TGaKS0wRMtI/AAAAAAAAE1Y/R7GjwWDO9Pc/s1600/13.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TGaKS0wRMtI/AAAAAAAAE1Y/R7GjwWDO9Pc/s400/13.png" width="205" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟七：在「匯入及匯出精靈」中，使用預設值：從其他程式或檔案匯入，之後按「下一步」&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_qUfPJWk25s0/TGaKpSxWIyI/AAAAAAAAE1g/lqM3lR1mdnA/s1600/14.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TGaKpSxWIyI/AAAAAAAAE1g/lqM3lR1mdnA/s400/14.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟八：在「匯入檔案」精靈中，向下捲動到最下面，選擇「逗點分隔值 (Windows)」後，按「下一步」&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/_qUfPJWk25s0/TGaK4tZ24cI/AAAAAAAAE1o/FQVZ0yx6cBs/s1600/15.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TGaK4tZ24cI/AAAAAAAAE1o/FQVZ0yx6cBs/s400/15.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟九：在「匯入檔案」精靈中，點選「瀏覽(R)...」按鈕，選擇剛剛存好的 yahoo_ab.csv 檔案，按「下一步」&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/_qUfPJWk25s0/TGaLGC1eaVI/AAAAAAAAE1w/H0NUmKziYJc/s1600/16.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TGaLGC1eaVI/AAAAAAAAE1w/H0NUmKziYJc/s400/16.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟十：在選取目的資料夾視窗中，選擇「聯絡人」&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_qUfPJWk25s0/TGaLSTT6upI/AAAAAAAAE14/kzEHBnWL1cg/s1600/17.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TGaLSTT6upI/AAAAAAAAE14/kzEHBnWL1cg/s400/17.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟十一：需勾選「匯入”yahoo_ab.csv”至資料夾：聯絡人」左邊的方塊，而後點選右邊的「對應自訂欄位」按鈕，以設定欄位的對應。&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/_qUfPJWk25s0/TGaLj5LwTkI/AAAAAAAAE2A/cgM0idbN9jc/s1600/18.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TGaLj5LwTkI/AAAAAAAAE2A/cgM0idbN9jc/s400/18.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟十二：以拖拉的方式，將左邊的英文名稱拖曳到右邊的中文名稱。基本上英文和中文的欄位順序是一致的，只要按照順序拖拉一次即可。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_qUfPJWk25s0/TGaL0H8AsII/AAAAAAAAE2I/6IjcIEGY20A/s1600/19.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TGaL0H8AsII/AAAAAAAAE2I/6IjcIEGY20A/s400/19.png" width="400" /&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/_qUfPJWk25s0/TGaL6georAI/AAAAAAAAE2Q/eVftXL-K5Ms/s1600/20.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TGaL6georAI/AAAAAAAAE2Q/eVftXL-K5Ms/s400/20.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;重要：若沒有設定好欄位對應，匯入Outlook後資料會是一片空白：&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/_qUfPJWk25s0/TGaMS8cYejI/AAAAAAAAE2Y/BE8V5GVsiOM/s1600/21.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="237" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TGaMS8cYejI/AAAAAAAAE2Y/BE8V5GVsiOM/s400/21.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_qUfPJWk25s0/TGaMXYAfx2I/AAAAAAAAE2g/NWSFh8koyX8/s1600/22.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="317" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TGaMXYAfx2I/AAAAAAAAE2g/NWSFh8koyX8/s400/22.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;步驟十三：自訂欄位設定完畢後，點選「完成」按鈕，就會開始匯入。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TGaMhVqc0jI/AAAAAAAAE2o/M9uQtlnyhn0/s1600/23.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TGaMhVqc0jI/AAAAAAAAE2o/M9uQtlnyhn0/s400/23.png" width="400" /&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="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-5859475669353389272?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/5859475669353389272/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=5859475669353389272&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5859475669353389272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5859475669353389272'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/yahoooutlook.html' title='如何批次將Yahoo!信箱中的聯絡人轉到Outlook'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qUfPJWk25s0/TGZ9KSuMCuI/AAAAAAAAEzw/jt8Qn-BP5sg/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3938021982835845967</id><published>2010-08-16T08:30:00.004+08:00</published><updated>2010-08-16T08:30:00.291+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BetterAWStats'/><category scheme='http://www.blogger.com/atom/ns#' term='AWStats'/><category scheme='http://www.blogger.com/atom/ns#' term='JAWStats'/><title type='text'>兩種更好的 AWStats 報表呈現方式 - BetterAWStats ＆ JAWStats</title><content type='html'>前陣子在 AWStats 上啟用了內建的日報表 (daily report) 功能，接下來繼續 survey 週報表 (weekly report)，無意間找到另外兩個讓 AWStats 的報表呈現全新風貌的套件：&lt;a href="http://betterawstats.com/main/"&gt;BetterAWStats&lt;/a&gt; 和 &lt;a href="http://www.jawstats.com/"&gt;JAWStats&lt;/a&gt; (這兩個套件的 link 可以參考 &lt;a href="http://en.wikipedia.org/wiki/AWStats"&gt;Wikipedia - AWStats&lt;/a&gt; 的 &lt;a href="http://en.wikipedia.org/wiki/AWStats#External_links"&gt;External links&lt;/a&gt;，看來也沒有其他提供不同&amp;nbsp;AWStats Report 格式的 project 了)。&lt;br /&gt;&lt;br /&gt;安裝這兩個套件以後，除了可以更輕鬆的閱讀 AWStats 報表以外，這兩個套件也各自提供了一些官方 AWStats 報表無法提供的功能。另一個好處是這兩個套件的作法都是讀取 AWStats 的統計資料後，再以不同的方式呈現報表，因此不會對系統造成額外的負擔。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;BetterAWStats&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;基本資料&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://betterawstats.com/main/"&gt;官網&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://betterawstats.com/main/a/demo"&gt;Online Demo &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://betterawstats.com/forum/"&gt;Help Forum&lt;/a&gt;&lt;/li&gt;&lt;li&gt;安裝 &amp;amp; config.php 修改方式請參考 betterawstats-1.0.zip 解壓縮後的 \betterawstats\docs\install.txt，蠻簡單的&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: blue;"&gt;最大的優點&lt;/span&gt;：可檢視&lt;span style="color: red;"&gt;跨年度&lt;/span&gt;的統計資料 (稱為 &lt;b&gt;Monthly history&lt;/b&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/_qUfPJWk25s0/TGNnpU27THI/AAAAAAAAEyk/hp579Ye8zKc/s1600/BetterAWStats_Monthly+history.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TGNnpU27THI/AAAAAAAAEyk/hp579Ye8zKc/s400/BetterAWStats_Monthly+history.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;AWStats 官方的報表只能看到「某年度所有月份」的統計資料：&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_qUfPJWk25s0/TGNo4c9ZqtI/AAAAAAAAEys/v0uUOG0dhpY/s1600/AWStats_Monthly+history.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="338" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TGNo4c9ZqtI/AAAAAAAAEys/v0uUOG0dhpY/s400/AWStats_Monthly+history.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;因此若有「檢視跨年度資料」的需求，就適合用 BetterAWStats 來呈現。&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;安裝欲到的問題 &amp;amp; 解法&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://betterawstats.com/forum/viewtopic.php?f=3&amp;amp;t=14#p23"&gt;Call to undefined function: memory_get_peak_usage [Fixed]&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.vbulletin.com/forum/showthread.php?78563-Fatal-error-Allowed-memory-size-of-8388608-bytes-exhausted"&gt;[Php] Fatal error: Allowed memory size of 16777216 bytes exhausted&lt;/a&gt; (tried to a&lt;br /&gt;llocate 20001 bytes) in /betterawstats/core/data.inc.php on line 331&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: blue;"&gt;使用上的問題&lt;/div&gt;&lt;ul&gt;&lt;li&gt;繪製網頁的速度挺慢的，也很吃 server 的 memory。我管理的 site 中資料比較大的，甚至會超出 php.ini 中設定的 memory_limit (64 MB) (已經從預設的 16 MB 放大4倍了)。&lt;/li&gt;&lt;li&gt;All(daily) 和 All(monthly) 的表格呈現方式不容易閱讀 (橫向無限延伸)。&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;JAWStats&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;基本資料&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jawstats.com/"&gt;官網&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jawstats.com/demo"&gt;Online Demo&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jawstats.com/community"&gt;JAWStats Community Forum&lt;/a&gt;&lt;/li&gt;&lt;li&gt;安裝方式請參考官網的 &lt;a href="http://www.jawstats.com/documentation"&gt;Documentation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: blue;"&gt;最大的優點&lt;/span&gt;：繪製網頁的速度快，介面看起來很新穎 (Table 欄位都支援排序)，用起來心情比較好&lt;br /&gt;&lt;br /&gt;Visitors each Month (月份可跨年)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TGNuT4oNADI/AAAAAAAAEy0/DQVAehjYIAA/s1600/JAWStats_Monthly+history.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="272" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TGNuT4oNADI/AAAAAAAAEy0/DQVAehjYIAA/s400/JAWStats_Monthly+history.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Visitors each Year (可檢視各年度總計) &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TGNvHWlXEGI/AAAAAAAAEzE/8ET0A76oncI/s1600/JAWStats_Monthly+history2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TGNvHWlXEGI/AAAAAAAAEzE/8ET0A76oncI/s400/JAWStats_Monthly+history2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;Calendar of Visitors this Month (可提供&lt;span style="color: red;"&gt;週流量/點擊數統計&lt;/span&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/_qUfPJWk25s0/TGNxZX1-JqI/AAAAAAAAEzU/dmCWQp_rcV0/s1600/JAWStats_Calendar+of+Visitors+this+Month.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="313" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TGNxZX1-JqI/AAAAAAAAEzU/dmCWQp_rcV0/s400/JAWStats_Calendar+of+Visitors+this+Month.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;安裝欲到的問題 &amp;amp; 解法&lt;/div&gt;&lt;ul&gt;&lt;li&gt;由於 JAWStats 已經好久沒更新了，因此有人把這個 project fork 出一個叫做 &lt;a href="http://mawstats.lingnu.com/index.php/MAWStats_Home"&gt;MAWStats&lt;/a&gt; 的 project，目標提供更多的報表檢視方式，但是我一直裝不起來，MAWStats 始終無法讀取 AWStats 的統計資料。&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: blue;"&gt;使用上的問題&lt;/div&gt;&lt;ul&gt;&lt;li&gt;JAWStats 是根據 AWStats 的月報表格式來設計，不支援日報表 (daily report)，不過這點影響不算大，日報表用 AWStats 內建的報表格式即可。&lt;/li&gt;&lt;li&gt;如同作者所說 (&lt;a href="http://www.jawstats.com/about"&gt;Any disadvantages?&lt;/a&gt;)，壞處是 mouse click 比以前多，因為每一個分頁都只有顯示以前完整報表的一部分資料。但我覺得這也沒太大問題，反應速度快比較重要。&lt;/li&gt;&lt;/ul&gt;&lt;div style="color: blue;"&gt;小結&lt;/div&gt;&lt;br /&gt;就這兩個套件來說，安裝 &amp;amp; 設定 &amp;amp; 使用都很簡單，但是 JAWStats 的介面更新穎好用，且反應速度比 BetterAWStats 快很多，功能也更強，因此最後還是推薦 JAWStats 啦！可惜這套件已經超久沒更新了 ... 希望未來更新版的 AWStats 的資料格式都可以維持 backward compatibility，不然就麻煩啦！&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #666666;"&gt;(因為 OS、Search Engine、Browser 的版本不斷推陳出新，因此 AWStats 主程式也常常需要跟著升級，不然就無法辨識最新版的軟體了。)&lt;/div&gt;&lt;br /&gt;參考資料：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/AWStats"&gt;Wikipedia - AWStats&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://betterawstats.com/main/"&gt;BetterAWStats&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jawstats.com/"&gt;JAWStats&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3938021982835845967?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3938021982835845967/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3938021982835845967&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3938021982835845967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3938021982835845967'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/awstats-betterawstats-jawstats.html' title='兩種更好的 AWStats 報表呈現方式 - BetterAWStats ＆ JAWStats'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qUfPJWk25s0/TGNnpU27THI/AAAAAAAAEyk/hp579Ye8zKc/s72-c/BetterAWStats_Monthly+history.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1922747527655164773</id><published>2010-08-13T08:30:00.031+08:00</published><updated>2010-08-13T08:30:00.610+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIKULI'/><category scheme='http://www.blogger.com/atom/ns#' term='PYTHON'/><title type='text'>SIKULI 初體驗 -2：進階技巧 ＆ 其他感想</title><content type='html'>上週日分享了一篇：&lt;a href="http://dotnetmis91.blogspot.com/2010/08/sikuli-sikuli-50-awstats-report-mht.html"&gt;SIKULI 初體驗 - 利用 SIKULI 每日自動將 50 個&amp;nbsp;AWStats Report 另存為 mht 檔&lt;/a&gt;，這週又花了些時間持續改進。&lt;br /&gt;&lt;br /&gt;雖然經過幾次測試，感覺已經沒甚麼問題了，但最後想到這樣的東西要&lt;b style="color: red;"&gt;交接&lt;/b&gt;其實蠻困難的，因此最後捨棄了這個完整版，另外花了 10 分鐘改出一個精簡版，只有自動去抓 4 個很複雜的綜合報表下來另存，並且用 FileZilla 上傳到 Server 而已。 &lt;br /&gt;&lt;br /&gt;經過幾天的實作，又更深入的瞭解到 SIKULI 的好處 &amp;amp; 應用上的限制，以下是簡單的紀錄。&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;進階技巧&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;SIKULI command line tool&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;SIKULI 是可以接受 command line 參數的，我遇到的狀況是 SIKULI 執行有時候會失敗，而我要抓的 mht 檔可以分為幾個群組，因此後來我把每個群組包成一個 function，新增一些 command line 參數來對應這些 function，如此就可透過 command line 參數來控制要重跑哪一個 function 了。&lt;br /&gt;&lt;br /&gt;SIKULI command line tool 的相關說明可從&lt;a href="http://sikuli.org/"&gt;官網&lt;/a&gt;點選 &lt;a href="http://groups.csail.mit.edu/uid/sikuli/download.shtml"&gt;download&lt;/a&gt; 之後，在左下的 Others 中點選 Command Line Tool 連結，如下圖：&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/_qUfPJWk25s0/TFklR_0chRI/AAAAAAAAEyA/XrYdYWlO2Vo/s1600/SIKULI_Command+Line+Tool.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TFklR_0chRI/AAAAAAAAEyA/XrYdYWlO2Vo/s400/SIKULI_Command+Line+Tool.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;傳遞 command line 參數給 SIKULI 的範例 (在 cmd 視窗中執行以下指令)：&lt;br /&gt;&lt;br /&gt;C:\Program Files\Sikuli\Sikuli-IDE.bat   -r &lt;b style="color: red;"&gt;"&lt;/b&gt;&lt;i&gt;\path\to\your\sikuli project folder\xxx.sikuli&lt;/i&gt;&lt;b style="color: red;"&gt;"&lt;/b&gt; --args &lt;i&gt;&lt;b&gt;yourArgs&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;SIKULI 從 command line 接受到參數以後，會存在 &lt;span style="color: red;"&gt;sys.argv&lt;/span&gt; 裡頭 (其實底層就是 Python 啦)，應用方式請參考：&lt;a href="http://www.faqs.org/docs/diveintopython/kgp_commandline.html"&gt;Handling command line arguments (sys.argv)。&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;這次遇到的問題&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;SIKULI Runtime Exception&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;有一次在實際執行 SIKULI script 的時候，經過了 30 個迴圈，忽然冒出以下這個 C++ Runtime Error，按下確定以後整個&amp;nbsp;SIKULI process 就消失了 (IDE 也掛了)，完全不知道為甚麼 ... 但之後執行了很多次都不會遇到這個問題，可見現階段 SIKULI 還是不太穩定。&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/_qUfPJWk25s0/TFkoIYz6SHI/AAAAAAAAEyI/pJGc3e8NpP0/s1600/SIKULI_RuntimeError.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TFkoIYz6SHI/AAAAAAAAEyI/pJGc3e8NpP0/s400/SIKULI_RuntimeError.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;SIKULI Project Rename 後不會自動刪除舊的 .py 和 .htm 檔&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;在 SIKULI IDE 中可以選擇「檔案」-&amp;gt;「另存為」將 project 取個新名字後另存，但是舊的 .py 和 .htm 檔不會自動刪除，必須手動刪除，有點小小的麻煩。&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/_qUfPJWk25s0/TFkoYIzeskI/AAAAAAAAEyQ/busxT7tL_9w/s1600/SIKULI_Rename_still_keep_old_py_html.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TFkoYIzeskI/AAAAAAAAEyQ/busxT7tL_9w/s400/SIKULI_Rename_still_keep_old_py_html.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;其他感想：&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SIKULI IDE 不支援 ctrl-z，無法很快速的復原上一個操作。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;在&amp;nbsp;Windows 上，明明每次都在全螢幕模式下關閉程式，但 IE 和 Excel 在開關多次以後，&lt;b&gt;有時候&lt;/b&gt;會以「非全螢幕」的方式啟動，導致我要另外叫 SIKULI 去視窗上按右鍵後輸入「x」來確保視窗是全螢幕執行，很麻煩。 &lt;br /&gt;&lt;/li&gt;&lt;li&gt;如果在設定「排定的工作」時選擇將電腦喚醒後執行 SIKULI script，當電腦進入待命/休眠狀態，再被喚醒執行 SIKULI script 時，往往會發生錯誤 (最常見的是無法辨認某張圖片)，即使手動重新執行也可能會持續出錯，再重開機以後就恢復正常，不確定是啥問題。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SIKULI 執行時有時候會造成短暫的 delay (e.g., 0.x 秒)，如此可能會造成某張圖片無法辨識，因為該跳出的對話視窗還來不及跳出來。我的解法是多利用 &lt;a href="http://sikuli.org/trac/wiki/reference-0.10#wait"&gt;wait&lt;/a&gt; 和 &lt;a href="http://sikuli.org/trac/wiki/reference-0.10#waitVanish"&gt;waitVanish&lt;/a&gt;，讓 SIKULI 等到預期的對話視窗出現以後再執行動作。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;承上，wait 和&amp;nbsp;waitVanish 的預設 timeout 時間是 &lt;span style="color: red;"&gt;3 秒&lt;/span&gt;，但以「IE另存新檔」這個對話視窗為例，執行時間要視該網頁的複雜程度而定，有可能要超過 3 秒才能存檔完畢，因此適當的調整 timeout 秒數是很重要的，否則後面的程式一執行可能會讓系統整個亂掉。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;程式可攜性 (Portability)：由於 SIKULI 的核心 &amp;amp; 最有魅力的特點是內建&lt;span style="color: red;"&gt;電腦視覺引擎&lt;/span&gt;，因此「&lt;span style="color: red;"&gt;抓圖寫程式&lt;/span&gt;」是一大賣點。但是仔細想想就會發現，如果用越多抓圖，就越會被綁在目前的操作環境中，如果把程式移到另一台電腦上，或者把 XP 的佈景主題改掉 (e.g., 藍色 -&amp;gt; 銀色)，那 SIKULI 執行失敗 (無法辨識圖片) 的機率就會越高。&lt;br /&gt;&lt;br /&gt;就這點來看，SIKULI 比較適合用在自己的工作環境的自動化，除非企業有用 AD 或者其他可以讓每個使用者桌面都維持一致的管理機制，不然 SIKULI script 要大量佈署是有困難的。(當然也可以盡量用 hotkey (e.g., ctrl-c, ctrl-v 來取代點擊 GUI 環境中的按鈕，但是這樣就不炫了...)&lt;/li&gt;&lt;/ul&gt;經過這次的實作對 SIKULI 有了初步的認識，雖然目前暫時還沒想到其他的應用，但以後自己手上又多了一個好用的工具啦！&lt;br /&gt;&lt;br /&gt;參考資料：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://groups.csail.mit.edu/uid/sikuli/download.shtml#cmd-tool"&gt;SIKULI command line tool&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sikuli.org/documentation.shtml#/trac/wiki/How%20to%20force%20Sikuli%20to%20quit%20during%20execution?"&gt;How to force a running Sikuli script to quit?&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.penzilla.net/tutorials/python/control/"&gt;An Introduction to Python: Control Structures&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.penzilla.net/tutorials/python/datatypes/"&gt;The basic python datatypes (dictionary) &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.faqs.org/docs/diveintopython/kgp_commandline.html"&gt;Handling command line arguments (sys.argv)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sikuli.org/trac/wiki/reference-0.10#ExceptionFindFailed"&gt;Exception FindFailed&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-1922747527655164773?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/1922747527655164773/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=1922747527655164773&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1922747527655164773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1922747527655164773'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/sikuli-2.html' title='SIKULI 初體驗 -2：進階技巧 ＆ 其他感想'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qUfPJWk25s0/TFklR_0chRI/AAAAAAAAEyA/XrYdYWlO2Vo/s72-c/SIKULI_Command+Line+Tool.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3630073916098304412</id><published>2010-08-12T08:30:00.030+08:00</published><updated>2010-08-12T08:30:00.468+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='shell script'/><title type='text'>[Linux/Unix] 讓 script 在登出後仍可繼續在背景執行 - at 排程</title><content type='html'>在&lt;a href="http://dotnetmis91.blogspot.com/2010/08/awstats-error-command-for-pipe.html"&gt;之前的文章&lt;/a&gt;中曾經提到，因為改了 cron job 的執行時間，導致 awstats.pl 執行失敗，必須重跑 cron job。由於是在週末發現這個狀況，因此我透過 VPN 連回公司下指令 (sh /path/to/awstats.pl -update ...)，但由於&amp;nbsp;VPN 有限制幾分鐘內沒有向 server 要求資料就會自動斷線，但 awstats.pl 分析一個網站往往要耗時 15~20 分鐘，且 VPN 連線過程中若登出&amp;nbsp;server (手動 or 被踢出)，則執行中的 script 就會被中斷了，最後發現利用 &lt;b&gt;at 排程&lt;/b&gt; + &lt;b&gt;背景執行&lt;/b&gt;就可以解決這個問題。&lt;br /&gt;&lt;br /&gt;只要輸入 at HH:mm YYYY-MM-DD，按 Enter 後，再輸入「perl /path/to/awstats.pl -update ... &lt;span style="color: red;"&gt;&amp;amp;&lt;/span&gt;」，按 Enter，最後按 ctrl+d 結束 at 排程的編輯即可。&lt;br /&gt;&lt;br /&gt;其中關於 at 排程的設定可參考：&lt;a href="http://linux.vbird.org/linux_basic/0430cron.php#atjob"&gt;鳥哥-僅執行一次的工作排程&lt;/a&gt;，至於如何讓 script 於背景執行，請參考：&lt;a href="http://linux.vbird.org/linux_basic/0440processcontrol.php#background_run"&gt;鳥哥-job control的管理&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;利用 at 排程設定的工作，即使在執行此排程的帳號登出系統的狀況下仍然可以正確執行，就和利用 cron job 執行排定的工作一樣。&lt;br /&gt;&lt;br /&gt;當然要對每個網站都手動輸入一次指令也太麻煩了，最好是把所有的 awstats.pl -update 指令包成一個 .sh 檔案，之後就只要執行那個 .sh 檔就可以啦！&lt;br /&gt;&lt;br /&gt;參考資料：&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://linux.vbird.org/linux_basic/0430cron.php#atjob"&gt;鳥哥-僅執行一次的工作排程&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linux.vbird.org/linux_basic/0440processcontrol.php#background_run"&gt;鳥哥-job control的管理&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3630073916098304412?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3630073916098304412/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3630073916098304412&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3630073916098304412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3630073916098304412'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/linuxunix-script-at.html' title='[Linux/Unix] 讓 script 在登出後仍可繼續在背景執行 - at 排程'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1970588696411553118</id><published>2010-08-11T08:30:00.009+08:00</published><updated>2010-08-11T08:30:00.313+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AWStats'/><title type='text'>[AWStats] 刪除因 awstats.pl 執行不完全造成的 awstatsMMYYYYDD.mySite.tmp.### 檔案</title><content type='html'>在&lt;a href="http://dotnetmis91.blogspot.com/2010/08/awstats-error-command-for-pipe.html"&gt;上一篇文章&lt;/a&gt;提到，前陣子調整 AWStats 更新統計資料檔的 cron job (其實就是執行 awstats.pl -update) 的時間後，AWStats 統計資料檔都沒有正常更新，除了會產生錯誤訊息以外，還會在存放統計資料檔的資料夾 (config 檔中的 DirData) 中留下檔名為 awstatsMMYYYYDD.&lt;i&gt;&lt;b&gt;mySite&lt;/b&gt;&lt;/i&gt;.tmp.### (數字可能從 3 位到 5 位) 的暫存檔案。&lt;br /&gt;&lt;br /&gt;以我管理的 AWStats Server 為例，由於要分析的網站多達 26 個，因此我有利用 DirData 這個設定值來區分不同&lt;b&gt;網站群組&lt;/b&gt;的統計資料檔，除此之外，每個網站群組下還另外細分&lt;b&gt;月報表&lt;/b&gt;以及&lt;b&gt;日報表&lt;/b&gt;資料夾，造成 xxx.tmp.### 檔案分佈在各種不同深度的目錄中，那麼要如何一次把這些檔案清光呢？&lt;br /&gt;&lt;br /&gt;一開始我想要用 ls -lR | grep tmp 指令來找出所有的暫存檔案，這個方法雖然可以把檔案名稱 &amp;amp; 檔案屬性列出來，但由於缺乏檔案的完整路徑，因此無法對檔案進行刪除或者其他的操作。&lt;br /&gt;&lt;br /&gt;後來(壞毛病又發作)我參考了 &lt;a href="http://www.killianfaughnan.com/20081112/renaming-files-as-lowercase-using-perl/"&gt;Renaming Files As Lowercase Using Perl&lt;/a&gt; 這篇文章，把 rename 的動作改成「rm -f」，由於 Perl 支援 &lt;a href="http://news.ols3.net/techdoc/old/perl_intro/c913.html"&gt;Regular Expression&lt;/a&gt;，因此要找出檔名格式為 xxx.tmp.### 的檔案非常容易。&lt;br /&gt;&lt;br /&gt;但是在測試 ok 以後我又覺得，如果每次要做類似的事情都要寫個 Perl script，或者把現有的 script 打開來編輯，未免也太麻煩了吧！後來同事提醒我，find 指令的回傳結果就是完整的檔案路徑，在查閱 find 指令的 &lt;a href="http://linux.die.net/man/1/find"&gt;man page&lt;/a&gt; 之後，終於發現只要用以下的一行指令就可以搞定了：&lt;br /&gt;&lt;br /&gt;find &lt;i&gt;&lt;b&gt;[AWStats DirData]&lt;/b&gt;&lt;/i&gt; -name *.tmp.* &lt;span style="color: red;"&gt;-delete&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;由於 -name 這個 switch 本身就支援 Regular Expression，因此用來找檔名中含有 tmp 的檔案相當容易，不放心的話可以先不要加上 -delete 這個 switch，就可以把找到的檔案列在螢幕上逐一確認是否有誤判的情況。&lt;br /&gt;&lt;br /&gt;確認把暫存檔案 (xxx.tmp.###) 都找出來以後，加上 -delete 這個 switch，find 就會幫你把找出來的檔案砍掉囉！ &lt;br /&gt;&lt;br /&gt;找到正確作法 (&amp;amp; find 的正確用法) 以後，感覺真是爽快阿 :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-1970588696411553118?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/1970588696411553118/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=1970588696411553118&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1970588696411553118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1970588696411553118'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/awstats-awstatspl-awstatsmmyyyyddmysite.html' title='[AWStats] 刪除因 awstats.pl 執行不完全造成的 awstatsMMYYYYDD.mySite.tmp.### 檔案'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-5246348697709204781</id><published>2010-08-09T15:52:00.000+08:00</published><updated>2010-08-09T15:52:38.905+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AWStats'/><title type='text'>[AWStats] [解法] Error: Command for pipe 'xxx/logresolvemerge.pl xxx.log failed, Setup may be wrong. 問題</title><content type='html'>最近發現 AWStats 更新統計資料檔耗時很久，現在都要拖到早上 8 點多才能完成，因此就調整了執行 AWStats 統計資料檔更新的 cron job，把執行時間往前移，沒想到改好以後連續兩天 AWStats 都沒有正確更新，查看執行結果以後發現如下的 log (這是自己把 awstats.pl 的 output 另存的 log，預設不會儲存)：&lt;br /&gt;&lt;br /&gt;Mon Aug&amp;nbsp; 9 01:31:06 CST 2010 Start analyzing &lt;i&gt;&lt;b&gt;[mySite]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;==================================================&lt;br /&gt;==================================================&lt;br /&gt;Create/Update database for config "/path/to/awstats.&lt;i&gt;&lt;b&gt;[mySite]&lt;/b&gt;&lt;/i&gt;.conf" by AWStats version 7.0 (build 1.969)&lt;br /&gt;From data in log file "/path/to/&lt;a href="http://logresolvemerge.pl/"&gt;logresolvemerge.pl&lt;/a&gt; /path/to/logs |"...&lt;br /&gt;Phase 1 : First bypass old records, searching new record...&lt;br /&gt;Searching new records from beginning of log file...&lt;br /&gt;&lt;span style="color: red;"&gt;Error: Command for pipe&lt;/span&gt; '/path/to/&lt;a href="http://logresolvemerge.pl/"&gt;logresolvemerge.pl&lt;/a&gt; /path/to/logs2 |' &lt;span style="color: red;"&gt;failed&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;Setup&lt;/span&gt; ('/path/to/awstats.&lt;i&gt;&lt;b&gt;[mySite]&lt;/b&gt;&lt;/i&gt;.conf' file, web server or permissions) &lt;span style="color: red;"&gt;may be wrong&lt;/span&gt;.&lt;br /&gt;Check config file, permissions and AWStats documentation (in 'docs' directory).&lt;br /&gt;Mon Aug&amp;nbsp; 9 01:31:07 CST 2010 Finish analyzing &lt;i&gt;&lt;b&gt;[mySite]&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;==================================================&lt;br /&gt;==================================================&lt;br /&gt;&lt;br /&gt;如果根據 awstats.pl 的 output 去查看 config file 內容、檔案存取權限，或者 AWStats 的文件恐怕也找不出甚麼頭緒，後來我發現每天要分析的 log 檔根本沒有被抓下來，因為我把 cron job 的執行時間移到&lt;span style="color: red;"&gt;比&amp;nbsp;log server 準備好 log 的時間更早&lt;/span&gt;了！&lt;br /&gt;&lt;br /&gt;接下來就可以很合理的懷疑，是不是「當 log 檔不存在時」awstats.pl 就會產生以上的 output？經過測試 (執行 /path/to/awstats.pl -update -DatabaseBreak=month -config= &lt;i&gt;&lt;b&gt;[mySite]&lt;/b&gt;&lt;/i&gt; 指令)，果然當 log 檔不存在時，awstats.pl 就會產生以上的 output！&lt;br /&gt;&lt;br /&gt;這個錯誤訊息跟 config 檔的內容、檔案存取權限等等是完全沒關係的 ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-5246348697709204781?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/5246348697709204781/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=5246348697709204781&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5246348697709204781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5246348697709204781'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/awstats-error-command-for-pipe.html' title='[AWStats] [解法] Error: Command for pipe &apos;xxx/logresolvemerge.pl xxx.log failed, Setup may be wrong. 問題'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3585645481233977984</id><published>2010-08-09T13:08:00.001+08:00</published><updated>2010-08-09T13:09:36.053+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tar'/><category scheme='http://www.blogger.com/atom/ns#' term='shell script'/><title type='text'>[shell script] 驗證 tar 解壓縮的執行結果</title><content type='html'>前陣子在用 tar 解壓縮更新程式的時候，發現某個檔案沒有被正確被覆蓋，經過確認，tar 指令的確有用到 -m 參數 (用法參考：&lt;a href="http://dotnetmis91.blogspot.com/2010/03/tar-modification-time-tar.html"&gt;這篇&lt;/a&gt;)，難道是 tar 這個全世界用了 N 年的工具出了問題？&lt;br /&gt;&lt;br /&gt;雖然最後證實那個檔案是因為其他的原因被還原到舊版，但是在那段真相水落石出之前的空窗期我寫了一個短短的 script 來驗證 tar 的執行結果，完整程式碼如下：&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash"&gt;#!/bin/bash&lt;br /&gt;#created by Tim, verify the tar unzip operation is successful&lt;br /&gt;#this file should be put in the /tmp directory&lt;br /&gt;&lt;br /&gt;#read the log file from the output of "tar -zxvfm XXX.tar.gz &amp;gt; /tmp/tar.log" command&lt;br /&gt;&lt;br /&gt;BASEDIR=`pwd`&amp;nbsp;&amp;nbsp;cd /tmp&lt;br /&gt;files=`cat tar.log`&lt;br /&gt;count=0&lt;br /&gt;&lt;br /&gt;for file in $files&lt;br /&gt;do&lt;br /&gt;   #check the last modified date of each file, it should be the same&lt;br /&gt;   ls -l "$BASEDIR/$file" &lt;br /&gt;   count=`expr $count + 1`&lt;br /&gt;done&lt;br /&gt;echo "count: $count"&lt;br /&gt;&lt;br /&gt;#verify files count&lt;br /&gt;#precondition: there should be only 1 .tar.gz file in the /tmp directory&lt;br /&gt;#the number of files in the .tar.gz file&lt;br /&gt;tarCount=`tar -tv -f *.tar.gz | wc -l`   &lt;br /&gt;echo "tarCount: $tarCount"&lt;br /&gt;&lt;br /&gt;if [ $count -eq $tarCount ]; then&lt;br /&gt;&lt;br /&gt;   echo "file count check OK!"&lt;br /&gt;else&lt;br /&gt;   echo "file count check FAILED!!"&lt;br /&gt;fi&amp;nbsp;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;程式很單純，只是先利用 tar 的 -v (verbose) 參數把執行過程中解壓縮的&lt;/pre&gt;&lt;pre&gt;檔案相對路徑紀錄到 /tmp 下的 tar.log 檔，而後逐一比對 log 檔中的&lt;/pre&gt;&lt;pre&gt;路徑與目前系統中實際的檔案修改時間是否相同，最後會比較 tar 檔中&lt;/pre&gt;&lt;pre&gt;所含的檔案數量與 tar.log 檔中紀錄到的檔案數量是否一致。&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;雖然這程式應該沒啥用 (tar 出問題的機率超低)，但還是擺著備忘一下，&lt;/pre&gt;&lt;pre&gt;當作 shell script 的範本也好 :p &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3585645481233977984?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3585645481233977984/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3585645481233977984&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3585645481233977984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3585645481233977984'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/shell-script-tar.html' title='[shell script] 驗證 tar 解壓縮的執行結果'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-5347830516254955810</id><published>2010-08-01T16:39:00.000+08:00</published><updated>2010-08-01T16:39:08.287+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIKULI'/><category scheme='http://www.blogger.com/atom/ns#' term='AWStats'/><title type='text'>SIKULI 初體驗 - 利用 SIKULI 每日自動將 50 個 AWStats Report 另存成 mht 檔</title><content type='html'>話說今年 1 月底的時候，看到一篇很紅的文章：&lt;a href="http://blog.vgod.tw/2010/01/30/sikuli/"&gt;Sikuli 帶來的意義與無窮的潛力&lt;/a&gt;，作者是 &lt;a href="http://blog.vgod.tw/"&gt;vgod&lt;/a&gt;，當時有些知名的網站/部落客也寫過感想：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.techbang.com.tw/posts/1907"&gt;[T客邦] 抓圖寫程式，SIKULI 將改變世界&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.myoops.org/lucifer.php/2010/01/26/sixsense"&gt;[阿宅萬事通] Pranav Mistry 的第六感與高雄餐旅學院，還有來自台灣的 Sikuli～～～&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://groups.csail.mit.edu/uid/sikuli/"&gt;SIKULI 官網&lt;/a&gt;首頁有放一個 Demo，內容是自動設定網路：&lt;br /&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FxDOlhysFcM&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/FxDOlhysFcM&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="400" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;當時看完以後覺得超炫，但是後來也沒花時間去嘗試看看，直到上週想要作一件事：把 &lt;a href="http://awstats.sourceforge.net/"&gt;AWStats&lt;/a&gt; &lt;span style="color: red;"&gt;每天&lt;/span&gt;產生的報表存成靜態網頁 (mht)，才想到用 SIKULI 應該可以很簡單的完成這樣工作！&lt;br /&gt;&lt;br /&gt;&lt;b style="color: blue;"&gt;需求&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;之所以想要作這件事情，是因為每次瀏覽 AWStats 報表的時候都是連到一個如：http://&lt;b&gt;&lt;i&gt;myAWStatsReportSite&lt;/i&gt;&lt;/b&gt;/awstats/awstats.pl?&amp;amp;config=&lt;i&gt;&lt;b&gt;mySite&lt;/b&gt;&lt;/i&gt; 的 url，此時 awstats.pl 這隻程式會讀取事先計算好的&lt;a href="http://dotnetmis91.blogspot.com/2010/07/awstats-log.html"&gt;統計資料檔&lt;/a&gt;，然後即時的繪製&lt;span style="color: red;"&gt;月報表&lt;/span&gt;。&lt;br /&gt;&lt;br /&gt;對於規模很小的網站來說大概沒啥感覺，但是對於每日流量到達 GB 以上等級的網站來說，在每月下旬的時候點選月報表的速度就明顯的慢很多，而若想要把 10 個左右的這類網站的流量合併統計，那麼到了月底的時候，即時繪製月報表最多可以花上超過 &lt;span style="color: red;"&gt;20 秒&lt;/span&gt;，這是個無法令人接受的速度！&lt;br /&gt;&lt;br /&gt;仔細想想，這種報表的資料來源是歷史資料，一旦歷史資料分析完畢以後，往後不管在任何時間點選這張報表，內容應該都是一樣的，因此很適合以靜態網頁來呈現。為了方便檔案管理 &amp;amp; 加速網路傳輸，我決定把檔案另存成 &lt;a href="http://en.wikipedia.org/wiki/MHTML"&gt;mht&lt;/a&gt; 檔，這樣以後看報表的速度就快多啦！&lt;br /&gt;&lt;br /&gt;問題是我的 AWStats 分析的網站很多，月報表 + 日報表總共有 &lt;span style="color: red;"&gt;50 個&lt;/span&gt;，叫我&lt;b style="color: red;"&gt;每天&lt;/b&gt;、&lt;b&gt;&lt;span style="color: red;"&gt;手動&lt;/span&gt;&lt;/b&gt;一個一個把網址貼到 IE，然後另存成 mht，再 FTP 到 Server 上 ..... 我才不要哩，又不是吃飽沒事幹！這就是 SIKULI 大顯身手的時候啦！&lt;span style="color: #666666;"&gt;(是說就是要把這種瑣碎工作弄成自動化，才可以每天吃飽沒事幹阿 ... Zzz)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color: blue;"&gt;SIKULI 初體驗&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;要使用 SIKULI，首先要去&lt;a href="http://groups.csail.mit.edu/uid/sikuli/"&gt;官網&lt;/a&gt;下載最新版的 SIKULI IDE:&lt;a href="http://launchpad.net/sikuli/trunk/0.10.1/+download/Sikuli-IDE-win32-0.10.1.exe"&gt;0.10.1&lt;/a&gt; (Java 6 is required)，目前對於 Windows &amp;amp; Mac 的支援較佳，聽說也有人把 SIKULI port 到 Linux 上。我抓的是 Windows 版，在 Win XPP 上安裝非常簡單，一路 Next 到底就好。&lt;br /&gt;&lt;br /&gt;Sikuli IDE 打開以後大概長這樣：&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/_qUfPJWk25s0/TFUVpm0J5GI/AAAAAAAAExo/SNxc9VrwvxU/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="317" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TFUVpm0J5GI/AAAAAAAAExo/SNxc9VrwvxU/s400/1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;版面配置跟很多主流的 IDE 差不多，很容易上手。&lt;br /&gt;&lt;br /&gt;接下來就可以動手寫程式啦！在官網的 Documentation 中有 Tutorials &amp;amp; Examples 可以參考，花點時間看過去以後就知道程式大概要怎麼寫了。&lt;br /&gt;&lt;br /&gt;基本上程式寫起來很簡單，由於 SIKULI 內建強大的電腦視覺引擎 (computer vision engine)，內建的 function 如 find、findAll、click、paste 等都可以餵入一張圖片作為參數，當 SIKULI 執行 sikuli script 時就會去比對&lt;span style="color: red;"&gt;目前螢幕上可視區域中&lt;/span&gt;與指定圖片相符合的區域 (region)，並且對該區域執行指定的動作 (e.g., click、paste)。&lt;br /&gt;&lt;br /&gt;用文字寫起來太囉唆了，直接跑一個官網上的範例最容易瞭解了： &lt;a href="http://groups.csail.mit.edu/uid/sikuli/documentation.shtml#examples/clickstars.sikuli/clickstars.html"&gt;Click all starts in Gmail&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;將 zip 檔下載解壓縮，用 SIKULI 打開後，再準備好一個 Gmail 視窗：&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/_qUfPJWk25s0/TFUlN8Y5-xI/AAAAAAAAExw/IsIhmYektL8/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TFUlN8Y5-xI/AAAAAAAAExw/IsIhmYektL8/s400/2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;經過測試，如果用範例內的 &lt;span style="color: #38761d;"&gt;find&lt;/span&gt; 函式會有問題 (TypeError: 'edu.mit.csail.uid.Match' object is not iterable，看來 &lt;span style="color: #38761d;"&gt;find&lt;/span&gt; 函式的 return 值是單一的物件，不是如陣列一樣可以作 iteration 的資料結構)，改用 &lt;span style="color: #38761d;"&gt;findAll&lt;/span&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/_qUfPJWk25s0/TFUl4LQ4ZKI/AAAAAAAAEx4/7oZ3lzs-FQg/s1600/7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="273" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TFUl4LQ4ZKI/AAAAAAAAEx4/7oZ3lzs-FQg/s400/7.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;當 SIKULI Script 在執行的時候，會看到一瞬間滑鼠游標依序由上往下把所有未標記成星號的 Gmail 郵件標記成星號，真的是非常有趣！&lt;br /&gt;&lt;br /&gt;另外，SIKULI 可以用 click / doubleClick / rightClick 等函式來模擬滑鼠事件，以 type 函式控制鍵盤輸入，因此只要可以用滑鼠 + 鍵盤完成的工作，都可以寫成程式讓 SIKULI 自動執行 &lt;span style="color: #444444;"&gt;(應該有超過 90% 的工作都可以用滑鼠 + 鍵盤完成吧？所以 SIKULI 真的是潛力無窮呢！)&lt;/span&gt;。&lt;br /&gt;&lt;br /&gt;在以 type控制鍵盤輸入方面，SIKULI 支援 Windows Key, Ctrl, Alt, Tab, Up, Down, F1~F15 等特殊鍵，非常方便，我最常用的有以下幾種：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #38761d;"&gt;type&lt;/span&gt;(&lt;span style="color: #660000;"&gt;"c"&lt;/span&gt;, &lt;span style="color: #660000;"&gt;KEY_CTRL&lt;/span&gt;)&lt;/span&gt;&lt;/b&gt;：ctrl+c&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #38761d;"&gt;type&lt;/span&gt;(&lt;span style="color: #660000;"&gt;"\t"&lt;/span&gt;, &lt;span style="color: #660000;"&gt;KEY_ALT&lt;/span&gt;)&lt;/span&gt;&lt;/b&gt;：alt + tab&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: #38761d;"&gt;sleep&lt;/span&gt;(&lt;span style="color: #660000;"&gt;n&lt;/span&gt;)&lt;/b&gt;：讓 process 睡 n 秒&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;var&lt;/i&gt; = &lt;span style="color: red;"&gt;Env&lt;/span&gt;.&lt;span style="color: #38761d;"&gt;getClipboard&lt;/span&gt;()&lt;/b&gt;：把系統剪貼簿中的暫存資料存到變數 &lt;i&gt;&lt;b&gt;var&lt;/b&gt;&lt;/i&gt; 中&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: #38761d;"&gt;paste&lt;/span&gt;(&lt;span style="color: #660000;"&gt;"IE開啟舊檔.png"&lt;/span&gt;, &lt;i&gt;var&lt;/i&gt;)&lt;/b&gt;：把變數 (URL) 貼到 IE 的「開啟舊檔 (ctrl-o )」視窗中&lt;/li&gt;&lt;/ol&gt;SIKULI 所支援的特殊鍵請參考官網文件：&lt;a href="http://sikuli.org/trac/wiki/reference-0.10#ClassKey"&gt;12. Key Constants&lt;/a&gt; 中的 &lt;a href="http://sikuli.org/trac/wiki/reference-0.10#ModifierKeys"&gt;12.1. Key Modifiers&lt;/a&gt; 和 &lt;a href="http://sikuli.org/trac/wiki/reference-0.10#SpecialKeys"&gt;12.2. Special Keys&lt;/a&gt; 。&lt;br /&gt;&lt;br /&gt;由於 Sikuli 是以 &lt;a href="http://www.jython.org/"&gt;Jython&lt;/a&gt; 為基礎發展的，而 Jython 是 &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; for the Java Platform，因此要查詢基本語法的話可以參考 Jython / Python 的資料。&lt;br /&gt;&lt;br /&gt;我這次寫的 script 邏輯如下：&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://docs.google.com/drawings/pub?id=1Oyqm_Cs_6AhES_DF1cygOfhO_zKnLvh9SnN2sFKkVrQ&amp;amp;w=738&amp;amp;h=1070" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://docs.google.com/drawings/pub?id=1Oyqm_Cs_6AhES_DF1cygOfhO_zKnLvh9SnN2sFKkVrQ&amp;amp;w=738&amp;amp;h=1070" width="275" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;程式利用的技巧就如同上述 4 點，並不困難。&lt;br /&gt;&lt;br /&gt;完整的 sikuli source files &amp;amp; excel 檔可在這裡下載：&lt;a href="http://cid-e25b289c2766addf.office.live.com/self.aspx/%E5%85%AC%E9%96%8B/test2.sikuli.zip"&gt;test2.sikuli&lt;/a&gt;、&lt;a href="http://cid-e25b289c2766addf.office.live.com/self.aspx/%E5%85%AC%E9%96%8B/AWStats%20Static%20Report%20test.xlsx"&gt;excel&lt;/a&gt; (可練習把 A8~A10 的網頁也自動抓下來)。&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;b&gt;測試情境：&lt;/b&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;AWStats Static Report test.xlsx 隨便放哪裡都可以，但是要先用 Excel 開過一次，讓檔名出現在最新開啟過的檔案清單 (MRU list)中&lt;/li&gt;&lt;li&gt;要在「我的文件」中建立一個名為「AWStats Static Reports」的資料夾 (不然就要自己重新抓圖，去改程式碼第12行)&lt;/li&gt;&lt;li&gt;script 執行完畢後會回到 SIKULI IDE (執行過程中發生錯誤也會回到 IDE 中)，此時可再檢視「我的文件」-&amp;gt;「AWStats Static Reports」中是否有三個 mht 檔。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;b&gt;Sikuli IDE 的優點：&lt;/b&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;如同&lt;a href="http://www.techbang.com.tw/posts/1907"&gt;[T客邦] 抓圖寫程式，SIKULI 將改變世界&lt;/a&gt;一文中所說，&lt;a href="http://www.digitalmediaminute.com/article/5564/sikuli-a-graphical-scripting-language"&gt;Graphical Scripting Language&lt;/a&gt; 真的是非常有趣，實際上若打開 Sikuli source files 資料夾中的 &lt;i&gt;&lt;b&gt;ProjectName&lt;/b&gt;&lt;/i&gt;.py 檔來看就可以知道，在 Sikuli IDE 中看到的圖檔在程式碼中其實是檔名 (如「1.png」)，但是 IDE 在 project 資料夾中找到這個檔以後，就把圖檔讀出來顯示在畫面上，令人覺得很親切，大大增加了程式碼的可讀性和易用性，該行程式要作甚麼真的是一目瞭然。&lt;/li&gt;&lt;li&gt;大大降低寫程式的門檻，讓一般人也有機會自己把平常操作電腦的瑣碎步驟自動化。&lt;/li&gt;&lt;li&gt;SIKULI IDE 的配色看起來很舒服。 &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;b&gt;Sikuli IDE 目前的小缺點：&lt;/b&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;在 Win XPP 下，按 Alt + Tab 從 Sikuli IDE 跳到其他視窗，再跳回 Sikuli IDE 後，(有時候)會&amp;nbsp;focus 在 Sikuli IDE 的「檔案」選單，而非程式碼編輯器中，這點不太方便。&lt;/li&gt;&lt;li&gt;將程式碼從一個 project copy 到另一個 project，或者將 project 另存新檔後，有時候會有問題，例如 function 的左括號「(」&lt;span style="color: red;"&gt;看起來&lt;/span&gt;不見了 (但是看&lt;i&gt;&lt;b&gt;ProjectName&lt;/b&gt;&lt;/i&gt;.py 檔會發現還在，如果在 IDE 裡面多加一個「(」反而會讓 script 無法執行)，或者是找不到圖檔 (這時要重新指定圖檔)，會導致執行時的 SyntaxError。 &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;b&gt;未來目標：&lt;/b&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;設定 Windows 排程，在上班前把這個 script 跑過一次，等到上班時間就可以直接瀏覽靜態的 mht 報表了 &lt;/li&gt;&lt;li&gt;在開啟 IE &amp;amp; Excel 之前，先把用來存放 mht 檔的資料夾清空&lt;/li&gt;&lt;li&gt;50 個 mht 檔都產生完畢以後，自動分門別類的以 FTP 上傳到 Server 中&lt;/li&gt;&lt;/ol&gt;經過這次的練習，以後如果要處理類似的繁瑣工作 (而且是跨應用程式的)，又多了一個好用而且超酷炫的工具啦！&lt;br /&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;b&gt;參考資料：&lt;/b&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://blog.vgod.tw/2010/01/30/sikuli/"&gt;Sikuli 帶來的意義與無窮的潛力&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.csail.mit.edu/uid/sikuli/"&gt;PROJECT SIKULI (官網)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.csail.mit.edu/uid/sikuli/documentation.shtml"&gt;PROJECT SIKULI documentation (官網)&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sikuli.org/trac/wiki/reference-0.10#ClassKey"&gt;12. Key Constants&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sikuli.org/trac/wiki/reference-0.10#ModifierKeys"&gt;12.1. Key Modifiers&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt; &lt;a href="http://sikuli.org/trac/wiki/reference-0.10#SpecialKeys"&gt;12.2. Special Keys&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://www.techbang.com.tw/posts/1907"&gt;[T客邦] 抓圖寫程式，SIKULI 將改變世界&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.myoops.org/lucifer.php/2010/01/26/sixsense"&gt;[阿宅萬事通] Pranav Mistry 的第六感與高雄餐旅學院，還有來自台灣的 Sikuli～～～&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wwfc1106.blogspot.com/2010/01/sikuli.html"&gt;wwfc的遊戲世界 - for loop&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-5347830516254955810?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/5347830516254955810/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=5347830516254955810&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5347830516254955810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5347830516254955810'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/sikuli-sikuli-50-awstats-report-mht.html' title='SIKULI 初體驗 - 利用 SIKULI 每日自動將 50 個 AWStats Report 另存成 mht 檔'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qUfPJWk25s0/TFUVpm0J5GI/AAAAAAAAExo/SNxc9VrwvxU/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-8563893038289198180</id><published>2010-08-01T12:59:00.000+08:00</published><updated>2010-08-01T12:59:07.566+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='資料剖析'/><title type='text'>[Excel 技巧] 善用資料剖析來調整資料格式 (以 MS Excel 2007 為例)</title><content type='html'>上週要調整以 &lt;a href="http://dotnetmis91.blogspot.com/2010/02/joomla-asset-management-1.html"&gt;Joomla&lt;/a&gt; 為基礎的資產管理系統中的資料格式，把原本的「保固期間」欄位改成「保固期間(起)」和「保固期間(迄)」兩個欄位，以方便將日期作為搜尋條件來過濾資料。從實際的資料來說，是要把一筆「93.3.26~94.3.25」的資料拆成「2004-03-26」和「2005-03-25」兩筆資料 &lt;span style="color: #666666;"&gt;(配合 Fabrik 套件的 Date 格式，改為 YYYY-MM-DD (ISO格式))&lt;/span&gt;，那麼該怎麼做呢？&lt;br /&gt;&lt;br /&gt;由於 Joomla 的資料是存在 MySQL 中，本來想說直接在 MySQL 中以 SQL 處理字串格式就好，但是要一口氣把「93.3.26~94.3.25」的資料拆成「2004-03-26」和「2005-03-25」是頗麻煩的，而且我對 MySQL 又不熟，所以最後還是改用 Excel 來完成啦！&lt;br /&gt;&lt;br /&gt;用 Excel 的好處是可以先編輯資料，等到所有資料都確認無誤以後再匯入到 MySQL 中。以這次的需求而言，需要先新增「起始年」、「起始月」、「起始日」、「截止年」、「截止月」、「截止日」等，如下： &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/_qUfPJWk25s0/TFTluD4YnLI/AAAAAAAAEwQ/uYHrVxIAszQ/s1600/1.1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="130" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TFTluD4YnLI/AAAAAAAAEwQ/uYHrVxIAszQ/s400/1.1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;接下來只要把這些欄位的內容處理好 (例如補零、年份要 +1911、確認格式是否正確等)，之後，再組合成最後所需的 YYYY-MM-DD 格式，然後把新增的 temp 欄位刪除就好啦！&lt;br /&gt;&lt;br /&gt;但是一打開 Excel，想要自己動手用內建 function 硬幹的壞毛病又發作了，最後發現雖然可以做的出來，但由於缺少了「split」這個重要的 function，實作起來相當麻煩，公式也會搞的很複雜，以開始年為例，我的公式如下：&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/_qUfPJWk25s0/TFTmGRr-3oI/AAAAAAAAEwY/qSgLJBFtTks/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TFTmGRr-3oI/AAAAAAAAEwY/qSgLJBFtTks/s400/2.png" width="400" /&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;span style="color: red;"&gt;=IF(OR(ISBLANK(A2), EXACT(A2, "N/A")), "", SUBSTITUTE(MID(A2, 1, 3), ".", "")+1911)&lt;/span&gt; )&lt;br /&gt;&lt;br /&gt;首先要判斷 A2 欄位的值若為空或者 N/A 就不處理，確定有資料以後再用 MID 取出所需的年、月、日等字串。為了要正確取出民國 100 年，還必需要先多取一位 (可能會多取到一個「&lt;b&gt;&lt;span style="color: red;"&gt;.&lt;/span&gt;&lt;/b&gt;」，例如「98&lt;b&gt;&lt;span style="color: red;"&gt;.&lt;/span&gt;&lt;/b&gt;」)，而多取了一位以後又要用 SUBSTITUTE 這個名字落落長的 function 來把多取的「&lt;b&gt;&lt;span style="color: red;"&gt;.&lt;/span&gt;&lt;/b&gt;」給刪除掉，非常的麻煩！&lt;br /&gt;&lt;br /&gt;雖然很麻煩，但是最後我還是把各欄位的公式都實作出來了，如下：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Start Year: =IF(OR(ISBLANK(A2), EXACT(A2, "N/A")), "", SUBSTITUTE(MID(A2, 1, 3), ".", "")+1911)&lt;/li&gt;&lt;li&gt; Start Month (TMP): =IF(OR(ISBLANK(A2),EXACT(A2,"N/A")),"",SUBSTITUTE(MID(A2,4,2),".",""))&lt;/li&gt;&lt;li&gt;Start Day (TMP): =IF(OR(ISBLANK(A2),EXACT(A2,"N/A")),"",SUBSTITUTE(MID(A2, FIND(".", A2, 4)+1, 2), "~", ""))&lt;/li&gt;&lt;li&gt;Start Month: =IF(OR(ISBLANK(A2),EXACT(A2,"N/A")),"",REPT(0, 2-LEN(N2))&amp;amp;N2)&lt;/li&gt;&lt;li&gt;Start Day: =IF(OR(ISBLANK(A2),EXACT(A2,"N/A")),"",REPT(0, 2-LEN(O2))&amp;amp;O2)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;End Year: =IF(OR(ISBLANK(A2),EXACT(A2,"N/A")),"", SUBSTITUTE(MID(A2, FIND("~", A2)+1, 3), ".", "")+1911)&lt;/li&gt;&lt;li&gt;End Month (TMP): =IF(OR(ISBLANK(A2),EXACT(A2,"N/A")),"",SUBSTITUTE(MID(A2, FIND("~", A2)+4, 2), ".", ""))&lt;/li&gt;&lt;li&gt;End Day (TMP): =IF(OR(ISBLANK(A2),EXACT(A2,"N/A")),"",SUBSTITUTE(RIGHT(A2, 2), ".", ""))&lt;/li&gt;&lt;li&gt;End Month: =IF(OR(ISBLANK(A2),EXACT(A2,"N/A")),"",REPT(0, 2-LEN(S2))&amp;amp;S2)&lt;/li&gt;&lt;li&gt;End Day: =IF(OR(ISBLANK(A2),EXACT(A2,"N/A")),"",REPT(0, 2-LEN(T2))&amp;amp;T2)&lt;/li&gt;&lt;/ul&gt;完整的 Excel 範例檔可在&lt;a href="http://cid-e25b289c2766addf.office.live.com/self.aspx/%e5%85%ac%e9%96%8b/date%20test.xlsx"&gt;這裡&lt;/a&gt;下載。 &lt;br /&gt;&lt;br /&gt;這次學到的技巧主要是「如何補零」，例如「3 -&amp;gt; 03」，作法請參考 &lt;a href="http://www.mrexcel.com/archive/General/14898.html"&gt;Padding out a cell with leading zeros&lt;/a&gt; (leading zero 是關鍵字，中文或許可翻為「前導零」？)。&lt;br /&gt;&lt;br /&gt;把公式實作出來，並且做完資料格式調整後，總是覺得不太對，Excel 沒有內建 split function 未免也太麻煩了，於是又找了一些資料 (例如這篇：&lt;a href="http://www.ehow.com/how_2102165_split-column-data-ms-excel.html"&gt;How to Split a Column of Data in MS Excel&lt;/a&gt; )，這才發現 Excel 是把「分割字串」這個強大的功能放在「資料」--&amp;gt;「資料剖析」裡面阿！&lt;span style="color: #666666;"&gt;(其實以前好像用過的，但因為少用就忘記它的存在了 Orz)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;試用了以後很快的發現，利用這功能只要不到 10 分鐘就可以把上面那一大堆公式要做的事情做完了，而且過程相當的直覺，可以節省非常多的時間阿！&lt;br /&gt;&lt;br /&gt;實作的步驟如下：&lt;br /&gt;&lt;br /&gt;步驟一：首先選取要分析的資料(A欄)，再點選「資料」--&amp;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/_qUfPJWk25s0/TFTtEJK_3xI/AAAAAAAAEwo/gPyIKUptA8w/s1600/3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="141" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TFTtEJK_3xI/AAAAAAAAEwo/gPyIKUptA8w/s400/3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟二：在「原始資料類型」中採用預設值：分隔符號(D)，之後按下一步&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/_qUfPJWk25s0/TFTtl7v2L-I/AAAAAAAAEww/qrIfCvRzSMM/s1600/4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TFTtl7v2L-I/AAAAAAAAEww/qrIfCvRzSMM/s400/4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟三：此時先進行第一次分割，把「分隔符號」設定為「~」，以區隔開始日期和截止日期。此時可在下面「預覽分欄結果」視窗中先檢視是否將字串如預期的拆開，在第三行可看出的確有正確將「99.1.2」和「100.1.1」拆開 &lt;span style="color: #666666;"&gt;(免去了用公式要多取一位，之後再用 SUBSTITUTE 把多取的一位刪除的大麻煩)&lt;/span&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/_qUfPJWk25s0/TFTt62qWQKI/AAAAAAAAEw4/rznLR7tjWHA/s1600/5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TFTt62qWQKI/AAAAAAAAEw4/rznLR7tjWHA/s400/5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟四：接下來可設定「欄位的資料格式」(此時用預設值「一般」即可)，最重要的是「目標儲存格」，在此例中，以「~」作為分隔符號會將 1 欄拆成 2 欄，因此要選一個可容納兩欄的空間，假如 Excel 中的原始資料長這樣：&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/_qUfPJWk25s0/TFTvPuROtMI/AAAAAAAAExA/3yGPw2NsPfs/s1600/6.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://3.bp.blogspot.com/_qUfPJWk25s0/TFTvPuROtMI/AAAAAAAAExA/3yGPw2NsPfs/s400/6.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;那麼就應該要選擇「K欄」&lt;span style="color: red;"&gt;($K:$K)&lt;/span&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/_qUfPJWk25s0/TFTwFZREo5I/AAAAAAAAExI/Htpu50O06U4/s1600/7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://4.bp.blogspot.com/_qUfPJWk25s0/TFTwFZREo5I/AAAAAAAAExI/Htpu50O06U4/s400/7.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/TFTwdsB1LmI/AAAAAAAAExQ/FHlvrUoT9iM/s1600/8.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="206" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TFTwdsB1LmI/AAAAAAAAExQ/FHlvrUoT9iM/s400/8.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟五：確定目標儲存格已設定為 K 欄後，按一下「完成」按鈕即可&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/_qUfPJWk25s0/TFTw4VMu0FI/AAAAAAAAExY/-fp-lCEcnnA/s1600/9.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://2.bp.blogspot.com/_qUfPJWk25s0/TFTw4VMu0FI/AAAAAAAAExY/-fp-lCEcnnA/s400/9.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;此時資料會正確被分為兩欄：&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_qUfPJWk25s0/TFTxLXG5j-I/AAAAAAAAExg/nw4eXKkhN8c/s1600/10.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_qUfPJWk25s0/TFTxLXG5j-I/AAAAAAAAExg/nw4eXKkhN8c/s400/10.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;步驟六：接下來只要按照上述步驟，分別把 K 欄和 L 欄以「&lt;b&gt;&lt;span style="color: red;"&gt;.&lt;/span&gt;&lt;/b&gt;」作為分隔符號再拆出 3 欄 (起始/截止年、月、日)，再用前面提過的&lt;a href="http://www.mrexcel.com/archive/General/14898.html"&gt;小技巧&lt;/a&gt;來補零，最後把年、月、日組合成 YYYY-MM-DD 的格式就可以了！這個作法比起直接用公式硬幹真的是太直覺，而且方便太多啦！&lt;br /&gt;&lt;br /&gt;希望這篇簡短的紀錄對有須要的人會有幫助，也希望以後自己不要再忘記 Excel 這個簡單好用的工具啦！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-8563893038289198180?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/8563893038289198180/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=8563893038289198180&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/8563893038289198180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/8563893038289198180'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/08/excel-ms-excel-2007.html' title='[Excel 技巧] 善用資料剖析來調整資料格式 (以 MS Excel 2007 為例)'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qUfPJWk25s0/TFTluD4YnLI/AAAAAAAAEwQ/uYHrVxIAszQ/s72-c/1.1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-975625212304348980</id><published>2010-07-13T21:21:00.000+08:00</published><updated>2010-07-13T21:21:00.178+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RedHat reboot hang'/><title type='text'>[可能解法] Red Hat 4 開機時卡在啟動網路介面</title><content type='html'>上禮拜有台 IBM X3850 Server 硬碟掛掉 (跑 Red Hat 4)，必須停機更換，沒想到重開機的時候會卡在「bringing up interface bond0 ...」的地方，造成每次重開機居然要花費&lt;span style="color: red;"&gt;將近 20 分鐘&lt;/span&gt; (見鬼了，又不是 mainframe ...=.=)，經過一番努力，終於發現一個可能的問題。&lt;br /&gt;&lt;br /&gt;Linux 的網路相關設定檔案的存放位置在 /etc/sysconfig/network-scripts 目錄下，通常會看到 ifcfg-bond0 (bonding 介面)、ifcfg-eth&lt;span style="color: lime;"&gt;0&lt;/span&gt; (第一張網路卡)、ifcfg-eth1 (第二張網路卡) 等等，結果在這台 Server 上除了 ifcfg-eth&lt;span style="color: lime;"&gt;0&lt;/span&gt; 以外，居然多了一個 ifcfg-eth&lt;b&gt;&lt;span style="color: red;"&gt;o&lt;/span&gt;&lt;/b&gt; (英文字母 &lt;b&gt;&lt;span style="color: red;"&gt;o&lt;/span&gt;&lt;/b&gt;)，檔案內容跟 ifcfg-eth&lt;span style="color: lime;"&gt;0&lt;/span&gt; 完全一模一樣！結果我把 ifcfg-eth&lt;b&gt;&lt;span style="color: red;"&gt;o&lt;/span&gt;&lt;/b&gt; 檔案給移到另一個目錄下，再重開機後就恢復正常了！&lt;br /&gt;&lt;br /&gt;後來為了重現這個問題，我在 Red Hat 5 上面故意用「cp ifcfg-eth&lt;span style="color: lime;"&gt;0&lt;/span&gt; ifcfg-eth&lt;b&gt;&lt;span style="color: red;"&gt;o&lt;/span&gt;&lt;/b&gt;」指令來產生一個多餘的檔案，再重新開機，結果！開機過程非常之順利 Orz&amp;nbsp; 大概不用 5 秒鐘就略過有問題的 ifcfg-eth&lt;b&gt;&lt;span style="color: red;"&gt;o &lt;/span&gt;&lt;/b&gt;設定檔，並且在螢幕上顯示「Usage ...」的警告文字 (用 runlevel 5 開機的話要自己點「詳細資訊...」按鈕才看的到)，很容易猜到問題在哪裡。&lt;br /&gt;&lt;br /&gt;於是我開始猜想是不是因為 Red Hat 4 比較&lt;i&gt;&lt;b&gt;**老實**&lt;/b&gt;&lt;/i&gt;，遇到有問題的設定檔還會一直執意要進行設定，retry N 次以後才會自動放棄？於是我又灌了一個&amp;nbsp;Red Hat 4 的 VM 來測試 (用 CD 灌的！相當復古！)，結果即使我產生 ifcfg-eth&lt;span style="color: red;"&gt;xx&lt;/span&gt;、ifcfg-eth&lt;span style="color: red;"&gt;x99&lt;/span&gt; 等內容和 ifcfg-eth&lt;span style="color: lime;"&gt;0&lt;/span&gt; 相同的亂七八糟設定檔，重開機還是不會卡住呀！Orz&lt;br /&gt;&lt;br /&gt;雖然最後沒辦法完美的重現這個問題，但是本來就不應該有 ifcfg-eth&lt;b&gt;&lt;span style="color: red;"&gt;o &lt;/span&gt;&lt;/b&gt;這種設定檔的，總之這種不應該出現的東西砍掉就對啦！&lt;br /&gt;&lt;br /&gt;(最後只能猜測，Red Hat 在 Server 上的運作跟在一般的商用 NB / VM 模擬出來的環境還是會有差異，可能在 Server 上會有更嚴謹的程序，例如發現名稱錯誤的設定檔還是要盡力設法完成設定，不能直接忽略等等 ... 但這畢竟還是猜測，手上也沒有&amp;nbsp;Server 可以灌 Red Hat 4 來當測試機，所以真正的原因還是個謎 ... &amp;gt;"&amp;lt;) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;另外補充-1：可惜 Blogger 介面不支援 &lt;a href="http://blog.sina.com.tw/dotnet/article.php?pbgid=4907&amp;amp;entryid=12586"&gt;Consolas 字型&lt;/a&gt;，不然要分辨數字&lt;span style="color: lime;"&gt;0&lt;/span&gt;和英文字母&lt;b&gt;&lt;span style="color: red;"&gt;o&lt;/span&gt;&lt;/b&gt;就方便多啦！(話說 Office 2007 好像有內建) Red Hat 開機到 runlevel 5 以後，在 GUI 介面下叫出的 terminal 也不容易分辨數字&lt;span style="color: lime;"&gt;0&lt;/span&gt;和英文字母&lt;b&gt;&lt;span style="color: red;"&gt;o&lt;/span&gt;&lt;/b&gt;，但是在 runlevel 3 下就看得很清楚了。&lt;br /&gt;&lt;br /&gt;另外補充-2：如果有設定 &lt;a href="http://ccnet.ntu.edu.tw/ntp/index.html"&gt;NTP 校時&lt;/a&gt;，Red Hat 在開機的時候就會試圖跟 time server 溝通，此時若不接上網路線，可能也會因此卡住好幾分鐘。(類似 DNS 設定錯誤，會造成開機使啟動 sendmail 卡住好幾分鐘的狀況)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-975625212304348980?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/975625212304348980/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=975625212304348980&amp;isPopup=true' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/975625212304348980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/975625212304348980'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/07/red-hat-4.html' title='[可能解法] Red Hat 4 開機時卡在啟動網路介面'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3186142051988453624</id><published>2010-07-12T22:24:00.000+08:00</published><updated>2010-07-12T22:24:45.295+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AWStats'/><title type='text'>AWStats 重新分析特定時段 log 的方法</title><content type='html'>最近手上維護的 &lt;a href="http://awstats.sourceforge.net/"&gt;AWStats&lt;/a&gt; 網站出了一點問題，連續幾天的分析報表一片空白，因此花點時間研究了如何讓 AWStats 重新分析特定時段 log 的方法。&lt;br /&gt;&lt;br /&gt;我主要參考的是：&lt;a href="http://www.neo.com.tw/archives/000555"&gt;Neo's Blog - awstats 加入/重新計算分析某時段的方法&lt;/a&gt;，但是一開始嘗試多次都沒有成功。&lt;br /&gt;&lt;br /&gt;最後我發現，若目前系統時間是 2010-07，則存放統計資料的資料夾中會出現 awstats&lt;span style="color: red;"&gt;06&lt;/span&gt;2010.&lt;i&gt;yoursite&lt;/i&gt;.txt &amp;amp; awstats&lt;span style="color: lime;"&gt;07&lt;/span&gt;2010.&lt;i&gt;yoursite&lt;/i&gt;.txt (要知道 AWStats 產出的統計資料檔放在哪個目錄，請參考 AWStats config 檔中的 &lt;a href="http://awstats.sourceforge.net/docs/awstats_config.html#DirData"&gt;DirData&lt;/a&gt; 參數)，&lt;br /&gt;&lt;br /&gt;此時若欲重新分析 2010-06 的資料，必須先把 awstats&lt;span style="color: lime;"&gt;07&lt;/span&gt;2010.&lt;i&gt;yoursite&lt;/i&gt;.txt 檔案移到 DirData 之外，否則將 &lt;a href="http://www.neo.com.tw/archives/000555"&gt;Neo's Blog - awstats  加入/重新計算分析某時段的方法&lt;/a&gt; 一文中所說的第 4 步執行完畢後，雖然可正確看到 AWStats 的 output ( Found XXX new qualified records ... 等等)，但 awstats&lt;span style="color: red;"&gt;06&lt;/span&gt;2010.&lt;i&gt;yoursite&lt;/i&gt;.txt 檔案還是不會被更新！&lt;br /&gt;&lt;br /&gt;會注意到這個問題，是因為我改完&amp;nbsp; awstats&lt;span style="color: red;"&gt;06&lt;/span&gt;2010.&lt;i&gt;yoursite&lt;/i&gt;.txt 中的 LastLine、LastTime、LastUpdated 的值以後，跑完 awstats.pl 之後只有 awstats&lt;span style="color: lime;"&gt;07&lt;/span&gt;2010.&lt;i&gt;yoursite&lt;/i&gt;.txt 檔案的最後更新時間有改變，看來 awstats.pl 根本沒有去讀 awstats&lt;span style="color: red;"&gt;06&lt;/span&gt;2010.&lt;i&gt;yoursite&lt;/i&gt;.txt 這個檔案！&lt;br /&gt;&lt;br /&gt;在第 3 步和第 4 步之間加入「把當月的統計資料檔移出 DirData 目錄」這個動作，並執行完第 4 步的重新分析後，要記得把當月的統計資料檔 (awstats&lt;span style="color: lime;"&gt;07&lt;/span&gt;2010.&lt;i&gt;yoursite&lt;/i&gt;.txt) 搬回 DirData 目錄，否則當月的統計報表會變成一片空白哦～&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;同場加映：&lt;a href="http://webcache.googleusercontent.com/search?q=cache:y5wTVjrghakJ:www.antezeta.com/blog/awstats+awstats+regenerate+a+particular+day+statistics&amp;amp;cd=1&amp;amp;hl=zh-TW&amp;amp;ct=clnk&amp;amp;gl=tw&amp;amp;client=firefox-a"&gt;Hourly, daily, (and yearly?) reporting period support debuts&lt;/a&gt;，daily report 的實作蠻簡單的，下一步是思考如何製作 weekly report。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3186142051988453624?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3186142051988453624/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3186142051988453624&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3186142051988453624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3186142051988453624'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/07/awstats-log.html' title='AWStats 重新分析特定時段 log 的方法'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-7899257020146785771</id><published>2010-07-05T10:01:00.001+08:00</published><updated>2010-07-12T22:00:51.445+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HP-UX NTP'/><title type='text'>HP-UX 的 ntp client 設定方式</title><content type='html'>前陣子測試在 &lt;a href="http://en.wikipedia.org/wiki/HP-UX"&gt;HP-UX&lt;/a&gt; 上設定 ntp client 成功了，步驟如下(參考&lt;a href="http://blog.xuite.net/ubuntu/linux/19089778"&gt;關於HP-UX「ntpq：read：can't assign requested address」問題&lt;/a&gt;)：&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;採用root 身份登入&lt;br /&gt;&lt;/li&gt;&lt;li&gt;編輯設定檔netdaemons（# vi /etc/rc.config.d/netdaemons），將 XNTPD 設定為 1&lt;br /&gt;export XNTPD=1&lt;br /&gt;&lt;/li&gt;&lt;li&gt;編輯設定檔 ntp.conf （# vi&amp;nbsp; /etc/ntp.conf，要以chmod調整檔案權限），加入下列兩行server 10.xx.xx.xx&amp;nbsp; #&amp;nbsp; Primary Time Server&lt;br /&gt;server 10.yy.yy.yy&amp;nbsp; #&amp;nbsp; Secondary Time Server&lt;br /&gt;&lt;/li&gt;&lt;li&gt;啟動 NTP 服務.（# /sbin/init.d/xntpd start）(可下 ps -ef | grep ntp 來驗證 ntp process 是否有在運作)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;檢查是否正常運作（約10分後） （# /usr/sbin/ntpq -p）&lt;/li&gt;&lt;/ol&gt;若有出現 “*” 於某列前，表示 ntp 服務正常運作，否則 ntp 服務即無正常運作。&lt;br /&gt;&lt;br /&gt;一開始參考的是 HP 官網的線上說明文件：&lt;a href="http://docs.hp.com/en/B2355-90774/ch04.html"&gt;Chapter 4 Configuring NTP&lt;/a&gt;，在 Getting Started with NTP 章節中，要特別注意的是&lt;span style="color: red;"&gt;不要設定&lt;/span&gt; /etc/rc.config.d/netdaemons 中的 NTPDATE_SERVER 參數！&lt;br /&gt;&lt;br /&gt;NTPDATE_SERVER 參數設下去之後 ntp client 就不work了，執行 ntpq -p 指令會發生以下錯誤：&lt;br /&gt;&lt;br /&gt;&lt;i&gt;[myServer]&lt;/i&gt;:/etc#ntpq -p&lt;br /&gt;No association ID's returned&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;參考資料：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://linux.vbird.org/linux_server/0440ntp.php"&gt;鳥哥的 Linux 私房菜 - NTP 時間伺服器&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ccnet.ntu.edu.tw/ntp/index.html"&gt;台大網際網路時間伺服器說明&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.hp.com/en/B2355-90774/ch04.html"&gt;HP Online Documentation: Chapter 4 Configuring NTP&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-7899257020146785771?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/7899257020146785771/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=7899257020146785771&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7899257020146785771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7899257020146785771'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/07/hp-ux-ntp-client.html' title='HP-UX 的 ntp client 設定方式'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-273858362006400841</id><published>2010-07-05T05:40:00.001+08:00</published><updated>2010-07-05T05:40:03.911+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='心得'/><title type='text'>[心得] 參加中央氣象局局慶心得</title><content type='html'>&lt;p&gt;昨天坎尼和 Tim 中午相約吃完飯，想說來去參加一下氣象局局慶活動   &lt;br /&gt;其實兩人是對傳說中的&lt;strong&gt;地球展示系統(Science On a Sphere)&lt;/strong&gt;有興趣!    &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TDD_et2k8GI/AAAAAAAABU0/5ymkjwoeSHA/s1600-h/20100704983%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="20100704983" border="0" alt="20100704983" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TDD_gMiOIdI/AAAAAAAABU4/mQV4a_nNLu8/20100704983_thumb%5B2%5D.jpg?imgmax=800" width="364" height="274" /&gt;&lt;/a&gt;     &lt;br /&gt;但到了現場才發現，好多&lt;strike&gt;蘿利和正太&lt;/strike&gt;小弟弟小妹妹跑來跑去啊~    &lt;br /&gt;展示系統又需要排隊，demo 其實已經進行一半了，兩人就跑去亂晃    &lt;br /&gt;    &lt;br /&gt;接著坎尼發現可以在樓下偷偷拍照…    &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TDD_iWElQnI/AAAAAAAABU8/L_l3gB-JbuM/s1600-h/20100704982%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="20100704982" border="0" alt="20100704982" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TDD_j1oPwHI/AAAAAAAABVA/Kau3jEV87Yw/20100704982_thumb%5B1%5D.jpg?imgmax=800" width="364" height="274" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;展示系統是以四個方位的投影機，投在圓球體上    &lt;br /&gt;控制器則是用 Wii Remote 做成    &lt;br /&gt;&lt;font color="#808080"&gt;不過到這邊坎尼心想，都用 Wii Remote 了     &lt;br /&gt;怎麼在指出地點的時候，另一手還拿出雷射筆哩…&lt;/font&gt;    &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TDD_lwAajCI/AAAAAAAABVE/wvmrJolevAk/s1600-h/20100704985%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="20100704985" border="0" alt="20100704985" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TDD_nC7zJwI/AAAAAAAABVI/UVdORi5Uhb0/20100704985_thumb%5B1%5D.jpg?imgmax=800" width="364" height="274" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;以展示來講，目前的系統已經 ok 了   &lt;br /&gt;有靜態投影片加上互動的感覺    &lt;br /&gt;&lt;font color="#808080"&gt;(但所謂的互動，也就僅止於轉轉地球…)&lt;/font&gt;    &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TDD_pJbUcOI/AAAAAAAABVM/JVJEDiGjYhI/s1600-h/20100704988%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="20100704988" border="0" alt="20100704988" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TDD_qY54iII/AAAAAAAABVQ/x5rspUAvXX4/20100704988_thumb%5B1%5D.jpg?imgmax=800" width="364" height="274" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;但在應用上，坎尼覺得氣象局可以結合即時訊息    &lt;br /&gt;把即時的天氣雲圖、氣溫、雨量、地震等資訊，投到畫面上去    &lt;br /&gt;Wii Remote 也可以增加一些點選事件，和即時訊息互動等功能    &lt;br /&gt;    &lt;br /&gt;今天 (7/5) 還有一天的展示，有興趣的朋友可以到氣象局逛逛    &lt;br /&gt;以下是熱心網友放在 Youtube 的系統 demo &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:4839b0d0-8f77-45ef-a9c2-5ba1c71ccb69" class="wlWriterEditableSmartContent"&gt;&lt;div id="0813bb1c-be84-454d-a33d-64777f863690" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=ExBJscA9NM4" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TDD_sDYbzRI/AAAAAAAABVU/wwtLO4lGdFU/videoaf58a8385858%5B5%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('0813bb1c-be84-454d-a33d-64777f863690'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/ExBJscA9NM4&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/ExBJscA9NM4&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;最後要吐槽一下，坎尼和 Tim 在 B1 排隊排的很累   &lt;br /&gt;demo 完要散場才發現，其實可以從1樓直接進去…&lt;/p&gt;  &lt;p&gt;&lt;strike&gt;然後兩個人還在&lt;strong&gt;交通部&lt;/strong&gt;氣象局門口違反交通規則&lt;/strike&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-273858362006400841?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/273858362006400841/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=273858362006400841&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/273858362006400841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/273858362006400841'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/07/blog-post.html' title='[心得] 參加中央氣象局局慶心得'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_bGOQZqQ9oEM/TDD_gMiOIdI/AAAAAAAABU4/mQV4a_nNLu8/s72-c/20100704983_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-469919018724441944</id><published>2010-06-24T16:12:00.001+08:00</published><updated>2010-06-24T16:12:17.913+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TaiwanCalendar'/><category scheme='http://www.blogger.com/atom/ns#' term='民國年'/><category scheme='http://www.blogger.com/atom/ns#' term='DotNET'/><title type='text'>[DOTNET] 利用 System.Globalization 提供的各種曆法類別取得特別的日期</title><content type='html'>今天來介紹各種 DotNET 提供的客製化曆法吧   &lt;hr /&gt;  &lt;h3&gt;I. 客製化曆法簡介&lt;/h3&gt; 首先來看一下 &lt;a href="http://msdn.microsoft.com/zh-tw/library/abeh092z.aspx"&gt;System.Globalization&lt;/a&gt; namespace   &lt;br /&gt;各種曆法類別的命名為 &lt;font color="#ff0000"&gt;xxxCalendar&lt;/font&gt;   &lt;br /&gt;  &lt;br /&gt;比方講 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.globalization.persiancalendar.aspx"&gt;PersianCalendar&lt;/a&gt; 為波斯曆   &lt;br /&gt;另外還有 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.globalization.taiwancalendar.aspx"&gt;TaiwanCalendar&lt;/a&gt;、&lt;a href="http://msdn.microsoft.com/zh-tw/library/system.globalization.japanesecalendar.aspx"&gt;JapaneseCalendar&lt;/a&gt;、&lt;a href="http://msdn.microsoft.com/zh-tw/library/system.globalization.koreancalendar.aspx"&gt;KoreanCalendar&lt;/a&gt; …等   &lt;br /&gt;  &lt;br /&gt;使用方法很簡單，大多是建立 &lt;font color="#ff0000"&gt;xxxCalendar&lt;/font&gt; 類別實體之後   &lt;br /&gt;再叫用 &lt;font color="#0000ff"&gt;.GetYear&lt;/font&gt;、&lt;font color="#0000ff"&gt;.GetMonth&lt;/font&gt;、&lt;font color="#0000ff"&gt;.GetDayOfMonth&lt;/font&gt; 方法   &lt;br /&gt;以下就用台灣曆和台灣農曆來簡單示範一下用法   &lt;h3&gt;II. 實戰&lt;/h3&gt; 首先，先建立一個要轉換曆法的日期   &lt;br /&gt;建立 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.globalization.taiwancalendar.aspx"&gt;TaiwanCalendar&lt;/a&gt; 類別   &lt;br /&gt;由於台灣曆和西元曆的月日相同，這邊只顯示相異的&lt;font color="#0000ff" size="4"&gt;民國年&lt;/font&gt;   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TCMTSfMbK0I/AAAAAAAABT8/tb7GbORB6PQ/s1600-h/TC01%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TC01" border="0" alt="TC01" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TCMTUETEhLI/AAAAAAAABUA/oRnTWZ5xnhQ/TC01_thumb%5B2%5D.png?imgmax=800" width="717" height="445" /&gt;&lt;/a&gt; 再建立 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.globalization.taiwanlunisolarcalendar_members.aspx"&gt;TaiwanLunisolarCalendar&lt;/a&gt; 來取得農曆的日期   &lt;br /&gt;看一下日期的轉換結果   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TCMTVNq3qpI/AAAAAAAABUE/375A-HCvR0A/s1600-h/TC02%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TC02" border="0" alt="TC02" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TCMTWX_IPjI/AAAAAAAABUI/Wzu60qRNqqE/TC02_thumb%5B3%5D.png?imgmax=800" width="328" height="224" /&gt;&lt;/a&gt;   &lt;br /&gt;民國年當然可以確定是正確的   &lt;br /&gt;但農曆呢? 坎尼找到了這個 &lt;a href="http://www.moi.gov.tw/dca/custom99/date.asp"&gt;網站&lt;/a&gt;   &lt;br /&gt;2010/04/24 在農曆中的確是 3/11，得證!   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TCMTXHKtHwI/AAAAAAAABUM/n-M2RKSdrfQ/s1600-h/TC03%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TC03" border="0" alt="TC03" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TCMTYITvDgI/AAAAAAAABUQ/i2SvKLrBrMM/TC03_thumb%5B2%5D.png?imgmax=800" width="221" height="352" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/zh-tw/library/system.globalization.taiwanlunisolarcalendar_members.aspx"&gt;TaiwanLunisolarCalendar&lt;/a&gt; 還可以取得天干和地支   &lt;br /&gt;有興趣的讀者可以試試   &lt;h3&gt;III. 小結 &lt;/h3&gt; 若是要在自己的系統中顯示各地不同的曆法   &lt;br /&gt;建議可以先到 &lt;a href="http://msdn.microsoft.com/zh-tw/library/abeh092z.aspx"&gt;System.Globalization&lt;/a&gt; 裡找找   &lt;br /&gt;或許會有意外的發現   &lt;br /&gt;  &lt;br /&gt;&lt;strike&gt;也有提供&lt;/strike&gt;&lt;a href="http://msdn.microsoft.com/zh-tw/library/system.globalization.thaibuddhistcalendar.aspx"&gt;&lt;strike&gt;泰國的佛教曆&lt;/strike&gt;&lt;/a&gt;&lt;strike&gt;，給有可能用到的人作參考&lt;/strike&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-469919018724441944?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/469919018724441944/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=469919018724441944&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/469919018724441944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/469919018724441944'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/06/dotnet-systemglobalization.html' title='[DOTNET] 利用 System.Globalization 提供的各種曆法類別取得特別的日期'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_bGOQZqQ9oEM/TCMTUETEhLI/AAAAAAAABUA/oRnTWZ5xnhQ/s72-c/TC01_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-9133084348815018404</id><published>2010-06-22T09:45:00.001+08:00</published><updated>2010-06-22T09:47:38.737+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FormView'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Crash'/><title type='text'>[ASPNET] 在 FormView 中使用 WebUserControl 可能會導致 Visual Studio 罷工</title><content type='html'>標題好長，不過真的有這回事嗎?   &lt;br /&gt;  &lt;br /&gt;起先是坎尼的同學問有沒有碰過類似的問題   &lt;br /&gt;坎尼一開始也是很莫名，但發現 Visual Studio 跑他的程式就會掛   &lt;br /&gt;經過一陣推敲及實驗之後，總算是發現了肇事的主因   &lt;br /&gt;  &lt;hr /&gt;  &lt;h3&gt;I. 問題描述&lt;/h3&gt; 首先是怎麼個停擺法呢?   &lt;br /&gt;  &lt;br /&gt;當在 FormView 中放入有問題的 WebUserControl 時   &lt;br /&gt;&lt;font color="#0000ff"&gt;用 DesignMode 進入 FormView 的 EditTemplates 編輯模式    &lt;br /&gt;&lt;/font&gt;會看到 WebUserControl 不停的&lt;font color="#ff0000"&gt;閃爍&lt;/font&gt;，接著 IDE 就會停擺在那邊   &lt;br /&gt;  &lt;br /&gt;&lt;font color="#808080"&gt;(註：IDE = Integrated Development Environment，本篇指 Visual Studio)    &lt;br /&gt;&lt;/font&gt;  &lt;p&gt;若運氣好，在發生問題之前就將游標移到 FormView 以外的位置    &lt;br /&gt;可以用快速鍵 &lt;font color="#0000ff"&gt;Ctrl + PgUp/PgDn&lt;/font&gt; 切換成 Source Mode     &lt;br /&gt;運氣不好，大概就要叫 Task Manager 出來結束它的生命     &lt;br /&gt;    &lt;br /&gt;先來看一下問題發生的影片 &lt;font color="#808080"&gt;(請自行放大影片     &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:52a8426e-acb9-47c0-b372-9982f57101d9" class="wlWriterEditableSmartContent"&gt;&lt;div id="3683171f-75c0-46ab-99d9-f0648a318007" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=v7gabW6OlF0" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TCAVy2lEVMI/AAAAAAAABTs/8zmb400K-V8/video8732df38e2a8%5B11%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('3683171f-75c0-46ab-99d9-f0648a318007'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/v7gabW6OlF0&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/v7gabW6OlF0&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080"&gt;影片中第一次打開 EditTemplates 時是沒有問題的      &lt;br /&gt;所以標題才會用 &amp;quot;可能&amp;quot; 而非 &amp;quot;絕對&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;h3&gt;II. 問題解決&lt;/h3&gt;  &lt;p&gt;就在坎尼看著同學的 Code 百思不得其解時    &lt;br /&gt;想說再依樣畫葫蘆自己造一個一樣的 sample 來試試     &lt;br /&gt;咦?! 實驗結果很正常!!!     &lt;br /&gt;    &lt;br /&gt;但當把坎尼同學寫的 FormView 內容 Code 直接貼到新建的 FormView 時，它又開始不停閃爍，這難道就是傳說中的&lt;a href="http://zh.wikipedia.org/zh-tw/%E9%AC%BC%E6%89%93%E7%89%86"&gt;鬼打牆&lt;/a&gt;?     &lt;br /&gt;    &lt;br /&gt;接著坎尼眉頭一皺，發覺同學的 Code 裡有不對勁的地方     &lt;br /&gt;該不會是 WebUserControl &lt;font color="#ff0000"&gt;ID 是用中文命名&lt;/font&gt;的關係吧?     &lt;br /&gt;    &lt;br /&gt;測試結果證明：&lt;font size="4"&gt;&lt;font color="#008000"&gt;還真的就是這個原因!!!&lt;/font&gt;       &lt;br /&gt;&lt;/font&gt;&lt;font color="#808080"&gt;但一般的 Controls 用中文命名都沒問題，只有 UserControl 會&lt;/font&gt;     &lt;br /&gt;    &lt;br /&gt;原本坎尼以為所有容器型的 Template 編輯模式都會發生此情況     &lt;br /&gt;嗯，坎尼又猜錯了，&lt;font color="#0000ff"&gt;只有 FormView 才會……&lt;/font&gt;     &lt;br /&gt;    &lt;br /&gt;目前測試 VS2008 和 VWD2010Express 都有此情形     &lt;br /&gt;更之前的 VS2005 坎尼手邊沒有，無法測試     &lt;br /&gt;歡迎有心提供測試結果的讀者留言 ^^&lt;/p&gt;  &lt;h3&gt;III. 小結&lt;/h3&gt;  &lt;br /&gt;  &lt;p&gt;這問題一直沒人發現 &lt;font color="#808080"&gt;(坎尼 Google 不到)&lt;/font&gt;     &lt;br /&gt;大概是大家不怎麼用中文命名，或是沒在用 FormView 吧?     &lt;br /&gt;雖然 Visual Studio 為支援 unicode 的 IDE     &lt;br /&gt;但使用上除了文字屬性以外，還是盡量以英數字為主吧 :P     &lt;br /&gt;    &lt;br /&gt;第一次錄影片，有點手忙腳亂，還請多多包涵 :D&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-9133084348815018404?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/9133084348815018404/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=9133084348815018404&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/9133084348815018404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/9133084348815018404'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/06/aspnet-formview-webusercontrol-visual.html' title='[ASPNET] 在 FormView 中使用 WebUserControl 可能會導致 Visual Studio 罷工'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_bGOQZqQ9oEM/TCAVy2lEVMI/AAAAAAAABTs/8zmb400K-V8/s72-c/video8732df38e2a8%5B11%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-7303501773030059849</id><published>2010-06-15T14:15:00.002+08:00</published><updated>2010-08-18T09:55:32.713+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSMSE'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='WEB PI'/><title type='text'>[Tools] 利用 Web PI 輔助安裝 SSMSE 2008</title><content type='html'>首先來個名詞解釋吧   &lt;br /&gt;&lt;hr /&gt;&lt;h3&gt;I. 名詞解譯&lt;/h3&gt;SSMSE = &lt;span style="color: blue;"&gt;&lt;a href="http://msdn.microsoft.com/zh-tw/library/ms365247.aspx"&gt;SQL Server Management Studio Express&lt;/a&gt;&lt;/span&gt;   &lt;br /&gt;也就是 SQL Server 管理工具，相信大家應該都不陌生   &lt;br /&gt;&lt;br /&gt;Web PI = &lt;span style="color: blue;"&gt;&lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Microsoft Web Platform Installer&lt;/a&gt;&lt;/span&gt;   &lt;br /&gt;微軟提供的免費 Web Platform 元件安裝工具，目前版本為 2.0   &lt;br /&gt;利用此工具可取得目前線上最新版本的安裝程式   &lt;br /&gt;&lt;h3&gt;II. 問題及解法&lt;/h3&gt;坎尼由於之前已先安裝了 &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=58CE885D-508B-45C8-9FD3-118EDD8E6FFF&amp;amp;displaylang=en"&gt;SQL Server 2008 Express&lt;/a&gt;   &lt;br /&gt;由於沒裝 SSMSE，在管理自己機器上資料庫很麻煩   &lt;br /&gt;&lt;br /&gt;前陣子下載了 &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=08e52ac2-1d62-45f6-9a4a-4b76a8564a2b&amp;amp;displaylang=en"&gt;SSMSE 2008&lt;/a&gt; 來安裝，卻怎樣也找不到安裝的選項   &lt;br /&gt;&lt;strike&gt;用黑暗兵法 7zip 從安裝檔把 SSMSE 抽出來也不能安裝&lt;/strike&gt;   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TBcaSml9mdI/AAAAAAAABTE/MfmmP5DhXj4/s1600-h/ssmse2008Ins00%5B3%5D.png"&gt;&lt;img alt="ssmse2008Ins00" border="0" height="500" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TBcaU2zST6I/AAAAAAAABTI/o9G9Qkv7Jic/ssmse2008Ins00_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="ssmse2008Ins00" width="742" /&gt;&lt;/a&gt; &lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TBcaV2LY5WI/AAAAAAAABTM/jjkFnR_JULs/s1600-h/ssmse2008Ins00_2%5B3%5D.png"&gt;&lt;img alt="ssmse2008Ins00_2" border="0" height="175" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TBcaXM8sbSI/AAAAAAAABTQ/LyyEN8JcmTY/ssmse2008Ins00_2_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="ssmse2008Ins00_2" width="424" /&gt;&lt;/a&gt;   &lt;br /&gt;以前在裝 SSMSE 2005 都是無腦 Next 一路裝到好   &lt;br /&gt;&lt;a href="http://goneale.com/2009/05/24/cant-install-microsoft-sql-server-2008-management-studio-express/"&gt;Search&lt;/a&gt; 一下才發現，似乎要裝新的執行個體才行   &lt;br /&gt;或是一開始就用 &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7522a683-4cb2-454e-b908-e805e9bd4e28&amp;amp;displaylang=en"&gt;SQL Server 2008 Express With Tools&lt;/a&gt; 來安裝   &lt;br /&gt;&lt;br /&gt;突然看到有人說可以用 Web PI 來安裝   &lt;br /&gt;坎尼之前用 Web PI 時並沒有看到 SSMSE 的選項啊奇怪   &lt;br /&gt;趕緊來打開 Web PI 來看一下   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TBcaayX8saI/AAAAAAAABTU/biLzyhEaImQ/s1600-h/ssmse2008Ins01%5B3%5D.png"&gt;&lt;img alt="ssmse2008Ins01" border="0" height="579" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TBcadpelD1I/AAAAAAAABTY/nnOYekRcGVE/ssmse2008Ins01_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="ssmse2008Ins01" width="772" /&gt;&lt;/a&gt;   &lt;br /&gt;最可疑的地方就是 Database 了，但它把已經有綠色勾勾了啊  &lt;br /&gt;點開自訂，Bingo! 果然是偷偷藏在這種地方啊  &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TBcagMSGP6I/AAAAAAAABTc/h1Tw1StYXlk/s1600-h/ssmse2008Ins02%5B3%5D.png"&gt;&lt;img alt="ssmse2008Ins02" border="0" height="579" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TBcaima6ZqI/AAAAAAAABTg/hZsjnCje_SU/ssmse2008Ins02_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="ssmse2008Ins02" width="772" /&gt;    &lt;br /&gt;&lt;/a&gt;勾選之後點下安裝就會開始下載安裝檔  &lt;br /&gt;SSMSE 2008 大約是 170MB 左右，請耐心等候  &lt;br /&gt;下載完會自動進行安裝，接下來跟著指示做就對了 :D   &lt;br /&gt;&lt;h3&gt;III. 小結&lt;/h3&gt;&lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Microsoft Web Platform Installer&lt;/a&gt; 真的是很好用的工具   &lt;br /&gt;有興趣的人可以到&lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;官網下載&lt;/a&gt;使用 :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-7303501773030059849?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/7303501773030059849/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=7303501773030059849&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7303501773030059849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7303501773030059849'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/06/tools-web-pi-ssmse-2008.html' title='[Tools] 利用 Web PI 輔助安裝 SSMSE 2008'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_bGOQZqQ9oEM/TBcaU2zST6I/AAAAAAAABTI/o9G9Qkv7Jic/s72-c/ssmse2008Ins00_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-155729127915931864</id><published>2010-06-12T10:20:00.003+08:00</published><updated>2010-06-14T11:36:02.465+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='itunes'/><title type='text'>iPhone 小技巧 - 移除在台灣無法使用的 iTunes Store 應用程式</title><content type='html'>最近要去當 iPhone 訓練課程的助教，於是多花了點時間認真的玩了一下 iPhone，也確認了幾個月前偶然發現的一個小技巧：移除在台灣無法使用的 iTunes Store 應用程式 (參考:&lt;a href="http://5i01.com/topicdetail.php?f=383&amp;amp;t=1042573&amp;amp;last=11801390"&gt;[m01]不能上iTunes Store&lt;/a&gt;)，以下是操作步驟。&lt;br /&gt;&lt;br /&gt;步驟一：在移除 iTunes Store 應用程式之前，iPhone 主畫面大概長這樣&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/TBLukFuxi-I/AAAAAAAADWQ/kcrNFq0leiY/s1600-h/003%5B4%5D.png"&gt;&lt;img alt="003" border="0" height="454" src="http://lh3.ggpht.com/_qUfPJWk25s0/TBLumaYT7aI/AAAAAAAADWU/p1GiFZAkXtE/003_thumb%5B2%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="003" width="304" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;步驟二：進入「設定」畫面，點選「一般」-&amp;gt;「取用限制」   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (預設是關閉的)&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TBLunw-hI0I/AAAAAAAADWY/Uw3gAnuRfRM/s1600-h/004%5B3%5D.png"&gt;&lt;img alt="004" border="0" height="454" src="http://lh6.ggpht.com/_qUfPJWk25s0/TBLup-EM8CI/AAAAAAAADWc/MKVLCpL-QK8/004_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="004" width="304" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;步驟三：在「取用限制」設定畫面中，點選上面的「啟用取用限制」按鈕(這按鈕的名字唸起來好拗口)，在啟用「取用限制」之前，下面的設定都是 disable 的&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/TBLuq7kjVzI/AAAAAAAADWg/Q5_xKGVwMSA/s1600-h/005%5B3%5D.png"&gt;&lt;img alt="005" border="0" height="454" src="http://lh6.ggpht.com/_qUfPJWk25s0/TBLuuKffoMI/AAAAAAAADWk/9jfNm37GgZA/005_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="005" width="304" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;步驟四：設定一組四位數字的「取用限制密碼」，之後要變更取用限制裡面的設定，或者啟用/取消取用限制，都需要輸入這組密碼&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TBLuv9oZPuI/AAAAAAAADWo/vTOKkOfEEfQ/s1600-h/006%5B3%5D.png"&gt;&lt;img alt="006" border="0" height="454" src="http://lh4.ggpht.com/_qUfPJWk25s0/TBLuxyy2gAI/AAAAAAAADWs/EgWF10Wte20/006_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="006" width="304" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;步驟五：重新輸入上個步驟的取用限制密碼&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/TBLuz6LzpqI/AAAAAAAADWw/89XKPICza_w/s1600-h/007%5B3%5D.png"&gt;&lt;img alt="007" border="0" height="454" src="http://lh6.ggpht.com/_qUfPJWk25s0/TBLu19f4gUI/AAAAAAAADW0/YFolXi8T6q4/007_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="007" width="304" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;步驟六：把 iTunes 關掉，在這裡可以看出，就算啟用取用限制，預設還是可以使用內建的 Safari、TouTube 等應用程式。如果出於某些很特殊的原因，想要把相機，或者 App Store 也關閉的話，一樣是在這裡設定。設定完畢之後可按左上角的「一般」回到「設定」畫面中的「一般」，或者按 Home 鍵回到主畫面，此時設定已經生效了。&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/TBLu4FLBBnI/AAAAAAAADW4/73loNHiL7II/s1600-h/008%5B7%5D.png"&gt;&lt;img alt="008" border="0" height="454" src="http://lh3.ggpht.com/_qUfPJWk25s0/TBLu7Mb0T_I/AAAAAAAADW8/COO6YR6JAVM/008_thumb%5B3%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="008" width="304" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;步驟七：移除 iTunes Store 應用程式之後的主畫面。這樣就可以把「聯絡資訊」也拉到這一頁來了，在能夠使用 iOS 4 的&lt;a href="http://www.mobile01.com/topicdetail.php?f=383&amp;amp;t=1596009&amp;amp;last=20144158"&gt;資料夾&lt;/a&gt;功能之前，利用這個小技巧可以多爭取到一點主畫面的空間。&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/TBLu93gzDjI/AAAAAAAADXA/sVbW4P_hc4M/s1600-h/009%5B3%5D.png"&gt;&lt;img alt="009" border="0" height="454" src="http://lh6.ggpht.com/_qUfPJWk25s0/TBLvAnlNIeI/AAAAAAAADXE/yFspLrv-uJk/009_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="009" width="304" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;很可惜 iTunes Store 中的音樂、電影等內容無法在台灣地區上架販售，但是有申請美國 iTunes Store 帳號的話，還是有很多&lt;a href="http://www.sogi.com.tw/newforum/article_list.aspx?topic_id=6091175"&gt;好康的&lt;/a&gt; (申請方式請參考：&lt;a href="http://dotnetmis91.blogspot.com/2010/03/iphone-app-1-itunes-store.html"&gt;iPhone App 推薦-1: 如何免費(不用信用卡)申請各國 iTunes Store 帳號&lt;/a&gt;)。&lt;br /&gt;&lt;br /&gt;希望這個小技巧對大家會有些幫助:D&lt;br /&gt;&lt;br /&gt;2010-06-14 補充：早上在 Facebook 的 &lt;a href="http://www.facebook.com/iphone.app.tw"&gt;iPhone App 應用程式&lt;/a&gt;看到：&lt;br /&gt;&lt;a href="http://kocpc.pixnet.net/blog/post/26807160"&gt;用台灣帳號也可以使用iPhone裡面的iTunes了！&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;測試了一下的確可以使用， 雖然僅限於免費內容，但還是有很多精彩的 Podcast 可以下載，還有很多教學影片，以後要充實自己的各種知識 or 追蹤最新資訊 (e.g., FIFA 2010) or 練習英聽都更方便囉！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-155729127915931864?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/155729127915931864/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=155729127915931864&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/155729127915931864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/155729127915931864'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/06/iphone-itunes-store.html' title='iPhone 小技巧 - 移除在台灣無法使用的 iTunes Store 應用程式'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_qUfPJWk25s0/TBLumaYT7aI/AAAAAAAADWU/p1GiFZAkXtE/s72-c/003_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1538873714514640087</id><published>2010-06-08T23:18:00.002+08:00</published><updated>2010-06-12T13:16:57.281+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='filezilla server'/><category scheme='http://www.blogger.com/atom/ns#' term='ftp'/><category scheme='http://www.blogger.com/atom/ns#' term='win7 firewall'/><title type='text'>在 Windows 7 用 FileZilla Server 架 FTP 站要注意的防火牆設定</title><content type='html'>昨天被問到在 Windows 7 上如何用 &lt;a href="http://filezilla-project.org/"&gt;FileZilla Server&lt;/a&gt; 架 FTP 站，其實架站步驟以及軟體安裝之後所需的設定並不複雜，重灌狂人就寫過一篇非常詳細的文章「&lt;a href="http://briian.com/?p=4618"&gt;[免費] 如何用 FileZilla Server 架 FTP 站？&lt;/a&gt;」。但是在「&lt;a href="http://briian.com/?p=4618&amp;amp;page=5"&gt;四、取得自己電腦的IP位址，讓朋友連線進來&lt;/a&gt;」這篇文章中，對於 Windows 防火牆的設定卻沒有多著墨，這裡就紀錄一下 Windows 7 的防火牆設定。&lt;br /&gt;如果你很有空的話，可以看一下這兩個 YouTube 教學影片：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=hyhWOVLknhw"&gt;How to Setup Filezilla Server on Windows 7 Part 1&lt;/a&gt; (8:24)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=87yykCXAJNw&amp;amp;feature=related"&gt;How to Setup Filezilla Server on Windows 7 Part 2&lt;/a&gt; (9:58)&lt;/li&gt;&lt;/ul&gt;但是兩個影片看完要花將近 20 分鐘，其實在將 FileZilla Server 晚體安裝完畢，並且設定好帳號和 shared folder 之後，在大多數的情況下只要調整好 Windows 防火牆的設定就可以讓 FTP 站正常運作了，以下是設定的步驟：&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟一：確認 FileZilla Server FTP server 這個 Windows 服務有沒有正常啟動&lt;/span&gt;    &lt;br /&gt;(在 Windows 7 開始功能表的搜尋框中打「Services」就可以叫出服務管理員)&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TA5e9vsqM_I/AAAAAAAADVg/hgavFt8ilYU/s1600-h/0%5B4%5D.png"&gt;&lt;img alt="0" border="0" height="298" src="http://lh5.ggpht.com/_qUfPJWk25s0/TA5e_HImqWI/AAAAAAAADVk/Vxtc50-JsM4/0_thumb%5B2%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="0" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;如果在安裝時把這個服務設定為手動啟動，更要注意這一點，若這個服務沒有啟動，則使用 FileZilla Server Interface 連線到本機 (127.0.0.1) 的時候可能會收到「can't connect to server」之類的錯誤訊息。&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟二：開啟 Windows 防火牆管理介面&lt;/span&gt;    &lt;br /&gt;(在 Windows 7 開始功能表的搜尋框中打「Firewall」就找得到防火牆)&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/TA5fAGx5MUI/AAAAAAAADVo/q9ANY0MTssU/s1600-h/0.2%5B3%5D.png"&gt;&lt;img alt="0.2" border="0" height="509" src="http://lh5.ggpht.com/_qUfPJWk25s0/TA5fBO0aXqI/AAAAAAAADVs/TLZdmpU_X2o/0.2_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="0.2" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟三：點選左上角的「Allow a program or feature through Windows firewall」的連結，進入例外程式設定畫面&lt;/span&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/TA5fB3UIqEI/AAAAAAAADVw/vpKKDVqW33o/s1600-h/1%5B4%5D.png"&gt;&lt;img alt="1" border="0" height="298" src="http://lh4.ggpht.com/_qUfPJWk25s0/TA5fCy4yYvI/AAAAAAAADV0/xcAbqQ70mMQ/1_thumb%5B2%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="1" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;設定前的畫面如下：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/TA5fD5cS9iI/AAAAAAAADV4/MEvIXKHWIMU/s1600-h/3%5B3%5D.png"&gt;&lt;img alt="3" border="0" height="297" src="http://lh4.ggpht.com/_qUfPJWk25s0/TA5fEsvHZhI/AAAAAAAADV8/ha5OjeOw6dk/3_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="3" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟四：將「FileZilla Server」和「FileZilla Server Interface」兩個程式加入到例外清單中&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;若選單中的項目被反灰，則先點選右上角的「Change settings」按鈕 (必須有 Administrator 權限)&lt;/li&gt;&lt;li&gt;點選下面的「Allow another program…」按鈕，選擇要允許的程式：&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: red;"&gt;FileZilla Server&lt;/span&gt;: C:\Program Files (x86)\FileZilla Server\FileZilla server.exe&lt;/li&gt;&lt;li&gt;&lt;span style="color: red;"&gt;FileZilla Server Interface&lt;/span&gt;: C:\Program Files (x86)\FileZilla Server\FileZilla Server Interface.exe&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;設定完成後的畫面如下：&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/TA5fGFIm81I/AAAAAAAADWA/bgrK1p9Zn9g/s1600-h/2%5B4%5D.png"&gt;&lt;img alt="2" border="0" height="298" src="http://lh6.ggpht.com/_qUfPJWk25s0/TA5fH1kAkrI/AAAAAAAADWE/EVKwf9x-LUc/2_thumb%5B2%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="2" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;接下來只要知道 FileZilla Server 所在電腦的 &lt;a href="http://whatismyip.com/"&gt;IP 位置&lt;/a&gt;，就可以在任何一台有連網的電腦上用指定的帳號密碼連進 FileZilla FTP Server 啦！&lt;br /&gt;另外補充：如果不想要記 &lt;a href="http://whatismyip.com/"&gt;What Is My IP Address&lt;/a&gt; 網站的網址，也可以執行 Windows command prompt (Windows鍵+R，執行「cmd」)，而後執行「ipconfig」指令：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TA5fIjseIlI/AAAAAAAADWI/kBP59PUW5kE/s1600-h/0.1%5B7%5D.png"&gt;&lt;img alt="0.1" border="0" height="211" src="http://lh4.ggpht.com/_qUfPJWk25s0/TA5fJTW4U7I/AAAAAAAADWM/V7IexHRsOCo/0.1_thumb%5B3%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="0.1" width="404" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-1538873714514640087?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/1538873714514640087/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=1538873714514640087&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1538873714514640087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1538873714514640087'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/06/windows-7-filezilla-server-ftp.html' title='在 Windows 7 用 FileZilla Server 架 FTP 站要注意的防火牆設定'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_qUfPJWk25s0/TA5e_HImqWI/AAAAAAAADVk/Vxtc50-JsM4/s72-c/0_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-7718053531169388935</id><published>2010-06-06T13:33:00.002+08:00</published><updated>2010-06-12T13:17:34.621+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='outlook'/><category scheme='http://www.blogger.com/atom/ns#' term='import/export'/><category scheme='http://www.blogger.com/atom/ns#' term='Yahoo mail contact'/><title type='text'>如何批次將 Yahoo 信箱中的行事曆匯入到 Outlook</title><content type='html'>上週剛好被問到這個問題，原本想說按照Yahoo網站上面的&lt;a href="http://tw.help.cc.yahoo.com/frame_sub_category.html?prodid=7&amp;amp;catyname=%A6%E6%A8%C6%BE%E4Beta%AA%A9&amp;amp;funclass=%B6%D7%A4J/%B6%D7%A5X&amp;amp;id=5136"&gt;匯入/匯出說明&lt;/a&gt;來操作，應該很容易，但是我怎麼也找不到「&lt;span style="color: red;"&gt;編輯行事曆...&lt;/span&gt;」按鈕在哪裡。之後又找到 Google 日曆的說明：&lt;a href="http://www.google.com/support/calendar/bin/answer.py?hl=b5&amp;amp;answer=83126#"&gt;從其他的應用程式移轉活動&lt;/a&gt;，看起來很簡單，但是在 Yahoo 信箱的中文介面中，點選右上角的「功能設定」以後，畫面如下：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/TAsys9APOsI/AAAAAAAADQM/9atXbbgrVhg/s1600-h/a%5B3%5D.png"&gt;&lt;img alt="a" border="0" height="337" src="http://lh5.ggpht.com/_qUfPJWk25s0/TAsytyAuSsI/AAAAAAAADQQ/5SJdefgz8Us/a_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="a" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: red; font-size: medium;"&gt;仔細一看就會發現：根本就沒有「匯入/匯出」功能阿！&lt;/span&gt;&lt;br /&gt;這時後有個同事發現了一個絕招：先把 Yahoo 帳戶的慣用語言改成&lt;span style="color: red;"&gt;英文&lt;/span&gt;，就可以使用匯入/匯出功能了！操作步驟如下：&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟一：修改 Yahoo &lt;/b&gt;&lt;b&gt;帳戶的慣用語言為英文&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;進入 &lt;a href="http://tw.yahoo.com/"&gt;Yahoo 網站首頁&lt;/a&gt;，點選左下角「我的」類別中的「會員中心」，並以 Yahoo 信箱的帳號密碼登入。&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/TAsyuttPV1I/AAAAAAAADQU/UM4iQUoNZz8/s1600-h/clip_image002%5B4%5D.jpg"&gt;&lt;img alt="clip_image002" border="0" height="619" src="http://lh4.ggpht.com/_qUfPJWk25s0/TAsyvlVqUVI/AAAAAAAADQY/KysJ9UnWB7c/clip_image002_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image002" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟二：設定此 Yahoo &lt;/b&gt;&lt;b&gt;帳戶的慣用語言為英文&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;在會員中心的「帳戶設定」中，點選「設定語言、網站、時區」&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/TAsywf047kI/AAAAAAAADQc/FDt5Tbq_L9s/s1600-h/clip_image004%5B4%5D.jpg"&gt;&lt;img alt="clip_image004" border="0" height="129" src="http://lh3.ggpht.com/_qUfPJWk25s0/TAsyxQzSr0I/AAAAAAAADQg/CbF3UAjqEOc/clip_image004_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image004" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟三：將慣用語言設定為「Yahoo! U.S. in English&lt;/b&gt;&lt;b&gt;」&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;在「地區網站和語言」下拉式選單中，通常預設為「Yahoo! 奇摩」，往上捲動即可找到「Yahoo! U.S. in English」。&lt;/li&gt;&lt;li&gt;選擇此設定後，畫面會馬上變成英文，之後再按右下角的「Save」按鈕即可。&lt;/li&gt;&lt;li&gt;確認儲存完畢後，點選左上角的登出按鈕，登出會員中心。&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TAsyx-KAWTI/AAAAAAAADQk/xLAa1pQH9T4/s1600-h/clip_image006%5B4%5D.jpg"&gt;&lt;img alt="clip_image006" border="0" height="242" src="http://lh6.ggpht.com/_qUfPJWk25s0/TAsyy7ujFII/AAAAAAAADQo/3YpQzb0Qmm8/clip_image006_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image006" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟四：進入 Yahoo &lt;/b&gt;&lt;b&gt;信箱的行事曆設定畫面&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;登入 &lt;a href="http://tw.rd.yahoo.com/referurl/hp/1024/pa/mail/l/0/*http:/mail.yahoo.com.tw/"&gt;Yahoo 信箱&lt;/a&gt;，此時介面應為英文。&lt;/li&gt;&lt;li&gt;點選左下角的「Applications」中的「Calendar」，進入行事曆畫面。&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TAsyzanKKuI/AAAAAAAADQs/by_I33mwSX4/s1600-h/clip_image008%5B4%5D.jpg"&gt;&lt;img alt="clip_image008" border="0" height="718" src="http://lh4.ggpht.com/_qUfPJWk25s0/TAsy0mNOCnI/AAAAAAAADQw/RF7qsZ2HQ2Y/clip_image008_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image008" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #0080ff;"&gt;步驟五：進入行事曆選項畫面&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;1. 點選右上角的「Options」連結。&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/TAsy1bOc0lI/AAAAAAAADQ0/Dq2vYaqBxTo/s1600-h/clip_image010%5B4%5D.jpg"&gt;&lt;img alt="clip_image010" border="0" height="296" src="http://lh4.ggpht.com/_qUfPJWk25s0/TAsy2VAXdOI/AAAAAAAADQ4/-7Be1eHvzXs/clip_image010_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image010" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟六：進入匯入/&lt;/b&gt;&lt;b&gt;匯出 (Import/Export) &lt;/b&gt;&lt;b&gt;畫面&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;1. 點選畫面中間，Management 類別中的「Import/Export」連結&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/TAsy3K86wCI/AAAAAAAADQ8/G--MGpWMHhU/s1600-h/clip_image012%5B4%5D.jpg"&gt;&lt;img alt="clip_image012" border="0" height="429" src="http://lh6.ggpht.com/_qUfPJWk25s0/TAsy4mdYh5I/AAAAAAAADRA/pU3c6rj8NyU/clip_image012_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image012" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟七：將 Yahoo &lt;/b&gt;&lt;b&gt;行事曆資料匯出為 Outlook &lt;/b&gt;&lt;b&gt;格式&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;點選「Export to Outlook」中的「Export」按鈕&lt;/li&gt;&lt;li&gt;此時會跳出檔案下載對話視窗，按「儲存」，並記住將檔案存到哪個地方     &lt;br /&gt;(預設檔名為「Yahoo.csv」)&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TAsy5v4JxXI/AAAAAAAADRE/lFcKeUNZ_rE/s1600-h/clip_image014%5B5%5D.jpg"&gt;&lt;img alt="clip_image014" border="0" height="694" src="http://lh6.ggpht.com/_qUfPJWk25s0/TAsy6cc5-hI/AAAAAAAADRI/DteDWmBAPg0/clip_image014_thumb%5B2%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image014" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟八：開啟Outlook&lt;/b&gt;&lt;b&gt;，選擇「檔案」--&amp;gt;&lt;/b&gt;&lt;b&gt;「匯入及匯出」&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/TAsy7i68K9I/AAAAAAAADRM/V0V1vH1pFC4/s1600-h/clip_image016%5B8%5D.jpg"&gt;&lt;img alt="clip_image016" border="0" height="395" src="http://lh3.ggpht.com/_qUfPJWk25s0/TAsy8gB9I-I/AAAAAAAADRQ/ez2Q16DTLbA/clip_image016_thumb%5B5%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image016" width="204" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #0080ff;"&gt;步驟九：在「匯入及匯出精靈」中，使用預設值：從其他程式或檔案匯入，之後按「下一步」&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/TAsy9k3mqlI/AAAAAAAADRU/dd9Oi_IM_Ws/s1600-h/clip_image018%5B5%5D.jpg"&gt;&lt;img alt="clip_image018" border="0" height="358" src="http://lh6.ggpht.com/_qUfPJWk25s0/TAsy-eeJKhI/AAAAAAAADRY/K180NknHdI0/clip_image018_thumb%5B2%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image018" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟十：在「匯入檔案」精靈中，向下捲動到最下面，選擇「逗點分隔值(Windows)&lt;/b&gt;&lt;b&gt;」後，按「下一步」&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/TAsy_UENWII/AAAAAAAADRc/IoGuvfGSt_Y/s1600-h/clip_image020%5B4%5D.jpg"&gt;&lt;img alt="clip_image020" border="0" height="358" src="http://lh5.ggpht.com/_qUfPJWk25s0/TAszAfmAILI/AAAAAAAADRg/C0pZIyFaH9c/clip_image020_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image020" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟十一：在「匯入檔案」精靈中，點選「瀏覽(R)...&lt;/b&gt;&lt;b&gt;」按鈕，選擇剛剛存好的Yahoo.csv &lt;/b&gt;&lt;b&gt;檔案，按「下一步」&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/TAszBTuFyZI/AAAAAAAADRk/Ms7kaSs3gl8/s1600-h/clip_image022%5B4%5D.jpg"&gt;&lt;img alt="clip_image022" border="0" height="358" src="http://lh5.ggpht.com/_qUfPJWk25s0/TAszCPZplWI/AAAAAAAADRo/Bddg1LBsU3M/clip_image022_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image022" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #0080ff;"&gt;步驟十二：在選取目的資料夾視窗中，選擇「行事曆」&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TAszCz38f2I/AAAAAAAADRs/vv_7isoqino/s1600-h/b%5B3%5D.png"&gt;&lt;img alt="b" border="0" height="358" src="http://lh3.ggpht.com/_qUfPJWk25s0/TAszDygU0dI/AAAAAAAADRw/jKKj_vGC1wQ/b_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="b" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: red;"&gt;注意：若沒有正確選擇「行事曆」資料夾，會因為資料格式不符而無法正確匯入行事曆資料！&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0080ff;"&gt;&lt;b&gt;步驟十三：需勾選「匯入”Yahoo.csv&lt;/b&gt;&lt;b&gt;”至資料夾：行事曆」左邊的方塊，而後點選右邊的「對應自訂欄位」按鈕，以設定欄位的對應&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TAszEd2SxTI/AAAAAAAADR0/LIBPdUbs6ew/s1600-h/clip_image026%5B4%5D.jpg"&gt;&lt;img alt="clip_image026" border="0" height="358" src="http://lh4.ggpht.com/_qUfPJWk25s0/TAszFlgCqlI/AAAAAAAADR4/KCfg-HMm6gU/clip_image026_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image026" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #0080ff;"&gt;步驟十四：以拖拉的方式，將左邊的英文名稱拖曳到右邊的中文名稱&lt;/span&gt;      &lt;br /&gt;(這個步驟最重要，&lt;span style="color: red;"&gt;沒有設定好欄位名稱對應的話，資料就無法正確匯入!&lt;/span&gt;)&lt;/b&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/TAszGctZdeI/AAAAAAAADR8/I-QerkkocrU/s1600-h/clip_image028%5B4%5D.jpg"&gt;&lt;img alt="clip_image028" border="0" height="364" src="http://lh6.ggpht.com/_qUfPJWk25s0/TAszHNKqOlI/AAAAAAAADSA/j9fMSpnM4eo/clip_image028_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image028" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;設定 Description 欄位的對應時，右邊的欄位清單要往下拉到「描述」欄位：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/TAszH42EdMI/AAAAAAAADSE/Tx5lKMQ5WzE/s1600-h/clip_image030%5B4%5D.jpg"&gt;&lt;img alt="clip_image030" border="0" height="364" src="http://lh6.ggpht.com/_qUfPJWk25s0/TAszIlwIZsI/AAAAAAAADSI/AGMr9MZItds/clip_image030_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image030" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #0080ff;"&gt;步驟十五：自訂欄位設定完畢後，點選「完成」按鈕，就會開始匯入行事曆資料。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/TAszJu7afOI/AAAAAAAADSM/9QLV9xXx9HY/s1600-h/clip_image032%5B4%5D.jpg"&gt;&lt;img alt="clip_image032" border="0" height="358" src="http://lh5.ggpht.com/_qUfPJWk25s0/TAszKUy8ImI/AAAAAAAADSQ/5QXB4HfxrtI/clip_image032_thumb%5B1%5D.jpg?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image032" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;如此就可以批次將 Yahoo 信箱中的行事曆資料匯入到 Outlook 啦！(也可以另外把匯出的 .csv 檔做備份)&lt;br /&gt;整個操作過程中最關鍵的步驟是：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;要把 Yahoo 帳戶的&lt;span style="color: red;"&gt;慣用語言改為英文&lt;/span&gt;，才有「Import/Export」功能可用&lt;/li&gt;&lt;li&gt;在 Outlook 的匯入檔案精靈中，要確實設定「&lt;span style="color: red;"&gt;自訂欄位對應&lt;/span&gt;」，才能正確匯入資料&lt;/li&gt;&lt;/ol&gt;希望這篇文章對有須要的朋友會有幫助 :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-7718053531169388935?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/7718053531169388935/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=7718053531169388935&amp;isPopup=true' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7718053531169388935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7718053531169388935'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/06/yahoo-outlook.html' title='如何批次將 Yahoo 信箱中的行事曆匯入到 Outlook'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_qUfPJWk25s0/TAsytyAuSsI/AAAAAAAADQQ/5SJdefgz8Us/s72-c/a_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-6465026003154827453</id><published>2010-06-04T00:15:00.001+08:00</published><updated>2010-06-04T00:15:32.737+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DataSource'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>[ASPNET] 客製化傳入 DataSource 控制項的參數</title><content type='html'>坎尼最近玩了一下許久未用的 DataSource 控制項   &lt;br /&gt;對於傳入的 Parameter 有些疑問 &lt;font color="#808080"&gt;(見下圖)&lt;/font&gt;   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAfU9-VvztI/AAAAAAAABR8/Kdb14MsZ750/s1600-h/op03%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="op03" border="0" alt="op03" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/TAfU_BpJcqI/AAAAAAAABSA/MGshgwK8u1g/op03_thumb%5B2%5D.png?imgmax=800" width="685" height="345" /&gt;&lt;/a&gt;如果是用精靈視窗，Control 會自動帶入預設的 Property   &lt;br /&gt;&lt;font color="#0000ff"&gt;若是想要用其他的屬性來當作參數值該怎麼辦呢?&lt;/font&gt;   &lt;hr /&gt;  &lt;h3&gt;I. 取得資料來源&lt;/h3&gt; 這邊坎尼用到了前幾天講的技巧，&lt;a href="http://dotnetmis91.blogspot.com/2010/06/adonet-sqldataadapter.html"&gt;建立了一個暫存表並回傳查詢值&lt;/a&gt;   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAfU_7rzsnI/AAAAAAAABSE/EQ9jtqgeTSA/s1600-h/op01%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="op01" border="0" alt="op01" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAfVBAP25jI/AAAAAAAABSI/q8JX_k_5Gy0/op01_thumb%5B2%5D.png?imgmax=800" width="616" height="265" /&gt;&lt;/a&gt;   &lt;br /&gt;另外還用了 SQL Server 2008 才有的 Mutli-Insert 語法：   &lt;br /&gt;&lt;font color="#ff0000"&gt;在 Values 後面，以&lt;font size="3"&gt; 「,」隔開 &lt;/font&gt;要建立的值&lt;/font&gt;   &lt;br /&gt;  &lt;br /&gt;最後再回傳符合條件的查詢結果   &lt;br /&gt;可以看到範例中是用 Like，所以要記得加 %   &lt;h3&gt;II. 實戰&lt;/h3&gt; 在畫面上放一個 DropDownList，當作查詢條件的傳入值   &lt;br /&gt;另外再放一個 GridView 來呈現資料   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TAfVB-r85II/AAAAAAAABSM/qRxBcheq4nE/s1600-h/op02%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="op02" border="0" alt="op02" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAfVCx6j0HI/AAAAAAAABSQ/P6ByToR7SbE/op02_thumb%5B2%5D.png?imgmax=800" width="509" height="277" /&gt;&lt;/a&gt;建立一個 ObjectDataSource   &lt;br /&gt;並用精靈選擇 DropDownList 當作參數值來源   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TAfVEoM2PDI/AAAAAAAABSU/0CI3ZicK738/s1600-h/op03%5B12%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="op03" border="0" alt="op03" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAfVFhFQcKI/AAAAAAAABSY/748gu4q0EyM/op03_thumb%5B6%5D.png?imgmax=800" width="685" height="345" /&gt;&lt;/a&gt;預設是用 .SelectedValue 屬性當作傳入值   &lt;br /&gt;但以上面 DropDownList 目前的設定來看，會查不到任何資料   &lt;br /&gt;  &lt;br /&gt;所以坎尼偷偷的切換到 Source 視窗   &lt;br /&gt;靜悄悄地&lt;font color="#ff0000" size="2"&gt;把 SelectedValue 改成 SelectedItem.Text&lt;/font&gt;   &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TAfVGlCShZI/AAAAAAAABSc/xqPf55nppZg/s1600-h/op04%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="op04" border="0" alt="op04" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TAfVHfjzPuI/AAAAAAAABSg/IIlzakeXEZo/op04_thumb%5B2%5D.png?imgmax=800" width="478" height="260" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;按下瀏覽來查看一下成果   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TAfVIKxFhsI/AAAAAAAABSk/SBKEMvJjdc0/s1600-h/op05%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="op05" border="0" alt="op05" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAfVI8MnZCI/AAAAAAAABSo/3Aqel_yBvmA/op05_thumb%5B2%5D.png?imgmax=800" width="372" height="172" /&gt;&lt;/a&gt;   &lt;br /&gt;狸貓換太子成功!!!&amp;#160; 收工!   &lt;br /&gt;  &lt;h3&gt;III. 小結 &lt;/h3&gt; 了解可以自定要傳入的屬性當參數後   &lt;br /&gt;DataSource 控制項在使用上也能更有彈性 :)    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-6465026003154827453?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/6465026003154827453/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=6465026003154827453&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6465026003154827453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6465026003154827453'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/06/aspnet-datasource.html' title='[ASPNET] 客製化傳入 DataSource 控制項的參數'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_bGOQZqQ9oEM/TAfU_BpJcqI/AAAAAAAABSA/MGshgwK8u1g/s72-c/op03_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-6868031027167000301</id><published>2010-06-01T23:15:00.001+08:00</published><updated>2010-06-01T23:15:44.347+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>[ADO.NET] 善用 SqlDataAdapter 執行大量指令並傳回查詢資料</title><content type='html'>今天來介紹一下好用的 DataAdapter   &lt;hr /&gt;  &lt;h3&gt;I. 前言&lt;/h3&gt; 很久很久以前，坎尼常遇到一個問題  &lt;br /&gt;&lt;font color="#004000"&gt;「新增完一筆資料之後，要回傳該資料的ID」&lt;/font&gt;  &lt;br /&gt;  &lt;br /&gt;如果 ID 是自己取 Max + 1 就還能控制  &lt;br /&gt;但要是遇到是用 sequence 方式建立的流水號  &lt;br /&gt;往往還要拆成兩段語法，建立完資料之後再取出  &lt;br /&gt;  &lt;br /&gt;其實大可不必那麼麻煩，可以將 SQL Statement 串接在一起  &lt;br /&gt;&lt;font color="#808080"&gt;(記得用&lt;font size="5"&gt; ;&lt;/font&gt; 隔開不同的指令)    &lt;br /&gt;&lt;/font&gt;再用 &lt;font color="#0000ff"&gt;SqlCommand&lt;/font&gt; 或 &lt;font color="#0000ff"&gt;SqlDataAdapter&lt;/font&gt; 執行即可  &lt;br /&gt;  &lt;h3&gt;II. 實戰&lt;/h3&gt; 下圖綠色框部分，用 Sql Server 提供的 &lt;a href="http://msdn.microsoft.com/zh-tw/library/ms177399.aspx"&gt;Temp Tables&lt;/a&gt; 語法  &lt;br /&gt;分別建立了兩個臨時資料表，並各加入兩筆資料  &lt;br /&gt;再用 SELECT 語法將兩個資料表 JOIN 的結果回傳  &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/TAUkBg-wrnI/AAAAAAAABRY/05lEJ9ASke4/s1600-h/ms01%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ms01" border="0" alt="ms01" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TAUkCkPYPTI/AAAAAAAABRc/X1r-3ZdS14U/ms01_thumb%5B1%5D.png?imgmax=800" width="530" height="333" /&gt;&lt;/a&gt;既然 &lt;font color="#0000ff"&gt;Create&lt;/font&gt; 和 &lt;font color="#0000ff"&gt;Insert&lt;/font&gt; 語法都在 &lt;font color="#0000ff"&gt;SelectCommand&lt;/font&gt; 裡  &lt;br /&gt;&lt;font color="#ff0000"&gt;參數&lt;/font&gt;當然也是要加進 SelectCommand 裡 &lt;font color="#808080"&gt;(見上圖藍色框)   &lt;br /&gt;&lt;/font&gt;&lt;strike&gt;記得不要放到 UpdateCommand 或 InsertCommand 去&lt;/strike&gt;  &lt;br /&gt;  &lt;br /&gt;實際執行情況：確實建立了 Table 並取得 JOIN 成功的資料  &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TAUkDhTZebI/AAAAAAAABRg/n63W-wWRXX8/s1600-h/ms03%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ms03" border="0" alt="ms03" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAUkEgL6tmI/AAAAAAAABRk/2GDmdaL5dTM/ms03_thumb%5B1%5D.png?imgmax=800" width="463" height="202" /&gt;&lt;/a&gt;  &lt;br /&gt;  &lt;br /&gt;另外坎尼又做了小小的測驗，驗證一下臨時資料表有沒有被砍掉  &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TAUkFfocGTI/AAAAAAAABRo/TU-0gkFugSk/s1600-h/ms02%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ms02" border="0" alt="ms02" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAUkGDsgtwI/AAAAAAAABRs/bho_4IH4_4Y/ms02_thumb%5B1%5D.png?imgmax=800" width="404" height="175" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;事實證明，在上一次 .Fill 結束之後，暫存資料表是會自動清掉  &lt;br /&gt;而 Temp Table 的定義是：&lt;font color="#0000ff"&gt;只存在該使用者連線時&lt;/font&gt;  &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TAUkG_kW2oI/AAAAAAAABRw/SCAbf6EY5Ac/s1600-h/ms04%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ms04" border="0" alt="ms04" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TAUkHnXPMiI/AAAAAAAABR0/wUdet8vt448/ms04_thumb%5B1%5D.png?imgmax=800" width="456" height="168" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;這表示 DataAdapter 在 .Fill 之後就會自動把連線關閉  &lt;br /&gt;下一次的 .Fill 其實是另外再重新開啟另一個連線  &lt;br /&gt;  &lt;h3&gt;III. 小結&lt;/h3&gt; 坎尼以前常看到有人用 DataAdapter   &lt;br /&gt;卻在執行前後加上 Connection.Open() 及 Connection.Close()  &lt;br /&gt;其實這些動作都是不必要的  &lt;br /&gt;  &lt;br /&gt;DataAdapter 在執行時，都會檢查目前和 DB 的連線  &lt;br /&gt;執行結束後即會自動關閉與 DB 的連線  &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/6505213162600961434-6868031027167000301?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/6868031027167000301/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=6868031027167000301&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6868031027167000301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6868031027167000301'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/06/adonet-sqldataadapter.html' title='[ADO.NET] 善用 SqlDataAdapter 執行大量指令並傳回查詢資料'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_bGOQZqQ9oEM/TAUkCkPYPTI/AAAAAAAABRc/X1r-3ZdS14U/s72-c/ms01_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-5176525601504876411</id><published>2010-05-31T12:05:00.004+08:00</published><updated>2010-05-31T12:33:44.167+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>[ASPNET] 在 Gridview 中繫結 bool 欄位</title><content type='html'>一般來說，在 Gridview 中要繫結 &lt;span style="color: blue;"&gt;bool&lt;/span&gt; 的欄位   &lt;br /&gt;可以用 Gridview &lt;strike&gt;原生&lt;/strike&gt;自身提供的 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.checkboxfield.aspx"&gt;CheckBoxField&lt;/a&gt; &lt;span style="color: grey;"&gt;(如下圖)&lt;/span&gt;   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TAM1eo5zxuI/AAAAAAAABQk/9_1fwwmlo9Q/s1600-h/bC00%5B6%5D.png"&gt;&lt;img alt="bC00" border="0" height="374" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAM1gIkKzDI/AAAAAAAABQo/JCaftzDfHYc/bC00_thumb%5B4%5D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="bC00" width="586" /&gt;&lt;/a&gt;但如果要讓 CheckBox 和使用者互動，多半會用 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.templatefield.aspx"&gt;TemplateField&lt;/a&gt; 來客製   &lt;br /&gt;本篇即是介紹如何將 bool 欄位繫結到 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.checkbox.aspx"&gt;CheckBox 控制項&lt;/a&gt;的 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.checkbox.checked.aspx"&gt;Checked 屬性&lt;/a&gt;&amp;nbsp; &lt;br /&gt;&lt;hr /&gt;&lt;h3&gt;I. 準備事項 &lt;/h3&gt;首先要確定&lt;span style="color: red; font-size: medium;"&gt;資料欄位的型別&lt;/span&gt;需為 &lt;span style="color: blue;"&gt;boolean&lt;/span&gt;   &lt;br /&gt;否則在繫結 &lt;span style="color: blue;"&gt;Checked 屬性&lt;/span&gt;時，會丟出格式不符的例外   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAM1g7E3KKI/AAAAAAAABQs/UWTj5cewuy0/s1600-h/bC01%5B3%5D.png"&gt;&lt;img alt="bC01" border="0" height="347" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/TAM1h7GHABI/AAAAAAAABQw/hnvsRTERBv4/bC01_thumb%5B1%5D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="bC01" width="587" /&gt;&lt;/a&gt;範例中是用自己建立的虛擬 Table 來模擬 DataBase 的資料   &lt;br /&gt;各位在實作時，可直接使用 DB 來練習   &lt;br /&gt;&lt;br /&gt;另外在圖中可以看到，坎尼用 0 和 1 來輸入 &lt;span style="color: blue;"&gt;boolean&lt;/span&gt; 資料   &lt;br /&gt;CSharp 裡的確可以接受這樣的語法 &lt;span style="color: grey;"&gt;(印象中 VB 也是?)&lt;/span&gt;   &lt;br /&gt;&lt;h3&gt;II. 實作 &lt;/h3&gt;&lt;a href="http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.checkboxfield.aspx"&gt;CheckBoxField&lt;/a&gt; 繫結 &lt;span style="color: blue;"&gt;boolean&lt;/span&gt; 欄位，只需給予 &lt;span style="color: red;"&gt;DataField&lt;/span&gt; 即可  &lt;br /&gt;&amp;nbsp; &lt;br /&gt;但以 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.templatefield.aspx"&gt;TemplateField&lt;/a&gt; 加入的 &lt;a href="http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.checkbox.aspx"&gt;CheckBox 控制項&lt;/a&gt;，則是要自行加入 Binding 語法：   &lt;br /&gt;&lt;span style="color: red;"&gt;Checked&lt;/span&gt;='&lt;span style="background-color: yellow;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue;"&gt;#&lt;/span&gt;Eval("boolean 欄位")&lt;span style="background-color: yellow;"&gt;%&amp;gt;&lt;/span&gt;'   &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/TAM1jaKsmrI/AAAAAAAABQ0/R1BXRJiUYME/s1600-h/bC02%5B8%5D.png"&gt;&lt;img alt="bC02" border="0" height="267" src="http://lh4.ggpht.com/_bGOQZqQ9oEM/TAM1lGIou-I/AAAAAAAABQ4/I0uqs2aVl6k/bC02_thumb%5B6%5D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="bC02" width="644" /&gt;&lt;/a&gt; 執行畫面   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/TAM1mAPLpWI/AAAAAAAABQ8/rJY-_3BqfBc/s1600-h/bC03%5B3%5D.png"&gt;&lt;img alt="bC03" border="0" height="373" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/TAM1nO3TCLI/AAAAAAAABRA/hVpsqBcLUVQ/bC03_thumb%5B1%5D.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="bC03" width="372" /&gt;&lt;/a&gt;&amp;nbsp; &lt;br /&gt;可以再加上全選的 CheckBox 在標題列，及儲存變更的按鈕   &lt;br /&gt;就完成可和使用者互動的 CheckBox 欄位   &lt;br /&gt;&lt;hr /&gt;&lt;h3&gt;III. 小結 &lt;/h3&gt;坎尼好久沒動筆，文句都有些生疏，請多見諒 ^^&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-5176525601504876411?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/5176525601504876411/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=5176525601504876411&amp;isPopup=true' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5176525601504876411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5176525601504876411'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/05/gridview-bool.html' title='[ASPNET] 在 Gridview 中繫結 bool 欄位'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_bGOQZqQ9oEM/TAM1gIkKzDI/AAAAAAAABQo/JCaftzDfHYc/s72-c/bC00_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-3620354479117178777</id><published>2010-05-24T17:40:00.004+08:00</published><updated>2010-06-12T13:18:07.057+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='word'/><category scheme='http://www.blogger.com/atom/ns#' term='notepad++'/><category scheme='http://www.blogger.com/atom/ns#' term='macro'/><title type='text'>如何善用 Word &amp; Notepad++ 巨集來完成需重複執行的檔案編寫動作</title><content type='html'>上個週末打開一個影片檔，發現字幕檔是中英文混合的，造成字幕吃掉畫面很大的空間，&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/_qUfPJWk25s0/S_xwwhlKa5I/AAAAAAAADKM/oMGGNWUTlro/s1600/1.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/_qUfPJWk25s0/S_xwwhlKa5I/AAAAAAAADKM/oMGGNWUTlro/s320/1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_pJFswaR9I/AAAAAAAADIM/a8x8r4IIbBg/s1600-h/1%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;因此我想要自己作成「只有中文」＆「只有英文」兩個字幕檔，但這個檔案有6418 行，如果要手動一行一行的刪除 (而且要作兩次，第一次先刪除全部的中文，第二次刪除全部的英文)，顯然會作到瘋掉，經過一些嘗試，我發現有以下幾個辦法可以讓現成的軟體幫我完成這個工作：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Word 2007 (其他版本應該也可以) 的巨集&lt;/li&gt;&lt;li&gt;Notepad ++ 的巨集&lt;/li&gt;&lt;/ul&gt;以下分別說明。&lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;如何使用 Word 2007 的巨集&lt;/span&gt;&lt;br /&gt;1.點選 Word 左上角的 Office Logo，進入「Word 選項」：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJHuM_I2I/AAAAAAAADIU/6rfWmIf42Io/s1600-h/3%5B5%5D.png"&gt;&lt;img alt="3" border="0" height="549" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJIQWEs8I/AAAAAAAADIY/ts-bvzsUPGY/3_thumb%5B3%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="3" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;2.在「常用」類別中，勾選「在功能區顯示 [開發人員] 索引標籤」&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S_pJJV7RGAI/AAAAAAAADIc/OMkSEcLwe1M/s1600-h/2%5B3%5D.png"&gt;&lt;img alt="2" border="0" height="466" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJKRUoTRI/AAAAAAAADIg/F0tU9mm75xM/2_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="2" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;3.打開影片的字幕檔 (.srt)，記得在「檔案類型」選擇「所有檔案 (*.*)」&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_pJLGrchFI/AAAAAAAADIk/_pjP1uZFLPE/s1600-h/4%5B3%5D.png"&gt;&lt;img alt="4" border="0" height="321" src="http://lh6.ggpht.com/_qUfPJWk25s0/S_pJMPuL1rI/AAAAAAAADIo/8xLbwla8TxU/4_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="4" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;4.打開檔案後，先把游標移到我要刪除的第一行，然後先把這行刪除掉&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_pJM2E9WkI/AAAAAAAADIs/EGpWPE-SKXI/s1600-h/6%5B3%5D.png"&gt;&lt;img alt="6" border="0" height="321" src="http://lh3.ggpht.com/_qUfPJWk25s0/S_pJNsy6VMI/AAAAAAAADIw/KkHDbHsj1OM/6_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="6" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;5.接下來，點選「開發人員」索引標籤，再點選「錄製巨集」&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S_pJOYftlEI/AAAAAAAADI0/rrvNlYdoU78/s1600-h/5%5B3%5D.png"&gt;&lt;img alt="5" border="0" height="312" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_pJPeqxkRI/AAAAAAAADI4/EH3rI5SVjwE/5_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="5" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;6.接下來就是巨集的內容，也就是&lt;span style="color: red;"&gt;你要重複不斷執行的一系列動作&lt;/span&gt;，我的動作是：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;把游標往下移 5 行&lt;/li&gt;&lt;li&gt;按住 shift + end 選取整行(此時會包含換行符號)&lt;/li&gt;&lt;li&gt;(shift 鍵不要放開)按「左方向鍵」，以取消選取換行符號&lt;/li&gt;&lt;li&gt;按 Delete 刪除該行&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_pJP_Gx9II/AAAAAAAADI8/DTY1KlO0F7Q/s1600-h/6%5B7%5D.png"&gt;&lt;img alt="6" border="0" height="321" src="http://lh6.ggpht.com/_qUfPJWk25s0/S_pJQUeO1jI/AAAAAAAADJA/3RZhoYB3kEY/6_thumb%5B3%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="6" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;7.做完以上動作後，點選「開發人員」索引標籤中的「停止錄製」按鈕，這樣巨集就大功告成啦！&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_pJRLqjRwI/AAAAAAAADJE/c8wpVdtP-ww/s1600-h/7%5B3%5D.png"&gt;&lt;img alt="7" border="0" height="221" src="http://lh6.ggpht.com/_qUfPJWk25s0/S_pJR744K2I/AAAAAAAADJI/oNF0OkC4S0A/7_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="7" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;8.點選「開發人員」索引標籤中的「Visual Basic」，此時會開啟 Microsoft Visual Basic IDE&lt;br /&gt;9.此時可看到剛剛錄製的巨集，接下來可用以下兩種方法來執行整份文件的取代&lt;br /&gt;&lt;ul&gt;&lt;li&gt;把巨集內容改寫為一個無窮迴圈：適用於整份文件的排版、格式都固定，確定重複執行不會出錯時&lt;/li&gt;&lt;li&gt;把 Word 主視窗和 Microsoft Visual Basic 視窗並列顯示，手動重複點選綠色三角形按鈕，以手動執行一次游標所在的 Sub：適用於不確定整份文件的排版、格式是否都一致，或者想要一一確認欲執行的修改時&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJS3o6T9I/AAAAAAAADJM/KTqiWARfj8M/s1600-h/9%5B3%5D.png"&gt;&lt;img alt="9" border="0" height="316" src="http://lh6.ggpht.com/_qUfPJWk25s0/S_pJTco6xAI/AAAAAAAADJQ/FFnM60jaX0s/9_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="9" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;上述的步驟 6 中所執行的&lt;span style="color: red;"&gt;一系列動作&lt;/span&gt;，若是利用 Word 內建的「按 F4 重新執行剛剛執行的動作」是沒有用的 (只會重複幫你執行「按 Delete」這個動作)，必須要以錄製巨集的方式，告訴 word 你要重複執行的動作究竟是哪些。(也可以把欲重複執行的動作設定為「先刪除游標所在的該行，再把游標往下移 5 行」)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;如何使用 Notepad ++ 的巨集&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;利用 Word 麻煩的地方在於：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Word 是要版權的 (而且 Word 比較吃資源，啟動時間也比較慢)&lt;/li&gt;&lt;li&gt;在 Word 裡面按「shift + end」會選取到換行符號，不小心會多刪除掉一行，不利於&lt;span style="color: red;"&gt;一系列的動作&lt;/span&gt;重複執行&lt;/li&gt;&lt;/ul&gt;有個更好的替代方案是使用有名的開源碼編輯器：&lt;a href="http://notepad-plus.sourceforge.net/tw/site.htm"&gt;Notepad++&lt;/a&gt; (還有 &lt;a href="http://portableapps.com/apps/development/notepadpp_portable"&gt;Notepad ++ Portable&lt;/a&gt; 可以選擇)。Notepad++ 一樣有句集 (macro) 功能，接下來就看看如何使用吧！&lt;br /&gt;1.打開字幕檔 (.srt)&lt;br /&gt;2.打開檔案後，先把游標移到我要刪除的第一行，然後先把這行刪除掉&lt;br /&gt;3.從「Macro」選單執行「Start Recording」功能，接下來的動作跟在 Word 中錄製巨集一模一樣，差別在於，以「shift+end」選取整行後，&lt;span style="color: red;"&gt;不會選取到換行符號&lt;/span&gt;！所以就不用作「(shift 鍵不要放開)按「左方向鍵」，以取消選取換行符號」這麼麻煩的事情了。&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/_qUfPJWk25s0/S_xycuoJ1bI/AAAAAAAADK0/Y4XTMb4v-Xk/s1600/10%5B3%5D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://2.bp.blogspot.com/_qUfPJWk25s0/S_xycuoJ1bI/AAAAAAAADK0/Y4XTMb4v-Xk/s400/10%5B3%5D.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJUKwh2DI/AAAAAAAADJU/pTDkXCkQkso/s1600-h/10%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJUKwh2DI/AAAAAAAADJU/pTDkXCkQkso/s1600-h/10%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJUKwh2DI/AAAAAAAADJU/pTDkXCkQkso/s1600-h/10%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJUKwh2DI/AAAAAAAADJU/pTDkXCkQkso/s1600-h/10%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJUKwh2DI/AAAAAAAADJU/pTDkXCkQkso/s1600-h/10%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJUKwh2DI/AAAAAAAADJU/pTDkXCkQkso/s1600-h/10%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJUKwh2DI/AAAAAAAADJU/pTDkXCkQkso/s1600-h/10%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJUKwh2DI/AAAAAAAADJU/pTDkXCkQkso/s1600-h/10%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJUKwh2DI/AAAAAAAADJU/pTDkXCkQkso/s1600-h/10%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;或者按紅色的錄音按鈕開始錄製巨集：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_pJVb4iNOI/AAAAAAAADJc/rCbQoGrzxZ0/s1600-h/11%5B3%5D.png"&gt;&lt;img alt="11" border="0" height="79" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_pJV9t_pjI/AAAAAAAADJg/XpRmL4q3P-s/11_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="11" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;4.錄製完畢後，點選「Macro」選單的「Stop Recording」功能，以停止錄製巨集：&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/S_xyLFnznII/AAAAAAAADKs/rKNcj-Ewv5E/s1600/12%5B3%5D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="117" src="http://2.bp.blogspot.com/_qUfPJWk25s0/S_xyLFnznII/AAAAAAAADKs/rKNcj-Ewv5E/s400/12%5B3%5D.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJWq9vteI/AAAAAAAADJk/fkGWzG6LXw4/s1600-h/12%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJWq9vteI/AAAAAAAADJk/fkGWzG6LXw4/s1600-h/12%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJWq9vteI/AAAAAAAADJk/fkGWzG6LXw4/s1600-h/12%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJWq9vteI/AAAAAAAADJk/fkGWzG6LXw4/s1600-h/12%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJWq9vteI/AAAAAAAADJk/fkGWzG6LXw4/s1600-h/12%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJWq9vteI/AAAAAAAADJk/fkGWzG6LXw4/s1600-h/12%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;或者按黑色的按鈕以停止錄製巨集：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJYdF8--I/AAAAAAAADJs/SCQz5WHNxVk/s1600-h/13%5B3%5D.png"&gt;&lt;img alt="13" border="0" height="75" src="http://lh3.ggpht.com/_qUfPJWk25s0/S_pJY_bpjcI/AAAAAAAADJw/6Ir9jfegIa0/13_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="13" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;5.從「Macro」選單中可以看到，「Playback」(也就是播放巨集)的快捷鍵是「Ctrl+Shift+P」，因此接下來只要按住「Ctrl+Shift+P」不放，Notepad++ 就會自動把整份文件給處理完了。(要注意，若有安裝 PicPick，此快捷鍵會起動 PicPick 的白板功能，只要先把常駐的 PicPick 關閉即可)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/S_xx5uUF_PI/AAAAAAAADKk/8XXdjKO1xXQ/s1600/15%5B3%5D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://2.bp.blogspot.com/_qUfPJWk25s0/S_xx5uUF_PI/AAAAAAAADKk/8XXdjKO1xXQ/s400/15%5B3%5D.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJZcjodEI/AAAAAAAADJ0/MY8AYwLk7xg/s1600-h/15%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJZcjodEI/AAAAAAAADJ0/MY8AYwLk7xg/s1600-h/15%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJZcjodEI/AAAAAAAADJ0/MY8AYwLk7xg/s1600-h/15%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJZcjodEI/AAAAAAAADJ0/MY8AYwLk7xg/s1600-h/15%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJZcjodEI/AAAAAAAADJ0/MY8AYwLk7xg/s1600-h/15%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_pJZcjodEI/AAAAAAAADJ0/MY8AYwLk7xg/s1600-h/15%5B3%5D.png"&gt;&lt;br /&gt;&lt;/a&gt; &lt;br /&gt;或者按藍色三角型按鈕來播放剛剛錄製好的巨集：&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_qUfPJWk25s0/S_xxjxfBEqI/AAAAAAAADKc/XJYTGEex6Pw/s1600/16%5B3%5D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="72" src="http://3.bp.blogspot.com/_qUfPJWk25s0/S_xxjxfBEqI/AAAAAAAADKc/XJYTGEex6Pw/s400/16%5B3%5D.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果這個巨集日後會常常需要使用的話，也可以利用「Macro」選單中的「Save Current Recorded Macro…」功能來儲存剛剛錄製好的巨集。&lt;br /&gt;&lt;br /&gt;雖然 Word 提供的強大的 VBA 編寫環境，但是對於這類簡單的應用來說，我覺得 Notepad++ 更為輕巧好用，內建的巨集功能相當好用，也不用擔心版權的問題。&lt;br /&gt;&lt;br /&gt;(另外發現一個小技巧，用 PicPick 擷取矩形區域時，且要完整保留左上角的 logo / 文字，最好從右下角開始往左上角圈選，會比較順。)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;成果：&lt;/span&gt;&lt;br /&gt;利用 Notepad++ 的 Compare 功能可以看出，處理前的字幕檔(左)同時有中英文字幕，處理後的字幕檔(右)只剩下英文字幕，要製作全中文的字幕也是如法炮製。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_qUfPJWk25s0/S_xxSoLNJ5I/AAAAAAAADKU/CEjBQZhiWS0/s1600/14%5B3%5D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="http://2.bp.blogspot.com/_qUfPJWk25s0/S_xxSoLNJ5I/AAAAAAAADKU/CEjBQZhiWS0/s640/14%5B3%5D.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;後記：&lt;/span&gt;&lt;br /&gt;最近也在幾個介紹好用軟體的有名部落格上看到一些可錄製鍵盤、滑鼠的操作，而後重複播放的軟體，例如：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;電腦玩物: &lt;a href="http://playpcesor.blogspot.com/2010/04/do-it-again.html"&gt;Do It Again&lt;/a&gt;&lt;/li&gt;&lt;li&gt;重灌狂人: &lt;a href="http://feedproxy.google.com/%7Er/briian/%7E3/UYXjm-oaOVo/"&gt;Mimer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;但是經過測試，這兩套軟體無法正確紀錄「shift + end 選取整行」的動作，只能紀錄到「按 Delete 鍵」這個動作，因此當重複播放錄製完畢的一系列動作時，會發現程式只能自動重複幫我執行「按 Delete 鍵」這個動作而已，不知道是否是我錄製的方法不對，如果各位網友有試出正確的作法，歡迎一起討論 :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-3620354479117178777?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/3620354479117178777/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=3620354479117178777&amp;isPopup=true' title='6 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3620354479117178777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/3620354479117178777'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/05/word-notepad.html' title='如何善用 Word &amp;amp; Notepad++ 巨集來完成需重複執行的檔案編寫動作'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qUfPJWk25s0/S_xwwhlKa5I/AAAAAAAADKM/oMGGNWUTlro/s72-c/1.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1323149310555975251</id><published>2010-05-21T16:19:00.003+08:00</published><updated>2010-06-15T11:45:06.961+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>為何虛擬化技術是雲端運算的計量(&amp;計費)基礎</title><content type='html'>五月初上了一堂跟雲端運算有關的課，重點是虛擬化技術在雲端運算中扮演的重要角色。這次的講師是&lt;span style="color: #0080ff;"&gt;胡嘉璽老師&lt;/span&gt;(參考資料-&lt;a href="http://findbook.tw/search?keyword_type=author&amp;amp;q=%E8%83%A1%E5%98%89%E7%92%BD"&gt;1&lt;/a&gt;、&lt;a href="http://www.china-pub.com/main/sale/renwu/luminary.asp?id=6323"&gt;2&lt;/a&gt;)，不像一般常見的討論著重在如何將 &lt;a href="http://en.wikipedia.org/wiki/Cloud_computing"&gt;Cloud Computing&lt;/a&gt;、&lt;a href="http://en.wikipedia.org/wiki/Utility_computing"&gt;Utility Computing&lt;/a&gt;、&lt;a href="http://en.wikipedia.org/wiki/Grid_computing"&gt;Grid Computing&lt;/a&gt; 區分開來(例如 Wikipedia 上的 &lt;a href="http://en.wikipedia.org/wiki/Cloud_computing#Comparisons"&gt;Comparisons&lt;/a&gt;，或者研究所考試的題目)，胡老師將 Cloud Computing 視為電腦運算發展最終的目標，而 Grid Computing 和 Utility Computing 則是技術演化過程中出現的重大里程碑，兩者都可視為是 Cloud Computing 的基礎。這些重要技術的演進可以下圖來看：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_ZCEzaSX3I/AAAAAAAADHY/ZnV3ZKkGuqU/s1600-h/13.jpg"&gt;&lt;img alt="1" border="0" height="187" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_ZCFrio6nI/AAAAAAAADHc/ADQmr6RDnhs/1_thumb1.jpg?imgmax=800" style="border-width: 0px; display: inline;" title="1" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;其中 Utility Computing 作為 Cloud Computing 中的計量 (以及計費)基礎，就跟水電瓦斯一樣，用了多少運算能力就付多少錢 (&lt;a href="http://en.wikipedia.org/wiki/Pay_as_you_go"&gt;pay-as-you-go&lt;/a&gt;)。而 Grid Computing 則是作為 Cloud Computing 中的計算基礎，用以組織數量龐大的電腦來執行平行運算，以提昇運算效能 ＆ 容錯能力。&lt;br /&gt;接下來再這次聽到的「如何用一句話定義雲端運算」：&lt;br /&gt;&lt;span style="color: #804040;"&gt;雲端運算就是將已量化的許多運算資源，以網路為媒介，透過特定的介面提供給需要服務的使用者。&lt;/span&gt;&lt;br /&gt;其中幾個重點包括：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;已量化：方便計算使用量 –&amp;gt; 方便計費 –&amp;gt; &lt;span style="color: red;"&gt;Utility Computing &lt;/span&gt;&lt;span style="color: #050505;"&gt;的觀念&lt;/span&gt; &lt;/li&gt;&lt;li&gt;許多：認定硬體的不穩定性(終究會壞)，因此要以 redundant 的方式提供運算資源 –&amp;gt; &lt;span style="color: red;"&gt;Grid Computing &lt;span style="color: #050505;"&gt;的觀念&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;運算資源：包括 CPU、RAM、Storage、Bandwidth 等 &lt;/li&gt;&lt;/ul&gt;從另一個角度來看，雲端運算所做的事情就是：&lt;br /&gt;&lt;span style="color: #804040;"&gt;將運算資源打散，找出最小的計量單位，之後將其全部集中起來，並重新分配的過程。&lt;/span&gt;&lt;br /&gt;廠商提供服務就是為了賺錢，要賺錢就得知道要收多少錢。為了要計費，就必需要先計算使用量，因此必須先「量化」。要計算使用量，就必需要定義出「最小計量單位」，就和水電瓦斯會定義甚麼叫做「一度」，一定要先定義出消耗多少電能稱為一度，才能定義一度電要收多少錢(and for 廠商的成本估算)，最後紀錄每個月每戶的使用量(用電度數)，就能以此為依據跟用戶收錢了。&lt;br /&gt;因此在衡量電腦運算資源時，要如何定義出一個最小的計量單位，就是一個重要的課題。「最小計量單位」跟&lt;a href="http://dotnetmis91.blogspot.com/2010/04/hdfs-hadoop-mapreduce.html"&gt;上一篇文章&lt;/a&gt;中提到的強大擴充性有關：&lt;br /&gt;&lt;span style="color: green;"&gt;我覺得使用者能夠 on-demand 的、基本上無上限的(只要付的出錢來)、在短時間內(數十秒到幾分鐘)擴充所需的&lt;span style="color: red;"&gt;運算資源&lt;/span&gt;，是雲端運算最重要的特性，因為這是以往的架構所做不到的。&lt;/span&gt;&lt;br /&gt;在上述這些運算資源中(CPU/RAM/Storage/Bandwidth)，通常會將 Storage 隔離出來(以 NAS 實作)，因為 Disk Space 的劃分是很容易的，可以動態根據使用者的需求來切割。而剩下的 CPU/RAM/Bandwidth 則可以用一個完整的&lt;span style="color: red;"&gt;作業系統&lt;/span&gt;來包裝，包裝起來之後成為一個「最小計量單位」，當需要擴充系統的運算能力時，便可以一個作業系統為單位，看要增加幾個作業系統來提供服務，而後依照用戶使用的作業系統數量 ＆ 時間來收費。&lt;br /&gt;基本概念是如此，但是如果作業系統必須被安裝在實體機器上，那麼要擴充運算能力時就必須新增實體機器，這往往要耗費大量的時間和人力，對於應付短時間內暴增的運算需求是緩不濟急的(e.g., 美國的 &lt;a href="http://en.wikipedia.org/wiki/Black_Friday_%28shopping%29"&gt;Black Friday&lt;/a&gt;)，例如&lt;a href="http://open.blogs.nytimes.com/2007/11/01/self-service-prorated-super-computing-fun/"&gt;紐約時報的 PDF 轉檔案例&lt;/a&gt; (&lt;a href="http://ria.richtechmedia.com/2009/01/19/what-is-a-cloud-%E9%9B%B2%E5%9C%A8%E4%BD%95%E6%96%B9%EF%BC%9F/"&gt;中文資料&lt;/a&gt;)，在 24 小時內開啟 100 個 EC2 VM 的 instance 將 &lt;span style="color: red;"&gt;4TB&lt;/span&gt; 的原始資料轉換為 &lt;span style="color: red;"&gt;1.5TB&lt;/span&gt; 的 PDF 檔，為求結果正確，整個運算還執行了&lt;span style="color: red;"&gt;兩次&lt;/span&gt;！如果要買進 100 台實體機器來執行這個運算任務，光是把這 100 台實體機器組裝、上架 &amp;amp; config 好，可能就要耗去一週了 (就算是湊出 100 台舊機器也是很浩大的工程)。更重要的是，這種一次性的運算執行完畢以後，最頭痛的就是後續這些機器要怎麼運用，而紐約時報只要關閉那 100 個 VM 的 instance，就不用再持續付出任何成本了。&lt;br /&gt;為了解決實體機器造成的龐大成本問題(金錢 ＆ 時間)，虛擬化技術扮演非常重要的角色，除了把 CPU/RAM/Bandwidth 包裝成作業系統以外，進一步包裝成虛擬機器 (VM) 後，配合最近幾年幾個虛擬化技術的成熟，終於讓「在極短時間內大幅擴充運算能力」的願景得以實現。&lt;br /&gt;虛擬化技術發展已經很久了，最早從 &lt;a href="http://en.wikipedia.org/wiki/Platform_virtualization#Concept"&gt;1960 年代&lt;/a&gt;開始，最近幾年的重要技術包括：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;VM templates and clone：可將 VM 製作成範本，而後以此範本為基礎大量產生新的 VM (現在從 Amazon EC2 開啟一個 VM 就是這樣的效果)(&lt;a href="http://seskywalker0981.pixnet.net/blog/post/21850752"&gt;參考&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;VMware vMotion/Hyper-V Live Migration：在 VM 不停機的狀況下，將 VM 從一台實體 server 移轉到另一台實體 server 上執行，在此期間該 VM 所提供的服務不中斷 (&lt;a href="http://www.youtube.com/watch?v=hion8_4xWL4"&gt;MS Hyper-V demo&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;透過這些技術讓使用者得以在短時間內新增 VM instances 以提供服務，並且更容易針對硬體規格 ＆ 使用量去訂價，例如 &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_ZCGpd53uI/AAAAAAAADHg/shMc5zaBGzE/s1600-h/4%5B3%5D.png"&gt;&lt;img alt="4" border="0" height="396" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_ZCHcRwdmI/AAAAAAAADHk/b4IeEqLNe-4/4_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="4" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;至於每種 Instance 的規格是甚麼，就要看 &lt;a href="http://aws.amazon.com/ec2/instance-types/"&gt;EC2 Instance Types&lt;/a&gt; 的說明：&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S_ZCIMQectI/AAAAAAAADHo/145cL5aLPvU/s1600-h/5%5B3%5D.png"&gt;&lt;img alt="5" border="0" height="560" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_ZCIwsrzPI/AAAAAAAADHs/L1LXcmuCicU/5_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="5" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;使用者(除了 IaaS 廠商之外)只要選擇合適的硬體規格，再跟據需求啟用適當數量的 VM Instance 之後，就可以開始執行運算任務了，整個過程在數分鐘內就可以完成，如此就不用自己建置、維運數量龐大的實體機器了！對於 IaaS 廠商來說，透過 VM 可以有效提高實體機器的利用率，提昇服務的可靠性，以服務更多的使用者，才可以賺更多的錢。&lt;br /&gt;以上補充虛擬化技術在雲端運算中扮演的角色，如有錯誤歡迎指教 :D&lt;br /&gt;相關文章：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/04/vs-hadoop-mapreduce.html"&gt;以運算就資料(在地運算) vs. 以資料就運算 (雲端運算核心技術 Hadoop &amp;amp; MapReduce概念班上課心得)&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/04/hdfs-hadoop-mapreduce.html"&gt;何謂雲端運算 ＆ HDFS 補充 (雲端運算核心技術 Hadoop &amp;amp; MapReduce 概念班上課心得)&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-1323149310555975251?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/1323149310555975251/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=1323149310555975251&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1323149310555975251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1323149310555975251'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/05/blog-post.html' title='為何虛擬化技術是雲端運算的計量(&amp;amp;計費)基礎'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_qUfPJWk25s0/S_ZCFrio6nI/AAAAAAAADHc/ADQmr6RDnhs/s72-c/1_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-2378342472094561602</id><published>2010-05-19T16:20:00.003+08:00</published><updated>2010-06-12T13:19:26.084+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='joomla'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='asset management'/><title type='text'>利用 Joomla 做資產管理 (Asset Management) -4 : Fabrik 套件使用小技巧 ＆ Joomla 客製化</title><content type='html'>在前面的文章中已經介紹完 Joomla &amp;amp; Fabrik 套件的安裝以及使用方式，接下來整理的是我使用 Fabrik 套件過程中發現的小技巧，以及如何客製化 Joomla。&lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;[無痛解法] Fabrik drop down 欄位的搜尋問題&lt;/span&gt;&lt;br /&gt;開始使用 Fabrik 套件的時候發現一個問題，若把 Form 中的 Element 設定為 &lt;span style="color: red;"&gt;drop down&lt;/span&gt;，在輸入資料時固然方便，但是要過濾資料時會遇到一個問題：沒有「All」這個過濾條件！以下圖為例，當我想要利用「IP」來找某台主機的資料，此時「服務類別使用狀態」條件的第一個值會生效，也就是說兩個條件都必須符合 (邏輯 AND) 才能正確找到所要的資料。這是很不方便的，因為我也沒辦法記住每台主機的「服務類別使用狀態」是什麼，若「服務類別使用狀態」的值沒有設定對，就算 IP 打對還是找不到資料。若把 Element 設定為 field，過濾條件中的預設值就是「All」，也就是沒有作用，就不會遇到這個問題了！&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S_Oe3bK7LzI/AAAAAAAADDA/lQRlylqtnIQ/s1600-h/1%5B3%5D.png"&gt;&lt;img alt="1" border="0" height="231" src="http://lh6.ggpht.com/_qUfPJWk25s0/S_Oe3xeXZaI/AAAAAAAADDE/p_Cw8wZGvBM/1_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="1" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;經過測試，發現一個最簡單的解法，也就是在新增資料時將 Element type 設定為「drop down」，以減少資料輸入錯誤的可能；等到資料輸入完畢後，再把 Element type 改回「field」，如此在過濾條件中該欄位的下拉式選單就會出現「All」的選項。這樣做的話，就不用擔心將 drop down 改為 field 之後，drop down 的選項會消失，所有的設定資料(drop down 的 text &amp;amp; value) 都會保留在 DB 裡面，未來要再輸入資料時，只要將 Element type 改回 drop down 即可繼續使用。&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_Oe4_-Hr-I/AAAAAAAADDI/dR8UdbMCW3k/s1600-h/2%5B3%5D.png"&gt;&lt;img alt="2" border="0" height="502" src="http://lh6.ggpht.com/_qUfPJWk25s0/S_Oe59AXmxI/AAAAAAAADDM/ulqJ6lORQe4/2_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="2" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;如何批次匯入資料至 Fabrik Table&lt;/span&gt;&lt;br /&gt;經過實驗以後，整理出以下幾種批次匯入資料的方法的優劣比較：&lt;br /&gt;&lt;table border="0" cellpadding="2" cellspacing="2" style="width: 536px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="107"&gt;&lt;/td&gt;        &lt;td valign="top" width="206"&gt;利用 Joomla / Fabrik 來匯入&lt;/td&gt;        &lt;td valign="top" width="213"&gt;在 phpMyAdmin 介面匯入&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="107"&gt;操作介面&lt;/td&gt;        &lt;td valign="top" width="206"&gt;Joomla 網站&lt;/td&gt;        &lt;td valign="top" width="213"&gt;phpMyAdmin 網站&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="107"&gt;支援檔案格式&lt;/td&gt;        &lt;td valign="top" width="206"&gt;CSV (需要保留欄位名稱列)&lt;/td&gt;        &lt;td valign="top" width="213"&gt;CSV (&lt;span style="color: red;"&gt;不可&lt;/span&gt;保留欄位名稱列)&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="107"&gt;支援編碼&lt;/td&gt;        &lt;td valign="top" width="206"&gt;UTF-8&lt;/td&gt;        &lt;td valign="top" width="213"&gt;UTF-8&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="107"&gt;中文亂碼問題&lt;/td&gt;        &lt;td valign="top" width="206"&gt;難處理 (匯入後要手動調整,           &lt;br /&gt;e.g., 101—&amp;gt;分機101)&lt;/td&gt;        &lt;td valign="top" width="213"&gt;沒問題&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="107"&gt;其他&lt;/td&gt;        &lt;td valign="top" width="206"&gt;fabrik_internal_id 和 time_date 欄位可空白&lt;/td&gt;        &lt;td valign="top" width="213"&gt;fabrik_internal_id 可空白time_date 欄位要有資料(改為 TIMESTAMP 也不會自動填入匯入時的時間)&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="107"&gt;&lt;/td&gt;        &lt;td valign="top" width="206"&gt;&lt;br /&gt;&lt;/td&gt;        &lt;td valign="top" width="213"&gt;需將半型逗號「,」取代為全型逗號「，」，以避免匯入資料時欄位分割錯誤&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;最後還是決定用 phpMyAdmin 的介面來執行批次匯入/匯出。   &lt;br /&gt;(匯出資料的注意事項可參考：&lt;a href="http://dotnetmis91.blogspot.com/2010/05/phpmyadmin-utf-8-csv.html"&gt;phpMyAdmin 匯出中文資料成 utf-8 編碼的 .csv 格式之注意事項&lt;/a&gt;)&lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;從 phpMyAdmin 管理後台批次匯入資料：&lt;/span&gt;&lt;br /&gt;步驟一：先準備好要匯入的原始資料：&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S_Oe6drEuaI/AAAAAAAADDQ/e8JioNoJJ34/s1600-h/3%5B3%5D.png"&gt;&lt;img alt="3" border="0" height="127" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_Oe7Reo_iI/AAAAAAAADDU/oG25hljgnh0/3_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="3" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;步驟二：調整原始資料，要注意：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;不可保留頂端列的欄位名稱&lt;/li&gt;&lt;li&gt;欄位順序要與 MySQL 中的 Table 欄位順序一致&lt;/li&gt;&lt;li&gt;不用新增 fabrik_internal_id 欄位，但要自己給 time_date 欄位的資料&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_Oe8bhmnUI/AAAAAAAADDY/DI9WD6Dy5EU/s1600-h/4%5B3%5D.png"&gt;&lt;img alt="4" border="0" height="154" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_Oe9eRHQwI/AAAAAAAADDc/-9-oAKN9CHI/4_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="4" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;Excel 預設編碼方式為 ANSI，檔案只要用 Excel 編輯過，編碼就會被改成 ANSI，要再以記事本開啟另存為 UTF-8 編碼   &lt;br /&gt;(以 Notepad++ 編輯則不會更改原本的檔案編碼)&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_Oe-PvLonI/AAAAAAAADDg/Kn4b26xNC6g/s1600-h/5%5B3%5D.png"&gt;&lt;img alt="5" border="0" height="375" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_Oe-5ttzKI/AAAAAAAADDk/Z3cyz-PVKSw/5_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="5" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;phpMyAdmin 介面的設定參考下圖：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_Oe_f-eEQI/AAAAAAAADDo/Oqzq4rbOPOQ/s1600-h/image23.png"&gt;&lt;img alt="image" border="0" height="252" src="http://lh3.ggpht.com/_qUfPJWk25s0/S_Oe_wkwROI/AAAAAAAADDs/y8oYDE8D1X8/image_thumb11.png?imgmax=800" style="border-width: 0px; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;利用 CSV 批次匯入資料：&lt;/span&gt;&lt;br /&gt;步驟一：一樣先準備好要匯入的原始資料：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_OfAhSsKrI/AAAAAAAADDw/dkHGaAYpLZA/s1600-h/3%5B7%5D.png"&gt;&lt;img alt="3" border="0" height="127" src="http://lh3.ggpht.com/_qUfPJWk25s0/S_OfBYpyctI/AAAAAAAADD0/7M9zjZ1TyQA/3_thumb%5B3%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="3" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;步驟二：調整原始資料，要注意：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;新增 fabrik_internal_id 和 time_date 這兩個欄位 (內容可空白)&lt;/li&gt;&lt;li&gt;要把原始資料的中文欄位翻譯成英文，欄位順序要與 MySQL 中 的 Table 欄位一致&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S_OfB3_iIwI/AAAAAAAADD4/ZerHq6Fej_Q/s1600-h/6%5B3%5D.png"&gt;&lt;img alt="6" border="0" height="156" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_OfCZZ8iXI/AAAAAAAADD8/09r2x6vTGys/6_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="6" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;Excel 預設編碼方式為 ANSI，檔案只要用 Excel 編輯過，編碼就會被改成 ANSI，要再以記事本開啟另存為 UTF-8 編碼   &lt;br /&gt;(以 Notepad++ 編輯則不會更改原本的檔案編碼) &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_Oe-PvLonI/AAAAAAAADDg/Kn4b26xNC6g/s1600-h/5%5B3%5D.png"&gt;&lt;img alt="5" border="0" height="375" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_Oe-5ttzKI/AAAAAAAADDk/Z3cyz-PVKSw/5_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="5" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;步驟三：從 Fabrik Table 的介面中，點選「Import from CSV」功能&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S_OfC4ZiemI/AAAAAAAADEA/PAgthZp2pcc/s1600-h/image43.png"&gt;&lt;img alt="image" border="0" height="160" src="http://lh6.ggpht.com/_qUfPJWk25s0/S_OfEfT5u3I/AAAAAAAADEE/rArHQuW7R_8/image_thumb21.png?imgmax=800" style="border-width: 0px; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;設定參考下圖：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_OfE_RPz4I/AAAAAAAADEI/BP-zQcvjYjM/s1600-h/image47.png"&gt;&lt;img alt="image" border="0" height="210" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_OfFcVjh2I/AAAAAAAADEM/HUhZRE94t8k/image_thumb23.png?imgmax=800" style="border-width: 0px; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;Fabrik 擴充套件的程式架構&lt;/span&gt;&lt;br /&gt;由於 Joomla 採用 &lt;a href="http://zh.wikipedia.org/zh-tw/MVC"&gt;Model-View-Controller (MVC) &lt;/a&gt;&lt;a href="http://zh.wikipedia.org/zh-tw/MVC"&gt;架構&lt;/a&gt;，Fabrik 套件也是以 MVC 架構來開發，因此程式架構很好理解，也很容易猜測如何修改。接下來記錄我小小調整 Fabrik 套件的 PHP 程式碼的作法，包括：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;修改 Fabrik 套件存檔時的 time_date 欄位，以儲存資料異動當下的完整時間 (原本僅記錄日期：yyyy-mm-dd &lt;span style="color: red;"&gt;00:00:00&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;在資料存入 DB 之後，把異動的 log 也寫入 DB &lt;/li&gt;&lt;/ul&gt;MVC 架構：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_OfFzBcT0I/AAAAAAAADEQ/M3XyKhjxU64/s1600-h/8%5B3%5D.png"&gt;&lt;img alt="8" border="0" height="192" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_OfGk4y-1I/AAAAAAAADEU/BNxkb9yMiFE/8_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="8" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;修改 Fabrik 套件存檔時的 time_date 欄位，以儲存資料異動當下的完整時間&lt;/span&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_OfHRS5KEI/AAAAAAAADEY/7r18Mcm9nH0/s1600-h/7%5B3%5D.png"&gt;&lt;img alt="7" border="0" height="319" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_OfI3PGtwI/AAAAAAAADEc/qRx0fSnSBSk/7_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="7" width="504" /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_OfJkYRihI/AAAAAAAADEg/rapeNFLLNfY/s1600-h/10%5B3%5D.png"&gt;&lt;img alt="10" border="0" height="142" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_OfK_zmLEI/AAAAAAAADEk/YoswLBKfkpk/10_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="10" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;修改檔案：      &lt;br /&gt;&lt;i&gt;[path/to/Joomla Dir]&lt;/i&gt;/components/com_fabrik/models/&lt;span style="color: red;"&gt;table.php&lt;/span&gt; &lt;/li&gt;&lt;li&gt;新增 function getDateTime()，利用 php 內建的 &lt;a href="http://w3.php5.idv.tw/modules.php?mod=books&amp;amp;act=show&amp;amp;shid=128"&gt;getdate&lt;/a&gt; 函式取得目前時間，再調整為「yyyy-mm-dd hh:mm:ss」的格式。 &lt;/li&gt;&lt;li&gt;修改 function storeRow() &amp;lt;負責 Insert &amp;amp; Update&amp;gt;，在適當位置加入：$oRecord-&amp;gt;time_date=$this-&amp;gt;getDateTime();。 &lt;/li&gt;&lt;/ul&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_OfLxrnxTI/AAAAAAAADEo/D6wsKVU2cT0/s1600-h/image62.png"&gt;&lt;img alt="image" border="0" height="202" src="http://lh3.ggpht.com/_qUfPJWk25s0/S_OfMgVdWdI/AAAAAAAADEs/TWFFXy7IeAM/image_thumb30.png?imgmax=800" style="border-width: 0px; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;getDateTime() 函式的內容：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_OfNWp6awI/AAAAAAAADEw/ElrAXX-S5VU/s1600-h/12%5B3%5D.png"&gt;&lt;img alt="12" border="0" height="275" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_OfQVkvhFI/AAAAAAAADE0/iquA2FfacJY/12_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="12" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;留下資料異動記錄 (Insert、Delete、Update)&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.knick.tw/2009/02/mysql-50-mycnf.html"&gt;MySQL &lt;/a&gt;&lt;a href="http://blog.knick.tw/2009/02/mysql-50-mycnf.html"&gt;內建的 &lt;/a&gt;&lt;a href="http://blog.knick.tw/2009/02/mysql-50-mycnf.html"&gt;bin-log&lt;/a&gt; 無法區別不同的 Joomla 使用者，一律會記錄為 Joomla 用來登入 MySQL 的 user (通常為 root)&lt;/li&gt;&lt;li&gt;利用 jos_fabrik_log 這個 fabrik 內建的 table 來儲存資料異動的 log： &lt;/li&gt;&lt;/ul&gt;&lt;table border="0" cellpadding="2" cellspacing="2" style="width: 500px;"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td valign="top" width="174"&gt;欄位名稱&lt;/td&gt;        &lt;td valign="top" width="326"&gt;內容&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="174"&gt;id&lt;/td&gt;        &lt;td valign="top" width="326"&gt;auto_increment 的流水號，作為 PK&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="174"&gt;timedate_created&lt;/td&gt;        &lt;td valign="top" width="326"&gt;每一筆資料的異動時間，採預設值即可(CURRENT_TIMESTAMP)&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="174"&gt;referring_url &lt;/td&gt;        &lt;td valign="top" width="326"&gt;用來儲存進行此操作的 username            &lt;br /&gt;(e.g., user1, user2)&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="174"&gt;message_type &lt;/td&gt;        &lt;td valign="top" width="326"&gt;用來儲存該 user 進行的操作           &lt;br /&gt;(i.e., INSERT, DELETE, UPDATE)&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td valign="top" width="174"&gt;Message&lt;/td&gt;        &lt;td valign="top" width="326"&gt;該 user 執行的 SQL Statement           &lt;br /&gt;(重要：必須將「&lt;span style="color: red;"&gt;`&lt;/span&gt;」和「&lt;span style="color: red;"&gt;’&lt;/span&gt;」取代為空白)&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt;修改檔案：      &lt;br /&gt;&lt;i&gt;[path/to/Joomla Dir]&lt;/i&gt;/components/com_fabrik/models/table.php &lt;/li&gt;&lt;li&gt;新增 function getUserName()，以取得目前登入的使用者名稱，參考 &lt;i&gt;[path/to/Joomla Dir]&lt;/i&gt;/components/com_fabrik/models/formsession.php 中的 getUserId() function &lt;/li&gt;&lt;li&gt;新增 function logDBOperation($SQL)，取得 log 所需的資料，並存入 jos_fabrik_log。 &lt;/li&gt;&lt;li&gt;修改 storeRow &amp;lt;負責 Insert &amp;amp; Update&amp;gt;及 deleteRows &amp;lt;負責 Delete&amp;gt; 兩個 function，在適當位置加入：      &lt;br /&gt;$this-&amp;gt;logDBOperation 的呼叫。 &lt;/li&gt;&lt;/ul&gt;成果(登入 phpMyAdmin 查看)：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_OfRaVVxgI/AAAAAAAADE4/JabC4HMLzEM/s1600-h/11%5B3%5D.png"&gt;&lt;img alt="11" border="0" height="148" src="http://lh4.ggpht.com/_qUfPJWk25s0/S_OfS7PZvII/AAAAAAAADE8/35pMz0Yd65s/11_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="11" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;經過測試，批次匯入資料時也會留下每一筆資料的異動記錄。&lt;br /&gt;getUserName() 函式的內容：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S_OfTS8NJ_I/AAAAAAAADFA/2mhZ8gfcCfk/s1600-h/13%5B3%5D.png"&gt;&lt;img alt="13" border="0" height="358" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_OfUMwFKYI/AAAAAAAADFE/ShVV0e2fkws/13_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="13" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;logDBOperation($SQL) 函式的內容：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S_OfUxFY2NI/AAAAAAAADFI/ajnu-uqUS7I/s1600-h/14%5B3%5D.png"&gt;&lt;img alt="14" border="0" height="237" src="http://lh5.ggpht.com/_qUfPJWk25s0/S_OfVn33RVI/AAAAAAAADFM/mG-l_fsu_a4/14_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="14" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;設定 MySQL 排程定期備份&lt;/span&gt;&lt;br /&gt;參考資料：&lt;a href="http://www.hkcode.com/linux-bsd-notes/125"&gt;MySQL&lt;/a&gt;&lt;a href="http://www.hkcode.com/linux-bsd-notes/125"&gt;備份 &lt;/a&gt;&lt;a href="http://www.hkcode.com/linux-bsd-notes/125"&gt;shell script&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;修改以下程式，另存為 &lt;i&gt;[path/to/Joomla Dir]&lt;/i&gt;/backup/backup.sh：&lt;/li&gt;&lt;ul&gt;&lt;li&gt;設定 db_user、db_passwd 以及 db_host 變數&lt;/li&gt;&lt;li&gt;backup_dir=“&lt;i&gt;[path/to/Joomla Dir]&lt;/i&gt;/backup“&lt;/li&gt;&lt;li&gt;# get all databases 以下的內容，改為僅備份 Joomla DB：        &lt;br /&gt;$MYSQLDUMP -u $db_user -h $db_host -p$db_passwd &lt;i&gt;[JoomlaDB]&lt;/i&gt; | $GZIP -9 &amp;gt; "$backup_dir/backup.0/$time.Joomla2.gz“&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;設定 cron job 每月1日進行備份：&lt;/li&gt;&lt;ul&gt;&lt;li&gt;crontab -u root -e:        &lt;br /&gt;0 0 1 * * sh &lt;i&gt;[path/to/Joomla Dir]&lt;/i&gt;/backup/backup.sh&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;將 Joomla 從測試環境轉移到正式環境&lt;/span&gt;&lt;br /&gt;在正式環境上最好是用 clean installation 比較保險，並且把網站名稱和 DB 名稱都設定成與測試環境相同，再用 phpMyAdmin 把資料匯出成 insert SQL，以免忘記修改到 DB 中的設定造成網站運作的異常。&lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;其他待解問題&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;先排序好A欄位，再排序B欄位，不要把A欄位的順序重排 &lt;/li&gt;&lt;li&gt;暫時提昇某個user的權限為可讀寫 (調整「存取」為「作者」無效) &lt;/li&gt;&lt;li&gt;Range filter 會清掉其他 filter 的設定值 (要設定兩次，多出一個Go button) &lt;/li&gt;&lt;/ul&gt;以上就是最近使用 Joomla 的一些心得分享，整理完畢之後，未來要查筆記就方便多啦 :D&lt;br /&gt;&lt;br /&gt;本系列其他文章：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/02/joomla-asset-management-1.html"&gt;利 用 Joomla 做資產管理 (Asset Management) -1 : 安裝過程紀要 (Windows)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/03/joomla-asset-management-2-linux.html"&gt;利 用 Joomla 做資產管理 (Asset Management) -2 : 安裝過程紀要 (Linux)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/04/joomla-asset-management-3-fabrik.html"&gt;利  用 Joomla 做資產管理 (Asset Management) -3 : 安裝 Fabrik擴充套件及其使用方法&amp;nbsp; &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-2378342472094561602?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/2378342472094561602/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=2378342472094561602&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/2378342472094561602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/2378342472094561602'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/05/joomla-asset-management-4-fabrik-joomla.html' title='利用 Joomla 做資產管理 (Asset Management) -4 : Fabrik 套件使用小技巧 ＆ Joomla 客製化'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_qUfPJWk25s0/S_Oe3xeXZaI/AAAAAAAADDE/p_Cw8wZGvBM/s72-c/1_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-2870753880300887959</id><published>2010-05-15T21:59:00.002+08:00</published><updated>2010-06-12T13:19:57.237+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows NIC bonding'/><category scheme='http://www.blogger.com/atom/ns#' term='broadcom'/><title type='text'>Windows 合併網卡實作 (以 Broadcom 網卡為例)</title><content type='html'>上週實作了三台 Windows 主機的合併網卡(active-standby mode，觀念可參考&lt;a href="http://en.wikipedia.org/wiki/NIC_bonding"&gt;Wikipedia – Link aggregation&lt;/a&gt;, 在 Linux 上通常稱為 NIC Bonding，作法可參考&lt;a href="http://cha.homeip.net/blog/archives/2007/03/linux_bonding.html"&gt;Linux Bonding (合併網卡)實作&lt;/a&gt;)，若利用 Windows 內建的網路橋接器(Bridge)，無法正確實作 NIC Bonding (active-standby mode)，必須使用網卡廠商提供的管理軟體來實作。以下紀錄以 Broadcom 網卡實作 active-standby mode 的步驟。&lt;br /&gt;步驟一：安裝 Broadcom 提供的 Windows 管理工具 – Broadcom Advanced Control Suite (BACS)，可從 &lt;a href="http://www.broadcom.com/support/ethernet_nic/management_applications.php"&gt;Broadcom 官網&lt;/a&gt;下載。安裝完成後，可從命令列啟動：&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S-6om7DjVyI/AAAAAAAACkM/1pJK4xAowMs/s1600-h/image001%5B4%5D.png"&gt;&lt;img alt="image001" border="0" height="172" src="http://lh4.ggpht.com/_qUfPJWk25s0/S-6ooQqUv1I/AAAAAAAACkQ/1W8CagCPSrY/image001_thumb%5B2%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image001" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;或者從開始功能表啟動：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S-6opgniZUI/AAAAAAAACkU/0QcqoQcuPIM/s1600-h/image002%5B3%5D.png"&gt;&lt;img alt="image002" border="0" height="344" src="http://lh3.ggpht.com/_qUfPJWk25s0/S-6oq6y5pnI/AAAAAAAACkY/sxkvB6HUwyY/image002_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image002" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;步驟二：點選功能表中的「Teams」--&amp;gt;「Create a Team」&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S-6orddaq-I/AAAAAAAACkc/I7NCiuU-vSk/s1600-h/image003%5B7%5D.png"&gt;&lt;img alt="image003" border="0" height="227" src="http://lh4.ggpht.com/_qUfPJWk25s0/S-6osvbb6HI/AAAAAAAACkg/DwwZBJpvjMI/image003_thumb%5B3%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image003" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;步驟三：選擇「ExpertMode」(專家模式)，這個模式比較好用，若使用預設值，則兩張網路卡會是 Load Balancing 的組態，而不是 active-standby。&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S-6oteCqDzI/AAAAAAAACkk/mrQ5oGjPfTE/s1600-h/image004%5B3%5D.png"&gt;&lt;img alt="image004" border="0" height="442" src="http://lh3.ggpht.com/_qUfPJWk25s0/S-6ouAvAaAI/AAAAAAAACko/E74u2dUtUx8/image004_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image004" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;步驟四：逐一設定以下項目&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Team Name：也就是 Linux 的 Bonding DEVICE 名稱，按照慣例命名為Bond0&lt;/li&gt;&lt;li&gt;Team Type：也就是 Linux 的 Bonding Mode，設定為 Smart Load Balancing (TM) and Failover&lt;/li&gt;&lt;li&gt;Load Balance Members：也就是 Linux 的 Primary NIC—&amp;gt;Active 的網卡&lt;/li&gt;&lt;li&gt;Standby Member：顧名思義，就是 standby 的網卡&lt;/li&gt;&lt;/ul&gt;設定完成後的畫面如下：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S-6ou4SydvI/AAAAAAAACks/H6brP7oj8Lk/s1600-h/image005%5B3%5D.png"&gt;&lt;img alt="image005" border="0" height="438" src="http://lh4.ggpht.com/_qUfPJWk25s0/S-6ov1Zy2WI/AAAAAAAACkw/x1BrooHCMIE/image005_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image005" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;步驟五：點選視窗左下的「Update」按鈕，先不要按視窗右下角「Apply/Exit」按鈕(按了以後 NIC Bonding 就會生效，網路會斷掉)&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S-6owtPGxCI/AAAAAAAACk0/XDSiSDSISGU/s1600-h/image007%5B3%5D.png"&gt;&lt;img alt="image007" border="0" height="440" src="http://lh5.ggpht.com/_qUfPJWk25s0/S-6oxiWMItI/AAAAAAAACk4/HZ7e0w9prvY/image007_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image007" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;步驟六：抄下現有的網路橋接器(Bridge)上的 IP 設定，之後刪除網路橋接器(此時網路開始斷掉)&lt;br /&gt;步驟七：回到 BACS，點選視窗右下角的「Apply/Exit」按鈕，BACS 會開始設定 NIC Bonding&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S-6oyZN7QCI/AAAAAAAACk8/9HmRlkWr5z8/s1600-h/image006%5B3%5D.png"&gt;&lt;img alt="image006" border="0" height="436" src="http://lh4.ggpht.com/_qUfPJWk25s0/S-6ozZwQeOI/AAAAAAAAClA/-d-vNRhW16I/image006_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image006" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;步驟八：此時在控制台的網路連線中，會出現 Bond0 這個 BASP Virtual Adapter&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S-6o0CZgJzI/AAAAAAAAClI/Q1WUm0osCqE/s1600-h/image008%5B3%5D.png"&gt;&lt;img alt="image008" border="0" height="132" src="http://lh5.ggpht.com/_qUfPJWk25s0/S-6o0-VD8ZI/AAAAAAAAClM/ChPSTwZEwVw/image008_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image008" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;步驟九：按照一般設定 Windows 網路卡的方式設定 IP、Netmask、Gateway、以及 DNS (在設定完成前網路都是斷掉的狀態)&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S-6o1mjV2QI/AAAAAAAAClQ/843c0PqybsI/s1600-h/image009%5B3%5D.png"&gt;&lt;img alt="image009" border="0" height="174" src="http://lh4.ggpht.com/_qUfPJWk25s0/S-6o23D6LxI/AAAAAAAAClU/JrxuIZ0iImo/image009_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image009" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;以上就是在 Windows 系統上以 Broadcom 網卡管理軟體-BACS 實作合併網卡的過程啦，其實蠻簡單的 :D&lt;br /&gt;參考資料：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/NIC_bonding"&gt;Wikipedia – Link aggregation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cha.homeip.net/blog/archives/2007/03/linux_bonding.html"&gt;Linux Bonding (合併網卡)實作&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-2870753880300887959?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/2870753880300887959/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=2870753880300887959&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/2870753880300887959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/2870753880300887959'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/05/windows-broadcom.html' title='Windows 合併網卡實作 (以 Broadcom 網卡為例)'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_qUfPJWk25s0/S-6ooQqUv1I/AAAAAAAACkQ/1W8CagCPSrY/s72-c/image001_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-6100240321118652456</id><published>2010-05-05T14:49:00.002+08:00</published><updated>2010-06-12T13:20:24.240+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='import/export'/><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='phpMyAdmin'/><title type='text'>phpMyAdmin 匯出中文資料成 utf-8 編碼的 .csv 格式之注意事項</title><content type='html'>今天測試了從 &lt;a href="http://www.phpmyadmin.net/home_page/index.php"&gt;phpMyAdmin&lt;/a&gt; 介面將 MySQL DB 中的中文資料匯出成 .csv 檔，原本想說既然中文資料可以正確以 utf-8 編碼存入 MySQL，在 phpMyAdmin 的網頁介面上也可以正常顯示，之前匯出成 .sql 檔也沒有亂碼問題，那匯出 .csv 這種純文字格式應該更沒有問題吧？誰知道匯出成功後用 Excel 打開卻是下面這個樣子：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S-EUMHoo6nI/AAAAAAAAB9M/KPh5-o_yPDU/s1600-h/phpMyAdmin_Export_Before_ExcelView%5B4%5D.png"&gt;&lt;img alt="phpMyAdmin_Export_Before_ExcelView" border="0" height="457" src="http://lh4.ggpht.com/_qUfPJWk25s0/S-EUNR5l_8I/AAAAAAAAB9Q/dRdsZW81Xlw/phpMyAdmin_Export_Before_ExcelView_thumb%5B2%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="phpMyAdmin_Export_Before_ExcelView" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;但是用 &lt;a href="http://notepad-plus.sourceforge.net/tw/site.htm"&gt;Notepad++&lt;/a&gt; 這個超好用超強的免費軟體來看卻是正常的：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S-EUOARuPtI/AAAAAAAAB9U/n26EpSerrMk/s1600-h/phpMyAdmin_Export_Before_Notepad%2B%2BView%5B3%5D.png"&gt;&lt;img alt="phpMyAdmin_Export_Before_Notepad  View" border="0" height="192" src="http://lh6.ggpht.com/_qUfPJWk25s0/S-EUP50Z0-I/AAAAAAAAB9Y/veD4BKeLhi0/phpMyAdmin_Export_Before_Notepad%2B%2BView_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="phpMyAdmin_Export_Before_Notepad  View" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;後來我發現，從 Notepad++ 中可以看出，phpMyAdmin 匯出的 utf-8 編碼文件是「檔首無&lt;a href="http://en.wikipedia.org/wiki/Byte_order_mark"&gt;BOM&lt;/a&gt;」的格式：&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S-EUQfu-R_I/AAAAAAAAB9c/-DhBuXybcH8/s1600-h/phpMyAdmin_Export_Before_Notepad%2B%2BDefaultSetting%5B3%5D.png"&gt;&lt;img alt="phpMyAdmin_Export_Before_Notepad  DefaultSetting" border="0" height="277" src="http://lh4.ggpht.com/_qUfPJWk25s0/S-EURhb01qI/AAAAAAAAB9g/3gSUZxWL0ZU/phpMyAdmin_Export_Before_Notepad%2B%2BDefaultSetting_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="phpMyAdmin_Export_Before_Notepad  DefaultSetting" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;只要利用 Notepad++ 把整份文件重新編碼為 utf-8 格式後存檔：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S-EUSJDqzKI/AAAAAAAAB9k/u20o6zjQUqg/s1600-h/phpMyAdmin_Export_Before_Notepad%2B%2BNewSetting%5B3%5D.png"&gt;&lt;img alt="phpMyAdmin_Export_Before_Notepad  NewSetting" border="0" height="279" src="http://lh3.ggpht.com/_qUfPJWk25s0/S-EUlT34SDI/AAAAAAAAB9o/Fc9FYnpej48/phpMyAdmin_Export_Before_Notepad%2B%2BNewSetting_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="phpMyAdmin_Export_Before_Notepad  NewSetting" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;再用 Excel 打開，就不會有亂碼問題了：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S-EUl_HCNXI/AAAAAAAAB9s/NQ8WretfgsE/s1600-h/phpMyAdmin_Export_After_ExcelView%5B3%5D.png"&gt;&lt;img alt="phpMyAdmin_Export_After_ExcelView" border="0" height="433" src="http://lh5.ggpht.com/_qUfPJWk25s0/S-EUncRytPI/AAAAAAAAB9w/04P_sh-E1h0/phpMyAdmin_Export_After_ExcelView_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="phpMyAdmin_Export_After_ExcelView" width="404" /&gt;&lt;/a&gt; &lt;br /&gt;補充：phpMyAdmin 的 export 設定可參考下圖：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S-EUoGzA4lI/AAAAAAAAB90/KBr4fSU3x_o/s1600-h/phpMyAdmin_Export%5B3%5D.png"&gt;&lt;img alt="phpMyAdmin_Export" border="0" height="358" src="http://lh3.ggpht.com/_qUfPJWk25s0/S-EU8im7I7I/AAAAAAAAB94/jtbXH16Wx2M/phpMyAdmin_Export_thumb%5B1%5D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="phpMyAdmin_Export" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;有勾選「將欄位名稱放在首行」，匯出的文件才會含有標題列，比較清楚易讀。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-6100240321118652456?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/6100240321118652456/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=6100240321118652456&amp;isPopup=true' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6100240321118652456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6100240321118652456'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/05/phpmyadmin-utf-8-csv.html' title='phpMyAdmin 匯出中文資料成 utf-8 編碼的 .csv 格式之注意事項'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_qUfPJWk25s0/S-EUNR5l_8I/AAAAAAAAB9Q/dRdsZW81Xlw/s72-c/phpMyAdmin_Export_Before_ExcelView_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-6853487327508409198</id><published>2010-04-21T15:37:00.001+08:00</published><updated>2010-04-21T15:37:13.857+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Distributed file system'/><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>何謂雲端運算 ＆ HDFS 補充 (雲端運算核心技術 Hadoop &amp; MapReduce 概念班上課心得)</title><content type='html'>&lt;p&gt;前陣子整理了之前上課的筆記：&lt;a href="http://dotnetmis91.blogspot.com/2010/04/vs-hadoop-mapreduce.html"&gt;以運算就資料(在地運算) vs. 以資料就運算 (雲端運算核心技術 Hadoop &amp;amp; MapReduce 概念班上課心得)&lt;/a&gt;，那次課程的內容包括：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;雲端運算簡介 &lt;/li&gt;    &lt;li&gt;Hadoop簡介 &lt;/li&gt;    &lt;li&gt;Hadoop 安裝與設定解析 &lt;/li&gt;    &lt;li&gt;Hadoop Distributed File System 簡介 (HDFS) &lt;/li&gt;    &lt;li&gt;MapReduce 介紹 &lt;/li&gt;    &lt;li&gt;快速佈建 Hadoop 叢集 (Cluster) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;接下來再補充一些心得。&lt;/p&gt;  &lt;p&gt;&lt;font color="#0080ff" size="3"&gt;何謂雲端運算？&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;這是個最近很熱門的話題，&lt;a href="http://trac.nchc.org.tw/cloud/raw-attachment/wiki/Hinet100402/01.CloudIntro.pdf"&gt;講義&lt;/a&gt;裡面(P.3)濃縮成一句話是「能夠隨時隨地使用任何裝置存取各種服務」(但我覺得這講得太模糊了，甚至跟 Web 1.0 or U 化都無法區別)。講義中比較精確的定義是參考 NIST (&lt;a href="http://www.google.com.tw/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAkQFjAA&amp;amp;url=http%3A%2F%2Fcsrc.nist.gov%2Fgroups%2FSNS%2Fcloud-computing%2Fcloud-def-v15.doc&amp;amp;ei=PcDNS8bwAoH-7AOO6IGoDQ&amp;amp;usg=AFQjCNFum4-NdDt--jMu-1MXh15DYASpmA&amp;amp;sig2=_a8d3zg7hVmyTU-0z356gw"&gt;word 檔&lt;/a&gt;，重點就是 543, 講義 P.4, 5大基礎特徵，4個佈署模型，3個服務模式)。另外也看到 &lt;a href="http://blogs.gartner.com/daryl_plummer/2009/01/27/experts-define-cloud-computing-can-we-get-a-little-definition-in-our-definitions/"&gt;Gartner 的定義&lt;/a&gt;，以及&lt;a href="http://cloudcomputing.sys-con.com/node/612375"&gt;Twenty-One experts defining Cloud Computing&lt;/a&gt;等等。&lt;/p&gt;  &lt;p&gt;如果講得更技術一點：雲端運算是一種新的運算方式，可讓任何連網裝置&lt;font color="#ff0000"&gt;透過網路&lt;/font&gt;(基本上是 Internet)，使用者根據(可能會劇烈變動的)需求存取所需的運算資源(CPU Power / Storage)，最後根據使用量付費 (&lt;a href="http://en.wikipedia.org/wiki/Pay_as_you_go"&gt;pay-as-you-go&lt;/a&gt;)。我覺得使用者能夠 &lt;font color="#ff0000"&gt;on-demand&lt;/font&gt; 的、基本上無上限的(只要付的出錢來)、&lt;font color="#ff0000"&gt;在短時間內(數十秒到幾分鐘)&lt;/font&gt;擴充所需的運算資源，是雲端運算最重要的特性，因為這是以往的架構所做不到的。這個定義的重點除了 on-demand 的動態擴充能力之外，還包括：運算資源透過網路存取、根據使用量付費。假如像某些&lt;a href="http://blog.serv.idv.tw/2009/11/09/1614/"&gt;專家所說&lt;/a&gt;，只要把資料/服務放到網路上遠端的電腦，從此可以讓任何連網裝置&lt;font color="#ff0000"&gt;透過網路存取&lt;/font&gt;，就叫做雲端的話，那所有的 Web-based 系統都可以叫做雲端運算囉？這根本就是鬼扯。難道有人可以在 5 分鐘內把 SVN 系統從 1 台變成 50 台嗎？保證辦不到的嘛！而且現在所有的系統都必須透過網路溝通(例如&lt;a href="http://en.wikipedia.org/wiki/Multitier_architecture"&gt;三層式架構&lt;/a&gt;)，就算不開放公開的 Internet 存取，企業內部也會建構 Intranet，所以透過網路存取這點就沒什麼好稀奇的了。&lt;/p&gt;  &lt;p&gt;至於根據使用量付費，從技術的觀點來看，我覺得也不是雲端運算最重要的特性(雖然說這也不太容易做，系統必須在盡可能不干擾使用者使用服務的狀況下，詳盡的記錄使用情形，並且提供一個 web-based 的 dashboard 讓使用者隨時隨地掌握服務的運作/使用狀況)，不過上課的時候老師有提到，未來如果這種依使用量付費的商業模式越來越成熟，可能會出現一種新的專業(顧問)：雲端精算師，主要工作是要幫客戶規劃如何使用雲端服務，能夠以最少的成本滿足運算的需求 (例如要用怎樣的 OS/AP 組合來執行運算任務，不是透過網路把精算工作丟給遠端的精算人員唷揪咪^.&amp;lt;)。&lt;/p&gt;  &lt;p&gt;要提供 on-demand 動態擴充的運算能力，除了需要靠虛擬化技術以外，也必須建構在分散式運算 (Hadoop) 以及分散式檔案系統 (HDFS) 之上。如果僅能透過虛擬化技術作到快速的新增虛擬機器(VM)，並且設定好相關的網路組態(我覺得這樣已經很厲害了)，但是資料無法有效的存放到分散式的檔案系統中，以提昇存取效率，對於超大量資料 (PB等級) 的運算是沒有幫助的。而若只是將資料由集中改為分散存放，程式是不會自動變成以分散式的方式去執行的，程式架構必須重新設計(也就是利用 MapReduce 演算法改寫)，這就和單執行緒程式如果不經過調整，只是把 CPU 從單核換成多核，程式也不會自動變成多執行緒，是一樣的道理。&lt;/p&gt;  &lt;p&gt;在 &lt;a href="http://blogs.gartner.com/daryl_plummer/2009/01/27/experts-define-cloud-computing-can-we-get-a-little-definition-in-our-definitions/"&gt;Gartner 的文章&lt;/a&gt;裡面有一段講得很好，過去講 Client/Server 架構的精髓就是：使用者要的是一種「不是放在 mainframe 上面跑」的系統；而雲端運算的精髓則是：使用者付費想要買的是服務以及服務所產生的結果，而不是運算的基礎設施(也就是不要再自己買機器、建機房了)。我認為這是從 PaaS Provider / SaaS Provider / SaaS Provider 的客戶等人的角度來看的，也就是把建構、維運基礎設施的成本轉嫁到 IaaS Provider 身上，而對 IaaS Provider 來講，則可以提高機器的利用率(multi-tenant)，並且可收割位於長尾末端的客戶的運算需求(也就是無力自建機房，或者需要面對劇烈變動的需求的小型企業)。(但我一直在想，雲端運算真的有完全解決 IaaS Provider 所面臨的效能不足&amp;lt;under-utilization&amp;gt; 和效能過剩&amp;lt;over-utilization&amp;gt;問題嗎？感覺為了避免效能不足的問題，很容易就會造成效能過剩的現象。)&lt;/p&gt;  &lt;p&gt;下一段補充 HDFS 分散式檔案系統的觀念。&lt;/p&gt;  &lt;p&gt;&lt;font color="#0080ff" size="3"&gt;以機率的觀點出發，將資料平均分散儲存在HDFS的成員(Datanode)中，以提高存取效率&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;前情提要：存入 HDFS 中的資料至少都會有3 份副本 (Replication)，存放於(理想上位於不同機架&amp;lt;rack&amp;gt;)的機器上&lt;/p&gt;  &lt;p&gt;把一個檔案存入 HDFS 時，HDFS (更精確的說是 Namenode) 會把檔案切割成固定大小的 block，而後將各 block 分散儲存到不同的 Datanodes 上，由於每個檔案的儲存都是跨實體機器的，因此 HDFS 可視為一個&lt;font color="#ff0000"&gt;虛擬的分散式檔案系統&lt;/font&gt; (傳統的檔案系統一樣會將檔案切割為 block，但都儲存到同一台實體機器的硬碟上)，或者說是一個 Logical File System，而 Namenode 就負責扮演 Linux file system 中 &lt;a href="http://linux.vbird.org/linux_basic/0230filesystem.php#inode"&gt;inode&lt;/a&gt; 的角色，要知道組成某個檔案的所有 block 被儲存在哪些 Datanodes? 問 Namenode 就對了。&lt;/p&gt;  &lt;p&gt;為了盡可能的提昇 HDFS 的存取效能(特別是讀取速度)，HDFS 在儲存資料時必須將資料根據機率平均的分佈在組成 Hadoop cluster 的成員硬碟上(&lt;font color="#ff0000"&gt;balancer&lt;/font&gt;的工作)。由於資料是平均分佈的，因此存取時就可以多管齊下，如下圖：&lt;/p&gt;  &lt;p&gt;&lt;img src="http://hadoop.apache.org/common/docs/r0.18.2/cn/images/hdfsdatanodes.gif" width="500" height="308" /&gt;     &lt;br /&gt;(資料來源：Apache.org - &lt;a href="http://hadoop.apache.org/common/docs/r0.18.2/cn/hdfs_design.html"&gt;HDFS 架構設計&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;當 Client 需要讀取 data 時，可以&lt;font color="#ff0000"&gt;同時&lt;/font&gt;分別從五台 Server 各讀取一個 block，讀到以後再組合成完整的檔案即可，如此一來存取效率會比循序的從單一 Server 上依序讀取 block 1~5 來的快速許多，也可以降低每一台 Server 的 read lock 時間。&lt;/p&gt;  &lt;p&gt;HDFS 其他的好處：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;資料存取時間可以控制在一定的範圍內，硬碟的損耗也更平均，進一步減少檢修硬體的成本。 &lt;/li&gt;    &lt;li&gt;儲存於 HDFS 中的檔案大小可超過一顆實體硬碟的容量。由於 HDFS 是一個虛擬的分散式檔案系統，每個檔案的 block 本身就會跨實體機器儲存，因此自然不會受限於單一機器的硬碟大小了。例如雖然一個 Hadoop cluster 中的每台主機的硬碟都只有 500G，但這個 cluster 還是可以用來儲存 1TB/1PB 甚至更大的單一檔案，只要 cluster 內硬碟的總容量夠大就好。&lt;/li&gt;    &lt;li&gt;整個HDFS系統是可以熱插拔的，當某一台 Server 的硬體壞掉時，HDFS 仍可正常運作(因為資料至少還會有另外 2 份副本)，並且由於資料的副本數低於 Policy 所規範的量，HDFS 會立即開始找尋另外正常運做的 Server 來維持副本的數量。接下來的維修只要直接把那台 Server 關機，換一台新的 Server 上去加入服務就好。因此機房管理人員就不需要利用三更半夜進行硬體的修復了。 &lt;/li&gt;    &lt;li&gt;由於分散式架構可大幅提昇檔案的讀取速度，因此有雲端運算需求的企業(如 Google) 就不用再耗費鉅資購買高階的 Server，只要以一般的消費型機種就可以架構出高效能的運算平台 (以1台高階伺服器的價格可以輕易的買到10台以上的消費型機種，但1台高階伺服器的效能不會比10台消費型機種的總和來的強)，如此可進一步降低 Data Center 的成本。&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font color="#0080ff" size="3"&gt;量少質精的資料不如超大量、品質還OK的資料&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;這是 Google 奉行不渝的原則，從以下兩篇文章可以略知一二：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;[The Official Google Blog] &lt;a href="http://googleblog.blogspot.com/2010/01/helping-computers-understand-language.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed:+blogspot/MKuf+(Official+Google+Blog)"&gt;Helping computers understand language&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;em&gt;We use many techniques to extract synonyms, that we've &lt;/em&gt;&lt;a href="http://googlepublicpolicy.blogspot.com/2008/03/making-search-better-in-catalonia.html"&gt;&lt;em&gt;blogged about before&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Our systems analyze &lt;font color="#ff0000"&gt;petabytes&lt;/font&gt; of web documents and historical search data to build an intricate understanding of what words can mean in different contexts.         &lt;br /&gt;&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;[Google Public Policy Blog] &lt;a href="http://googlepublicpolicy.blogspot.com/2008/03/making-search-better-in-catalonia.html"&gt;Making search better in Catalonia, Estonia, and everywhere else&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;&lt;em&gt;In the past, language models were built from dictionaries by hand. But such systems are incomplete and don't reflect how people actually use language.        &lt;br /&gt;        &lt;br /&gt;When building our models, we use &lt;font color="#ff0000"&gt;billions&lt;/font&gt; of web documents and &lt;font color="#ff0000"&gt;as much&lt;/font&gt; historical search &lt;font color="#ff0000"&gt;data as we can&lt;/font&gt;, in order to have the most comprehensive understanding of language possible.&lt;/em&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;其他類似的例子還有很多很多。以 Google Translate 的作法為例，與其依靠極少數的專家來進行高品質的精確翻譯(成本很高)，Google 選擇去蒐集大量的各種語文的對照文件(當然要有相當的品質，例如聯合國的文件)，在有足夠大量文件的前提下，就可以提供很不錯的翻譯品質(隨著收集到的資料越來越多，自動翻譯的品質可以持續提昇)，如此也才可以很迅速的根據使用者的需求，即時的將某個網頁從 A 語言翻譯為 B 語言。那麼要如何有效綠的儲存超大量的資料呢？當然是靠 &lt;font color="#ff0000"&gt;HDFS&lt;/font&gt; 啦！超大量的資料蒐集完畢以後如何進行快速的分析呢？那就靠 &lt;font color="#ff0000"&gt;MapReduce&lt;/font&gt; 囉！&lt;/p&gt;  &lt;p&gt;&lt;font color="#0080ff" size="3"&gt;其他感想&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;要打造一個包含軟硬體的完整架構真的很不容易，一旦架構建立以後，透過適當的講授就可以讓人在短短地幾小時內掌握此架構的重點，進而啟發出更廣泛的應用，如此可以快速的促成技術的進步，這是Google很大的貢獻。而Google把這個完整的架構以論文的形式發布，讓有心的人能夠很快的實作出來，真的是佛心來著呀！&lt;/p&gt;  &lt;p&gt;關於雲端運算課程的心得，除了這兩篇文章以外，還有 key-value store 這個重要的軟體架構沒講到，希望在閱讀更多資料以後可以整理出一篇比較完整的心得。&lt;/p&gt;  &lt;p&gt;另外還有從傳統的 IT 運算架構轉移到雲端運算的架構會遇到的困難，也是很值得深入討論的～&lt;/p&gt;  &lt;p&gt;參考資料：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;國網中心      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://trac.nchc.org.tw/cloud/"&gt;NCHC Cloud Computing Research Group&lt;/a&gt;: 有 Project News 和 Training Course &lt;/li&gt;        &lt;li&gt;&lt;a href="http://trac.nchc.org.tw/cloud/wiki/Hinet100402"&gt;雲端運算核心技術 Hadoop 與 MapReduce 概念班&lt;/a&gt;: 我這次上的課           &lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Wikipedia      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Cloud_computing"&gt;Cloud Computing&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Hadoop"&gt;Hadoop&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;MapReduce&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Distributed_file_system"&gt;Distributed file system&lt;/a&gt;           &lt;br /&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;a href="http://blog.roodo.com/rocksaying/archives/10348123.html"&gt;[石頭閒語] 電腦技術::雲端運算 survey 項目-分散式文件系統&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;a href="http://blog.xdite.net/?p=1704&amp;amp;utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+xxddite+%28Blog.XDite.net%29&amp;amp;utm_content=Google+Reader"&gt;[XDite] Scaling Rails Site: Reading Material #5 – Distributed Filesystem/Database, Database Optimization, NoSQL&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;a href="http://blogs.gartner.com/daryl_plummer/2009/01/27/experts-define-cloud-computing-can-we-get-a-little-definition-in-our-definitions/"&gt;[Gartner] Experts Define Cloud Computing: Can we get a Little Definition in our definitions?&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;a href="http://cloudcomputing.sys-con.com/node/612375"&gt;Twenty-One experts defining Cloud Computing&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-6853487327508409198?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/6853487327508409198/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=6853487327508409198&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6853487327508409198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6853487327508409198'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/04/hdfs-hadoop-mapreduce.html' title='何謂雲端運算 ＆ HDFS 補充 (雲端運算核心技術 Hadoop &amp;amp; MapReduce 概念班上課心得)'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-5616861220386606510</id><published>2010-04-14T21:16:00.002+08:00</published><updated>2010-04-20T21:52:36.239+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Distributed file system'/><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>以運算就資料(在地運算) vs. 以資料就運算 (雲端運算核心技術 Hadoop &amp; MapReduce 概念班上課心得)</title><content type='html'>前陣子上了一堂課：&lt;a href="http://trac.nchc.org.tw/cloud/wiki/Hinet100402"&gt;雲端運算核心技術 Hadoop 與 MapReduce 概念班&lt;/a&gt;，講師是國家高速網路與計算中心(&lt;a href="http://www.nchc.org.tw/tw/"&gt;國網中心&lt;/a&gt;)副研究員-王耀聰老師，一整天充實的課程讓我獲益良多，內容包括：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;雲端運算簡介 &lt;/li&gt;&lt;li&gt;Hadoop簡介 &lt;/li&gt;&lt;li&gt;Hadoop 安裝與設定解析 &lt;/li&gt;&lt;li&gt;Hadoop Distributed File System 簡介 (HDFS) &lt;/li&gt;&lt;li&gt;MapReduce 介紹 &lt;/li&gt;&lt;li&gt;快速佈建 Hadoop 叢集 (Cluster) &lt;/li&gt;&lt;/ul&gt;由於課程內容太多，把上課筆記寫成流水帳也沒有意思，因此以下就 focus 在觀念的探討，希望讓沒有研讀過相關資料的人也能看得懂。(這些觀念都是 Google 提出來的，也是 Google 的產品設計哲學的精髓)&lt;br /&gt;在進行以下的討論之前，先來確定一些基本假設：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hadoop 架構的設計目標是要能夠以&lt;span style="color: red;"&gt;低成本且有效率&lt;/span&gt;的方式處理 &lt;a href="http://en.wikipedia.org/wiki/Petabyte"&gt;PB&lt;/a&gt; 等級的資料量&lt;/li&gt;&lt;li&gt;HDFS 是一個可動態擴充的分散式檔案系統，在 Hadoop 架構中一份資料預設會有 3 份副本(Replication)&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;以運算就資料(在地運算) vs. 以資料就運算&lt;/span&gt;&lt;br /&gt;這是整天的課程中我最感興趣的，因為這代表一種&lt;span style="color: red;"&gt;思維的轉變&lt;/span&gt;。傳統在設計系統時，最常使用的就是三層式架構 (Three-tier architecture)，如下圖：&lt;br /&gt;&lt;img height="448" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Overview_of_a_three-tier_application_vectorVersion.svg/350px-Overview_of_a_three-tier_application_vectorVersion.svg.png" width="500" /&gt;     &lt;br /&gt;(資料來源：Wikipedia - &lt;a href="http://en.wikipedia.org/wiki/Multitier_architecture"&gt;Multitier architecture&lt;/a&gt;)&lt;br /&gt;就算在佈署時把 Presentation 和 Logic Tier 放在同一台 Server (在小型的 site 也許可以)，Data Tier 一定會放到另一台 Server 上面去。在 Logic tier 執行系統核心的運算前，必須將待運算的資料從 Data Tier (DB Server) 搬運到 Logic Tier (AP Server) 進行運算，也就是&lt;span style="color: red;"&gt;以資料就運算&lt;/span&gt;，負責執行運算的程式檔案本身是不移動的(固定佈署在 Logic Tier 上)，執行運算所需的資料則從其他的機器(或者 cluster) 搬運到程式所在的機器上。&lt;br /&gt;在這樣的傳統架構中，資料的傳輸情況如下：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;在網路上傳輸待運算的資料(大量)：Data Tier –&amp;gt; Logic Tier &lt;/li&gt;&lt;li&gt;程式要執行時，從 Disk 複製到記憶體中(少量)：Logic Tier Disk –&amp;gt; Logic Tier Memory&lt;/li&gt;&lt;/ul&gt;這樣的作法有幾個缺點：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;以檔案大小而言，要執行的程式檔案是很小的 (e.g., .exe/.dll)，但待運算的資料量是非常大的 (Hadoop 的 target 是 &lt;a href="http://en.wikipedia.org/wiki/Petabyte"&gt;PB&lt;/a&gt; 等級的資料)。 &lt;/li&gt;&lt;li&gt;AP Server 必須要先從 DB Server 拿到資料才能開始運算，在這段網路傳輸時間內資料只是單純的被搬運而已，並沒有被計算，因此對運算任務而言，網路傳輸時間是完全的 overhead。 &lt;/li&gt;&lt;li&gt;當待運算的資料量越來越大，例如達到 PB 等級時，消耗在網路傳輸的時間會大幅增加，因此需要佈建超高速的網路 (e.g., &lt;a href="http://en.wikipedia.org/wiki/Fibre_Channel"&gt;Fiber Channel&lt;/a&gt;, FC)，相較於成本較低且技術已經很成熟的 GE 網路來講，又要花費更高的成本。 &lt;/li&gt;&lt;/ul&gt;而 Hadoop 架構則是如下圖：&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S8XACVZ-WFI/AAAAAAAABqw/sSe3jTlUdAM/s1600-h/Hadoop_roles3.png"&gt;&lt;img alt="Hadoop_roles" border="0" height="329" src="http://lh3.ggpht.com/_qUfPJWk25s0/S8XADqMnbJI/AAAAAAAABq0/crf_vNcJb6Q/Hadoop_roles_thumb1.png?imgmax=800" style="border-width: 0px; display: inline;" title="Hadoop_roles" width="504" /&gt;&lt;/a&gt; (資料來源：&lt;a href="http://trac.nchc.org.tw/cloud/raw-attachment/wiki/Hinet100402/02.HadoopOverview.pdf"&gt;Hadoop簡介&lt;/a&gt; P.21)&lt;br /&gt;以下是 Hadoop 中各角色的簡單說明 (參考 &lt;a href="http://trac.nchc.org.tw/cloud/raw-attachment/wiki/Hinet100402/02.HadoopOverview.pdf"&gt;Hadoop簡介&lt;/a&gt; P.19~20)。首先，負責儲存資料的單元可區分為：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Namenode: 擔任 master 的角色(只能有一個)，管理檔案的讀寫，以及 Replication (副本) 的策略 &lt;/li&gt;&lt;li&gt;Datanodes: 擔任 slave 的角色(可以有多個)，接受 Namenode 的指揮，實際儲存資料的 Replication (副本)，並執行檔案的讀/寫，將資料提供給 Tasktracker 進行運算 &lt;/li&gt;&lt;/ul&gt;以上算是一組的，接下來，執行運算的單元可區分為：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Jobtracker: 擔任 master 的角色(只能有一個)，也就是工頭，接受使用者 (Client，通常是另一個程式，不一定是指真實的人) 發起的工作，並進行工作排程 (Job Scheduling)，將工作 (Job) 分派給 Tasktrackers 執行，並彙整 Tasktrackers 的計算結果後，將最終結果回傳給使用者 &lt;/li&gt;&lt;li&gt;Tasktrackers: 擔任 slave 的角色(可以有多個)，也就是工人，接受 Jobtracker 的工作指派，跟 Datanodes 要求待運算的資料，執行實際的運算後，將結果回傳給 Jobtracker 彙整 &lt;/li&gt;&lt;/ul&gt;一個 Hadoop Job 執行的流程如下 (Client Submit Job 到 Job 開始執行)：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S8XAEwfd9DI/AAAAAAAABq4/Zqgt2TaKAQ8/s1600-h/pub%5B1%5D%5B3%5D.png"&gt;&lt;img alt="pub[1]" border="0" height="379" src="http://lh6.ggpht.com/_qUfPJWk25s0/S8XAF7Htz7I/AAAAAAAABq8/5bAqjHntKqU/pub%5B1%5D_thumb%5B3%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="pub[1]" width="504" /&gt;&lt;/a&gt;     &lt;br /&gt;(資料來源：我自己用 Google Doc 畫滴)    &lt;br /&gt;(註：Job 執行完畢以後，每個 TaskTracker 會將計算結果回傳給 JobTracker 彙整，而後再由 JobTracker 回傳給 Client)&lt;br /&gt;(2010-04-20 補充：石頭閒語&lt;a href="http://blog.roodo.com/rocksaying/archives/10348123.html"&gt;有篇文章&lt;/a&gt;有個類似的圖，參考&lt;a href="http://blog.roodo.com/rocksaying/ec1935cb.png"&gt;這裡&lt;/a&gt;) &lt;br /&gt;由上圖可以看出，當一個運算任務 (Job) 要被執行時，JobTracker 會將要執行的程式(相較之下檔案很小)傳送到資料所在的位置(Datanodes)，而後待執行的運算便就地在 Datanode 上由 Tasktracker 完成，這就是&lt;span style="color: red;"&gt;以運算就資料&lt;/span&gt;，與其將很大量的資料到程式透過網路搬運到程式所在的機器上，不如先搞清楚資料在哪裡，接下來把小小的程式複製到資料所在的位置去執行。在這樣的架構中，資料的傳輸情況如下：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;在(GE)網路上傳輸要執行的程式(少量資料)：Client –&amp;gt; Jobtracker –&amp;gt; Datanodes &lt;/li&gt;&lt;li&gt;在 Datanodes 本機上傳輸待運算的資料(大量資料)：Datanodes Disks –&amp;gt; Datanodes memory，&lt;span style="color: red;"&gt;完全不需要透過網路！速度肯定快很多！&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt;2010-04-20 補充：Hadoop 官網有份文件有講到這一點，&lt;a href="http://hadoop.apache.org/common/docs/current/hdfs_design.html#%E2%80%9CMoving+Computation+is+Cheaper+than+Moving+Data%E2%80%9D"&gt;HDFS Architecture - Moving Computation is Cheaper than Moving Data&lt;/a&gt;，但是內容蠻精簡的。&lt;br /&gt;&lt;br /&gt;通常原本很大量的資料經過運算以後，產生的資料量會比原來的資料小很多很多，因此在 JobTracker 與 TaskTracker 之間的資料傳輸就不會消耗太多的網路頻寬(這和 WCG 的特性是一樣的)。上課時老師也提到，根據估計，目前每年全世界產生的資料量已經大於全世界硬碟的總容量，因此未來如何能夠快速的處理大量原始資料，而僅儲存運算之後所得到的有用資訊，就是各大未來企業競爭的重點(目前已經是 Google、Yahoo 等每天需要分析超大量 web server log 的公司所面對的挑戰)，目前看來 Hadoop 這個經過實戰(Yahoo)驗證的架構是很有希望的技術。&lt;br /&gt;以上就是我認為這次課程最重要的觀念啦！&lt;br /&gt;&lt;span style="color: #0080ff; font-size: small;"&gt;補充&lt;/span&gt;&lt;br /&gt;&lt;a href="http://trac.nchc.org.tw/cloud/wiki/Hinet100402"&gt;雲端運算核心技術 Hadoop 與 MapReduce 概念班&lt;/a&gt;內容包括：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;雲端運算簡介：重點在&lt;a href="http://trac.nchc.org.tw/cloud/raw-attachment/wiki/Hinet100402/01.CloudIntro.pdf"&gt;投影片&lt;/a&gt; P.3~P.6&amp;lt;雲端運算的定義及精髓&amp;gt;、P.19 &amp;lt;全球資料爆炸的預估量&amp;gt;、P.22~P.25&amp;lt;大量資料運算的教訓與未來趨勢&amp;gt;、P.40 &amp;lt;What we learn today?&amp;gt; &lt;/li&gt;&lt;li&gt;Hadoop簡介：重點在&lt;a href="http://trac.nchc.org.tw/cloud/raw-attachment/wiki/Hinet100402/02.HadoopOverview.pdf"&gt;投影片&lt;/a&gt; P.4~P.6&amp;lt;Hadoop基礎概念&amp;gt;、P.14 &amp;lt;Hadoop 與 google 的對應&amp;gt;、P.18&amp;lt;名詞，&lt;span style="color: red;"&gt;這一段非常重要！&lt;/span&gt;是未來討論的基礎&amp;gt;、P.19~21 &amp;lt;Hadoop 的 4 種身份以及最常見的佈署方式&amp;gt; &lt;/li&gt;&lt;li&gt;Hadoop 安裝與設定解析：這個部份等到要實作的時候再看就好 &lt;/li&gt;&lt;li&gt;Hadoop Distributed File System 簡介 (HDFS)：這份&lt;a href="http://trac.nchc.org.tw/cloud/raw-attachment/wiki/Hinet100402/04.HDFS.pdf"&gt;投影片&lt;/a&gt;&lt;span style="color: red;"&gt;每一張都很重要！&lt;/span&gt;其中我覺得 P.5 &amp;lt;設計目標(2)&amp;gt; 中的「&lt;span style="color: red;"&gt;在地運算&lt;/span&gt;」非常有意思，下一段會詳細說明。 &lt;/li&gt;&lt;li&gt;MapReduce 介紹：again, 這份&lt;a href="http://trac.nchc.org.tw/cloud/raw-attachment/wiki/Hinet100402/04.HDFS.pdf"&gt;投影片&lt;/a&gt;&lt;span style="color: red;"&gt;每一張都很重要！&lt;/span&gt;P.2~P.9 是 MapReduce 演算法的介紹，P.10~16 有很多應用 MapReduce 演算法的實例 &lt;/li&gt;&lt;li&gt;快速佈建 Hadoop 叢集：當企鵝龍遇上小飛象 DRBL-Hadoop (&lt;a href="http://trac.nchc.org.tw/cloud/raw-attachment/wiki/Hinet100402/06.HadooDeploy.pdf"&gt;投影片&lt;/a&gt;)，這是利用國網中心開發的快速、大量佈署技術(企鵝龍) 來快速佈建 Hadoop cluster 的作法，一樣是等到實作再看就可以了。(不過老師也提到，利用這種技術可以幫助人力吃緊的中小學老師快速有效的管理電腦教室，並且替學校節省很多成本，這也是國網中心的重要任務之一。) &lt;/li&gt;&lt;/ul&gt;參考資料：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;國網中心      &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://trac.nchc.org.tw/cloud/"&gt;NCHC Cloud Computing Research Group&lt;/a&gt;: 有 Project News 和 Training Course &lt;/li&gt;&lt;li&gt;&lt;a href="http://trac.nchc.org.tw/cloud/wiki/Hinet100402"&gt;雲端運算核心技術 Hadoop 與 MapReduce 概念班&lt;/a&gt;: 我這次上的課           &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Wikipedia      &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Cloud_computing"&gt;Cloud Computing&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Hadoop"&gt;Hadoop&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/MapReduce"&gt;MapReduce&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Distributed_file_system"&gt;Distributed file system&lt;/a&gt;           &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;新聞      &lt;br /&gt;&lt;ul&gt;&lt;li&gt;[2009-06-24] &lt;a href="http://www.ithome.com.tw/itadm/article.php?c=55673"&gt;iThome-Yahoo! 推出 Hadoop 雲端發行套件&lt;/a&gt; &lt;/li&gt;&lt;li&gt;[2009-11-17] &lt;a href="http://www.ithome.com.tw/itadm/article.php?c=58008"&gt;iThome-開發 Hadoop 雲端應用沒那麼難&lt;/a&gt; &lt;/li&gt;&lt;li&gt;[2009-12-09] &lt;a href="http://www.ithome.com.tw/itadm/article.php?c=58504"&gt;iThome-日本雲端伺服器明年1月搶先上市&lt;/a&gt;           &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;     &lt;br /&gt;&lt;div align="left"&gt;&lt;a href="http://blog.roodo.com/rocksaying/archives/10348123.html"&gt;[石頭閒語] 電腦技術::雲端運算 survey 項目-分散式文件系統&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;     &lt;br /&gt;&lt;div align="left"&gt;&lt;a href="http://blog.xdite.net/?p=1704&amp;amp;utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+xxddite+%28Blog.XDite.net%29&amp;amp;utm_content=Google+Reader"&gt;[XDite] Scaling Rails Site: Reading Material #5 – Distributed Filesystem/Database, Database Optimization, NoSQL&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-5616861220386606510?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/5616861220386606510/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=5616861220386606510&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5616861220386606510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/5616861220386606510'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/04/vs-hadoop-mapreduce.html' title='以運算就資料(在地運算) vs. 以資料就運算 (雲端運算核心技術 Hadoop &amp;amp; MapReduce 概念班上課心得)'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_qUfPJWk25s0/S8XADqMnbJI/AAAAAAAABq0/crf_vNcJb6Q/s72-c/Hadoop_roles_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-6325385113509175384</id><published>2010-04-09T14:46:00.003+08:00</published><updated>2010-05-19T16:32:29.764+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='joomla'/><category scheme='http://www.blogger.com/atom/ns#' term='Fabrik'/><category scheme='http://www.blogger.com/atom/ns#' term='asset management'/><title type='text'>利用 Joomla 做資產管理 (Asset Management) -3 : 安裝 Fabrik 擴充套件及其使用方法</title><content type='html'>在上一篇：&lt;a href="http://dotnetmis91.blogspot.com/2010/02/joomla-asset-management-1.html"&gt;利用 Joomla 做資產管理 (Asset Management) -1 : 安裝過程紀要&lt;/a&gt;中曾經提到，這次要架站是為了記錄機器設備的基本資料，把以往用 excel 記錄的資料 web 化、集中化，只維護一個版本，可從任何有連網的裝置上存取，同時必須滿足以下六個需求：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="color: red;"&gt;免費！免費！免費！-&amp;gt;&lt;/span&gt; 找 Freeware / Open Source Software &lt;/li&gt;&lt;li&gt;&lt;span style="color: red;"&gt;簡單易用&lt;/span&gt;的web介面，支援 &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD operation&lt;/a&gt; (增刪改查) &lt;/li&gt;&lt;li&gt;批次匯入現有資料 &lt;/li&gt;&lt;li&gt;以選單的方式輸入資料 &lt;/li&gt;&lt;li&gt;條件式的查詢、篩選資料 &lt;/li&gt;&lt;li&gt;保留資料異動的 log &lt;/li&gt;&lt;/ol&gt;其中在權限控管上，要做到以下要求：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;利用 Joomla! 內建的角色：管理者/一般使用者 來實作權限控管&lt;/li&gt;&lt;li&gt;管理者：可讀寫所有欄位&lt;/li&gt;&lt;li&gt;一般使用者(有登入)：&lt;/li&gt;&lt;ul&gt;&lt;li&gt;大部分欄位可讀，不可修改&lt;/li&gt;&lt;li&gt;有某些欄位不可讀(看不見)，當然不可修改&lt;/li&gt;&lt;li&gt;在修改的 view 中 (link to detail) 都是唯讀&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;一般使用者(沒登入)：什麼都看不到&lt;/li&gt;&lt;/ul&gt;安裝好 Joomla 之後，接下來就是要找到合用的套件來完成以上的需求啦！以下補充瀏覽 Joomla 擴充套件的注意事項，以及 Fabrik 套件的下載點。&lt;br /&gt;Joomla 豐富的擴充套件 (extension) 可以在 &lt;a href="http://extensions.joomla.org/"&gt;Joomla Extensions&lt;/a&gt; 找到 (全都是英文的)，共有 &lt;span style="color: #ff8000;"&gt;4276&lt;/span&gt; 個 extension，分為數十個大類別，其中在 Contacts &amp;amp; Feedback 中有一個 &lt;a href="http://extensions.joomla.org/extensions/contacts-and-feedback/forms"&gt;Forms&lt;/a&gt; 的類別，在瀏覽的時候要注意，Type 為 Commercial 的是商業軟體，要錢低；Type 為 Non-Commercial 的才是我們要找的免費擴充套件！&lt;br /&gt;&lt;a href="file:///C:/Users/TimLin/AppData/Local/Temp/WindowsLiveWriter415114243/supfiles7F510E/Joomla_extensions_types%5B3%5D.png"&gt;&lt;img alt="Joomla_extensions_types_thumb[1]" border="0" height="235" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77MrnN4xNI/AAAAAAAABn0/wRCKGaV3uOo/Joomla_extensions_types_thumb13.png?imgmax=800" style="border-width: 0px; display: inline;" title="Joomla_extensions_types_thumb[1]" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;點進去這次要使用的套件：&lt;a href="http://extensions.joomla.org/extensions/contacts-and-feedback/forms/1659"&gt;Fabrik – as joomla app builder&lt;/a&gt; 以後，畫面如下：&lt;br /&gt;&lt;a href="file:///C:/Users/TimLin/AppData/Local/Temp/WindowsLiveWriter415114243/supfiles7F510E/Joomla_Fabrik_IntroPage%5B3%5D.png"&gt;&lt;img alt="Joomla_Fabrik_IntroPage_thumb[1]" border="0" height="310" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77MtFTy6sI/AAAAAAAABn4/XpDA-j3VHn4/Joomla_Fabrik_IntroPage_thumb13.png?imgmax=800" style="border-width: 0px; display: inline;" title="Joomla_Fabrik_IntroPage_thumb[1]" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;Fabrik 這個套件的官網比較複雜些，包括很多 templates、nodules 和 plug-ins，套件主程式反而放在下載頁面的最下面：&lt;br /&gt;&lt;a href="file:///C:/Users/TimLin/AppData/Local/Temp/WindowsLiveWriter415114243/supfiles7F510E/Joomla_Fabrik_DownloadPage%5B3%5D.png"&gt;&lt;img alt="Joomla_Fabrik_DownloadPage_thumb[1]" border="0" height="450" src="http://lh3.ggpht.com/_qUfPJWk25s0/S77Mt8I9EhI/AAAAAAAABn8/lpghORyhTl4/Joomla_Fabrik_DownloadPage_thumb13.png?imgmax=800" style="border-width: 0px; display: inline;" title="Joomla_Fabrik_DownloadPage_thumb[1]" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;下載好 Fabrik 擴充套件主程式後，安裝方式請參考：&lt;a href="http://dotnetmis91.blogspot.com/2010/03/joomla-asset-management-2-linux.html"&gt;利用 Joomla 做資產管理 (Asset Management) -2 : 安裝過程紀要 (Linux)&lt;/a&gt;&lt;br /&gt;接下來要介紹 Fabrik 擴充套件的設定。首先登入管理員後台，進入 Fabrik 套件的管理介面：&lt;br /&gt;&lt;img src="http://lh5.ggpht.com/_qUfPJWk25s0/S5DJivh6AcI/AAAAAAAABhM/kHBIpRXSGz0/fabrik_admin_UI_thumb[1].jpg?imgmax=800" /&gt; &lt;br /&gt;包括 Forms、Tables、Groups、Elements 都是需要設定的：&lt;br /&gt;&lt;img src="http://lh3.ggpht.com/_qUfPJWk25s0/S5DJjhUgV3I/AAAAAAAABhU/9MrQk2k4R2Y/fabrik_admin_UI_homepage_thumb[1].jpg?imgmax=800" /&gt; &lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟一：新增一個 Fabrik Form&lt;/span&gt;&lt;br /&gt;在 Forms 管理介面中，按最右邊的「新增」以新增一個 Form:&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S77Mur1tNOI/AAAAAAAABoA/A9nLszNcqgQ/s1600-h/Fabrik_NewForm%5B3%5D.png"&gt;&lt;img alt="Fabrik_NewForm" border="0" height="31" src="http://lh6.ggpht.com/_qUfPJWk25s0/S77MwBxz-CI/AAAAAAAABoE/UxHzx-DhF9s/Fabrik_NewForm_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_NewForm" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;Form 即為使用者在網頁中輸入資料的表單，表單中的每一項資料稱為一個 Element。設定好 Table name 後，Fabrik 會在 Joomla DB 中建立一個同名的 table，同時也會在 Groups 中新增一個同名的 Group，屬於此 Group 的 Elements (欄位)就會出現在接受使用者輸入資料的表單。&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S77Mw1wG8HI/AAAAAAAABoI/v76za7OjisI/s1600-h/image3.png"&gt;&lt;img alt="image" border="0" height="202" src="http://lh4.ggpht.com/_qUfPJWk25s0/S77Mxv4nG9I/AAAAAAAABoM/2lhhygoa6ME/image_thumb1.png?imgmax=800" style="border-width: 0px; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟二：新增一個 Fabrik Table&lt;/span&gt;&lt;br /&gt;在 Table 管理介面中，按最右邊的「新增」以新增一個 Table:&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S77My0l7fMI/AAAAAAAABoQ/EAD4I_4ygc0/s1600-h/Fabrik_NewTable%5B3%5D.png"&gt;&lt;img alt="Fabrik_NewTable" border="0" height="31" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77MzYY1WnI/AAAAAAAABoU/FocM8j6XEQU/Fabrik_NewTable_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_NewTable" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;此時在「Data」的設定中的「Link to table」，要選擇剛剛在新增 Form 時所設定的 Table name:&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S77M0CxJsMI/AAAAAAAABoY/VwEOAMnnn4M/s1600-h/Fabrik_NewTable_SelectTable%5B3%5D.png"&gt;&lt;img alt="Fabrik_NewTable_SelectTable" border="0" height="219" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77M04unVdI/AAAAAAAABoc/05KF9R7PTko/Fabrik_NewTable_SelectTable_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_NewTable_SelectTable" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;Table 用來呈現儲存於DB中的資料，並提供Advanced search功能，在過濾資料時非常方便。以下是此 Table 的存取權限設定，這裡使用的都是 Joomla 內建的角色 (role)，「註冊會員」是指正確登入 Joomla 網站的人，而「管理者」則是擁有 Joomla 網站管理者權限的人。&lt;br /&gt;以下圖的設定為例，必須要先登入網站才能看到 DB 中的資料，而只有管理者有權限可以新增/修改資料。&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S77M1pJ5szI/AAAAAAAABog/Kdj4LClxYns/s1600-h/image4%5B1%5D.png"&gt;&lt;img alt="image" border="0" height="354" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77M2kk4rSI/AAAAAAAABok/O2t4QM6aeVU/image4_thumb.png?imgmax=800" style="border: 0px none; display: inline;" title="image" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;在過濾設定部分，建議採用以下設定：&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S77M3HqisUI/AAAAAAAABoo/Ic1F-isAr40/s1600-h/Fabrik_NewTable_FilterSettings%5B3%5D.png"&gt;&lt;img alt="Fabrik_NewTable_FilterSettings" border="0" height="150" src="http://lh6.ggpht.com/_qUfPJWk25s0/S77M37GU99I/AAAAAAAABos/EOLd9_-89Ys/Fabrik_NewTable_FilterSettings_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_NewTable_FilterSettings" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;進階搜尋的畫面如下，操作上很直覺：&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S77M4mAs7WI/AAAAAAAABow/ERzB8xSLB8Q/s1600-h/image%5B4%5D.png"&gt;&lt;img alt="image" border="0" height="164" src="http://lh3.ggpht.com/_qUfPJWk25s0/S77M6Fog7WI/AAAAAAAABo0/bMdQdByijxA/image_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;Search all 的功能則是可以搜尋此 Table 內所有欄位的所有內容 (就是 LIKE 的效果啦):&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S77M7sG8nBI/AAAAAAAABo4/cKBRWrtI26M/s1600-h/Fabrik_NewTable_SearchAll%5B3%5D.png"&gt;&lt;img alt="Fabrik_NewTable_SearchAll" border="0" height="92" src="http://lh3.ggpht.com/_qUfPJWk25s0/S77M8SCnxRI/AAAAAAAABo8/isljHFK2AVw/Fabrik_NewTable_SearchAll_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_NewTable_SearchAll" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;Table 還可進一步設定匯入/匯出資料的權限：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S77M9Oo9fbI/AAAAAAAABpA/WXD7Wz8pAtU/s1600-h/image%5B8%5D.png"&gt;&lt;img alt="image" border="0" height="100" src="http://lh4.ggpht.com/_qUfPJWk25s0/S77M-pov_cI/AAAAAAAABpE/L71wNKyzP_c/image_thumb%5B3%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟三：開始新增 Form 中用來蒐集使用者輸入資料的欄位 - Element&lt;/span&gt;&lt;br /&gt;以下的設定都與權限控管有關，要特別注意。以下先以 Element type = text area 為例：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S77M_MZHnVI/AAAAAAAABpI/5qHbBXSZ9SM/s1600-h/image%5B12%5D.png"&gt;&lt;img alt="image" border="0" height="135" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77M_9L_4kI/AAAAAAAABpM/m--XuPtriXY/image_thumb%5B5%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;以一般使用者身分登入是看不到 VIP 欄位的：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S77NAuTnPZI/AAAAAAAABpQ/8H_vEVw8wJo/s1600-h/Fabrik_Table_UserNoVIP%5B8%5D.png"&gt;&lt;img alt="Fabrik_Table_UserNoVIP" border="0" height="348" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77NBT4dDXI/AAAAAAAABpU/vLBk2TisXJo/Fabrik_Table_UserNoVIP_thumb%5B4%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_Table_UserNoVIP" width="504" /&gt;&lt;/a&gt;&lt;br /&gt;一般使用者也無法修改 DB 中的資料：&lt;br /&gt;&amp;nbsp;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S77NCJJ_WKI/AAAAAAAABpY/N4FPUQJ4ZDo/s1600-h/Fabrik_Table_User_CANNOT_Update%5B4%5D.png"&gt;&lt;img alt="Fabrik_Table_User_CANNOT_Update" border="0" height="456" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77NDbVxqxI/AAAAAAAABpc/pVbmWCgD9Os/Fabrik_Table_User_CANNOT_Update_thumb%5B2%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_Table_User_CANNOT_Update" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;若以管理者身分登入，則可看到 VIP 欄位：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S77NEqXalAI/AAAAAAAABpg/pEF3d2k9sFM/s1600-h/Fabrik_Table_AdminHasVIP%5B4%5D.png"&gt;&lt;img alt="Fabrik_Table_AdminHasVIP" border="0" height="333" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77NFXzdpcI/AAAAAAAABpk/ajjYK8Egghs/Fabrik_Table_AdminHasVIP_thumb%5B2%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_Table_AdminHasVIP" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;管理者也可以編輯 VIP 欄位：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S77NGCx7XZI/AAAAAAAABpo/nD3rXRAWvm0/s1600-h/Fabrik_Table_Admin_CAN_Update%5B4%5D.png"&gt;&lt;img alt="Fabrik_Table_Admin_CAN_Update" border="0" height="489" src="http://lh3.ggpht.com/_qUfPJWk25s0/S77NHT4LlFI/AAAAAAAABps/ZW8zu3J4gag/Fabrik_Table_Admin_CAN_Update_thumb%5B2%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_Table_Admin_CAN_Update" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟四：設定每個 Element 的 Table settings&lt;/span&gt;&lt;br /&gt;基本上這些設定值都很好了解，若不確定作用為何，可以隨時從管理介面變更設定值，嘗試一下就知道每個設定的意義了，如下圖：&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S77NIltLUBI/AAAAAAAABpw/efaHjfJBj9A/s1600-h/image%5B16%5D.png"&gt;&lt;img alt="image" border="0" height="408" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77NJbXZHkI/AAAAAAAABp0/15CnoeCB98E/image_thumb%5B7%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟五：若需要驗證欄位內容，則進行 Validations 設定(以驗證空白為例)&lt;/span&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S77NJ8vA7gI/AAAAAAAABp4/Q9QB_UnQ5Ek/s1600-h/image%5B29%5D.png"&gt;&lt;img alt="image" border="0" height="304" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77NK2hvi9I/AAAAAAAABp8/DREcX5KYmhs/image_thumb%5B14%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;若使用者沒有輸入資料，會看到以下錯誤訊息，非常明確：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S77NL6AwumI/AAAAAAAABqA/33s-7e-44vM/s1600-h/Fabrik_ValidationError%5B3%5D.png"&gt;&lt;img alt="Fabrik_ValidationError" border="0" height="406" src="http://lh6.ggpht.com/_qUfPJWk25s0/S77NMjnJHUI/AAAAAAAABqE/c6IgFzXyLW4/Fabrik_ValidationError_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_ValidationError" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;Fabrik 內建了很多的 validation rules，一看就知道怎麼用：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S77NNN8kL8I/AAAAAAAABqI/zIZsgV11J28/s1600-h/Fabrik_Element_Validation%5B4%5D.png"&gt;&lt;img alt="Fabrik_Element_Validation" border="0" height="285" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77NN0TX2nI/AAAAAAAABqM/U0v0OXxFEXk/Fabrik_Element_Validation_thumb%5B2%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_Element_Validation" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span style="color: #0080ff;"&gt;步驟六：根據需要新增各種不同類型的輸入欄位&lt;/span&gt;&lt;br /&gt;Field：也就是文字方塊 (textbox)   &lt;br /&gt;drop down：下拉式選單&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S77NOYHep-I/AAAAAAAABqQ/kKUz7P1mSow/s1600-h/image%5B28%5D.png"&gt;&lt;img alt="image" border="0" height="382" src="http://lh6.ggpht.com/_qUfPJWk25s0/S77NPdLCNJI/AAAAAAAABqU/MFwRBKqi_ls/image_thumb%5B13%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="image" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;text area：文字區域 (適合輸入大量文字)&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_qUfPJWk25s0/S77NP6zXyBI/AAAAAAAABqY/coBvEdSN8Lc/s1600-h/Fabrik_text%20area%5B4%5D.png"&gt;&lt;img alt="Fabrik_text area" border="0" height="544" src="http://lh3.ggpht.com/_qUfPJWk25s0/S77NQ20B7PI/AAAAAAAABqc/xnexkThAOJg/Fabrik_text%20area_thumb%5B2%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_text area" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;最後製作出來的 Form 大概就長得像下面這樣：&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S77NRp1iBDI/AAAAAAAABqg/6mPX1YK6btY/s1600-h/Fabrik_FormDemo%5B3%5D.png"&gt;&lt;img alt="Fabrik_FormDemo" border="0" height="521" src="http://lh6.ggpht.com/_qUfPJWk25s0/S77NSpEx5xI/AAAAAAAABqk/q8WHKUcbnGo/Fabrik_FormDemo_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_FormDemo" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;而呈現使用者在以上的 Form 中輸入的資料的 Table，大概長得像下面這樣：&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S77NTvc5CSI/AAAAAAAABqo/5j6L5YGPkB4/s1600-h/Fabrik_TableDemo%5B3%5D.png"&gt;&lt;img alt="Fabrik_TableDemo" border="0" height="404" src="http://lh5.ggpht.com/_qUfPJWk25s0/S77NVaglK6I/AAAAAAAABqs/FTeAaFHXysk/Fabrik_TableDemo_thumb%5B1%5D.png?imgmax=800" style="border: 0px none; display: inline;" title="Fabrik_TableDemo" width="504" /&gt;&lt;/a&gt; &lt;br /&gt;以上就是 Fabrik 擴充套件的用法介紹，基本上都很簡單，所有的設定都存在 DB，想要深入了解網站運作方式的話可以打開 phpMyAdmin 來查看 DB 中的資料，網站原始碼 (php) 也可以好好研讀 (這就是 open source 的好處呀！)。&lt;br /&gt;&lt;br /&gt;下一篇再來談談我對 Joomla &amp;amp; Fabrik 套件做的一些客製化，以及目前遇到的問題和解法。&lt;br /&gt;&lt;br /&gt;本系列其他文章：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/02/joomla-asset-management-1.html"&gt;利用 Joomla 做資產管理 (Asset Management) -1 : 安裝過程紀要 (Windows)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/03/joomla-asset-management-2-linux.html"&gt;利用 Joomla 做資產管理 (Asset Management) -2 : 安裝過程紀要 (Linux)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dotnetmis91.blogspot.com/2010/05/joomla-asset-management-4-fabrik-joomla.html"&gt;利用 Joomla 做資產管理 (Asset Management) -4 : Fabrik 套件使用小技巧 ＆ Joomla 客製化&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-6325385113509175384?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/6325385113509175384/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=6325385113509175384&amp;isPopup=true' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6325385113509175384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/6325385113509175384'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/04/joomla-asset-management-3-fabrik.html' title='利用 Joomla 做資產管理 (Asset Management) -3 : 安裝 Fabrik 擴充套件及其使用方法'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_qUfPJWk25s0/S77MrnN4xNI/AAAAAAAABn0/wRCKGaV3uOo/s72-c/Joomla_extensions_types_thumb13.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-7060717557056042940</id><published>2010-03-26T22:52:00.001+08:00</published><updated>2010-03-26T22:52:29.765+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chart Control'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Chat'/><title type='text'>[Chart Control 技巧篇] 改變特定軸線的樣式</title><content type='html'>前陣子坎尼看到論譠上問了標題這個問題    &lt;br /&gt;想說試著來解解看 (以前沒遇過這個需求 :D     &lt;br /&gt;另外本篇來提供一下坎尼平常思考問題的方式  &lt;hr /&gt;  &lt;h3&gt;I.問題思考方式 &lt;/h3&gt; 先來看一下問題   &lt;br /&gt;「&lt;font color="#ff0000"&gt;設定Y軸的25是一條有顏色的線(有點類似標準線的意思)，    &lt;br /&gt;其它Y軸的線正常顯示&lt;/font&gt;」   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/S6zJ6fYA8RI/AAAAAAAABMc/p6-4Qbur1gU/s1600-h/Image.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="特定線段顏色不同" border="0" alt="特定線段顏色不同" src="http://lh6.ggpht.com/_bGOQZqQ9oEM/S6zJ8Nb1h3I/AAAAAAAABMg/HuRxEVcSjPw/Image.png?imgmax=800" width="1138" height="245" /&gt;&lt;/a&gt; 坎尼先擬定了幾個主要的方法：   &lt;br /&gt;  &lt;li&gt;&lt;font color="#0000ff"&gt;利用 Custom Label 直接設定特定線段的樣式 &lt;/font&gt;&lt;/li&gt;  &lt;li&gt;&lt;font color="#0000ff"&gt;開啟 Secondary Y 則是想用其他線段來蓋掉原本的線段&lt;/font&gt;     &lt;br /&gt;    &lt;br /&gt;所以坎尼開啟了 Visual Studio，開始測試相關屬性     &lt;br /&gt;&lt;font color="#808080"&gt;(這邊可以用心智圖之類的工具來輔助思考，如上圖)&lt;/font&gt;     &lt;br /&gt;    &lt;br /&gt;從 Custom Label 的經驗得知，並無法只設定特定格線的樣式     &lt;br /&gt;格線屬性為&lt;font color="#ff0000"&gt;整個 Y 軸所共用&lt;/font&gt;     &lt;br /&gt;但可以修改 &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.datavisualization.charting.customlabel.gridticks%28VS.100%29.aspx"&gt;GridTicks&lt;/a&gt; 屬性，使想要的格線顯示出來     &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_bGOQZqQ9oEM/S6zJ86JvN3I/AAAAAAAABMk/7P0RQzp5Wbk/s1600-h/ChartXX2%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ChartXX2" border="0" alt="ChartXX2" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/S6zJ9gcGHRI/AAAAAAAABMo/YKWRFbHvav8/ChartXX2_thumb%5B1%5D.png?imgmax=800" width="372" height="317" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;經由上面的經驗，坎尼想到了 ChartArea 預設還有另一條軸線     &lt;br /&gt;如果同時打開兩邊的軸線，應該&lt;font color="#0000ff"&gt;其中一邊的樣式會蓋掉另外一邊吧?&lt;/font&gt;     &lt;br /&gt;    &lt;br /&gt;坎尼打開 Secondary Y ，加入 Custom Label 實驗出來的成果     &lt;br /&gt;Bingo!!!     &lt;br /&gt;&lt;font color="#ff0000"&gt;Secondary Y 軸的樣式會蓋住主軸線的樣式&lt;/font&gt;，測完收工!!!     &lt;br /&gt;    &lt;h3&gt;II.範例 &lt;/h3&gt; 上面已經將過程說明，所以這邊放一下實際的範例圖片吧     &lt;br /&gt;    &lt;br /&gt;打開 &lt;font color="#0000ff"&gt;ChartArea 的 Axes&lt;/font&gt; 集合     &lt;br /&gt;調整&lt;font color="#0000ff"&gt; Secondary Y&lt;/font&gt; 的 &lt;font color="#0000ff"&gt;MajorGrid 線條樣式&lt;/font&gt;     &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/S6zJ_h29lwI/AAAAAAAABMs/aW85OtVq1y4/s1600-h/CharX2%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CharX2" border="0" alt="CharX2" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/S6zKEGR8gEI/AAAAAAAABMw/hC6FlBOnjHw/CharX2_thumb%5B1%5D.png?imgmax=800" width="781" height="449" /&gt;&lt;/a&gt;建立 Custom Label，並設定顯示位置為 25    &lt;br /&gt;將 &lt;font color="#0000ff"&gt;GridTicks&lt;/font&gt; 屬性設定成&lt;font color="#0000ff"&gt; Gridline&lt;/font&gt;，讓 Chart 只顯示自訂 Label 以及它的格線     &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_bGOQZqQ9oEM/S6zKGFrlS-I/AAAAAAAABM0/xwN5DjjXJK0/s1600-h/CharX3%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CharX3" border="0" alt="CharX3" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/S6zKHjBYA0I/AAAAAAAABM4/HC1tvvMrRn8/CharX3_thumb%5B1%5D.png?imgmax=800" width="815" height="400" /&gt;&lt;/a&gt;實際設定完成後的原始碼     &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_bGOQZqQ9oEM/S6zKIviul3I/AAAAAAAABM8/LxIKnUhZ45o/s1600-h/ChartXX1%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ChartXX1" border="0" alt="ChartXX1" src="http://lh3.ggpht.com/_bGOQZqQ9oEM/S6zKJhF0-7I/AAAAAAAABNA/aMdIpwqEGoM/ChartXX1_thumb%5B1%5D.png?imgmax=800" width="622" height="360" /&gt;&lt;/a&gt;執行畫面     &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_bGOQZqQ9oEM/S6zKKPEvSUI/AAAAAAAABNE/cuZ5TYj_t3I/s1600-h/CharX%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CharX" border="0" alt="CharX" src="http://lh5.ggpht.com/_bGOQZqQ9oEM/S6zKLH74w-I/AAAAAAAABNI/dVAUx0oUsNw/CharX_thumb%5B1%5D.png?imgmax=800" width="342" height="333" /&gt;&lt;/a&gt;     &lt;br /&gt;    &lt;h3&gt;III.小結 &lt;/h3&gt; 其實坎尼寫到這邊發現，&lt;font color="#0000ff"&gt;用 MinorGrid 是否也能達成此項需求?      &lt;br /&gt;&lt;/font&gt;這邊就賣個關子，不公布答案，讀者們有興趣可以試試看 :D     &lt;br /&gt;    &lt;br /&gt;思考問題的過程其實很有趣     &lt;br /&gt;能建立起一套自己的思考方式，其實對自己的未來很有幫助 :P&lt;/li&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-7060717557056042940?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/7060717557056042940/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=7060717557056042940&amp;isPopup=true' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7060717557056042940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/7060717557056042940'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/03/chart-control.html' title='[Chart Control 技巧篇] 改變特定軸線的樣式'/><author><name>坎尼</name><uri>http://www.blogger.com/profile/14668329118252754405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/-WxuXSxOoKPA/Tv514LYBmeI/AAAAAAAAKlM/HtSwBiqzxqM/s220/k11.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_bGOQZqQ9oEM/S6zJ8Nb1h3I/AAAAAAAABMg/HuRxEVcSjPw/s72-c/Image.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1175237064254788292</id><published>2010-03-26T20:36:00.002+08:00</published><updated>2010-03-26T20:37:21.246+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tar'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>讓 tar 檔解壓縮出來的檔案的 modification time 變成執行解壓縮指令的當下時間 (用於以解壓縮 tar 檔的方式更新程式時)</title><content type='html'>&lt;p&gt;嗯 … 標題有點囉嗦，在系統上要更新程式時，常常會先將欲更新的程式，重點在於在下指令解壓縮 tar 檔時，如果只用一般常見的下法：tar zxvf &lt;span style="color:#0080ff;"&gt;xxx.tar.gz&lt;/span&gt; 的話，那麼解壓縮出來的檔案的 modification time 會維持當初打包 tar 檔的時間，而不會是執行解壓縮 tar 檔的時間，在資安稽核要求很嚴謹的環境中，以上的狀況是不被接受的。&lt;/p&gt;  &lt;p&gt;要讓 tar 檔解壓縮出來的檔案的 modification time 被修正為執行指令的當下時間很簡單，參考 &lt;a href="http://linux.die.net/man/1/tar"&gt;tar 指令的 man page&lt;/a&gt;：&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;&lt;dt&gt;&lt;b&gt;-m, --touch, --modification-time&lt;/b&gt;&lt;/dt&gt;&lt;p&gt;&lt;/p&gt; &lt;dd&gt;don't extract file modified time&lt;/dd&gt;  &lt;p&gt;此處渴看到關鍵字「touch」，再查一下 &lt;a href="http://linux.die.net/man/1/touch"&gt;touch 指令的 man page&lt;/a&gt;：&lt;/p&gt;  &lt;p&gt;&lt;b&gt;touch&lt;/b&gt; [&lt;i&gt;OPTION&lt;/i&gt;]... &lt;i&gt;FILE&lt;/i&gt;... &lt;/p&gt;  &lt;h4&gt;Description&lt;/h4&gt;  &lt;p&gt;&lt;ins&gt;&lt;ins&gt;&lt;/ins&gt;&lt;/ins&gt;&lt;/p&gt;  &lt;p&gt;Update &lt;span style="color:#ff0000;"&gt;the access and modification times&lt;/span&gt; of each FILE &lt;span style="color:#ff0000;"&gt;to the current time.&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;所以說，爾後解壓縮 tar 檔時只要下如此的指令：tar zxvf&lt;span style="color:#ff0000;"&gt;m&lt;/span&gt; xxx.tar.gz，那麼解壓縮出來的檔案的 modification time 就會是執行指令的當下時間啦！(看起來是 tar 這支程式會自動幫你 touch 壓縮檔內的所有檔案/目錄)&lt;/p&gt;  &lt;p&gt;PS. 昨天為了這個需求，還寫了個 4、50 行的 &lt;a href="http://cid-e25b289c2766addf.skydrive.live.com/self.aspx/%E5%85%AC%E9%96%8B/update.pl"&gt;Perl 程式&lt;/a&gt; (先建立 temp 目錄 –&amp;gt; 把原始 tar 檔複製到 temp 目錄 –&amp;gt; 在 temp 目錄解壓縮 –&amp;gt; 把解壓縮出來的所有檔案/目錄 touch 一遍 –&amp;gt; 再壓縮成一個新的 tar 檔 –&amp;gt; 把新的 tar 檔複製到真正的目的資料夾 –&amp;gt; 在目的資料夾解壓縮 –&amp;gt; 回頭刪掉 temp 目錄)，現在看起來真的是蠢斃了 =.=  幸好隔了一天就發現 -m 這個參數 … 可見認真的讀完 man page 是多麼重要的事情！&lt;/p&gt;  &lt;p&gt;不過在寫 Perl 的過程中又多學到了一些處理檔案、目錄的技巧，例如 &lt;a href="http://linux.die.net/man/1/mkdir"&gt;mkdir -p&lt;/a&gt; 可以自動幫你建立完整的目錄階層；&lt;a href="http://linux.die.net/man/1/cp"&gt;cp -a&lt;/a&gt; 類似沒有加上 -m 的 tar，效果等同於幫指定目錄建立另一個名稱不同的目錄，再把指定目錄下的所有子目錄和檔案複製到新目錄中，但是新目錄下的檔案 modification time 跟原目錄是一樣的 …&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6505213162600961434-1175237064254788292?l=dotnetmis91.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dotnetmis91.blogspot.com/feeds/1175237064254788292/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6505213162600961434&amp;postID=1175237064254788292&amp;isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1175237064254788292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6505213162600961434/posts/default/1175237064254788292'/><link rel='alternate' type='text/html' href='http://dotnetmis91.blogspot.com/2010/03/tar-modification-time-tar.html' title='讓 tar 檔解壓縮出來的檔案的 modification time 變成執行解壓縮指令的當下時間 (用於以解壓縮 tar 檔的方式更新程式時)'/><author><name>Tim</name><uri>http://www.blogger.com/profile/00470726729681933611</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_qUfPJWk25s0/SagChiP63BI/AAAAAAAAAKk/UKcOv_WhFZw/S220/DSC00084.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6505213162600961434.post-1620281524183154416</id><published>2010-03-22T23:31:00.003+08:00</published><updated>2010-03-23T15:33:50.902+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='scheduled backup'/><category scheme='http://www.blogger.com/atom/ns#' term='phpMyBackupPro'/><category scheme='http://www.blogger.com/atom/ns#' term='pMBP'/><title type='text'>[MySQL] 設定資料庫定期自動備份</title><content type='html'>&lt;p&gt;上週開始持續調整以 Joomla 架設的&lt;a href="http://dotnetmis91.blogspot.com/2010/03/joomla-asset-management-2-linux.html"&gt;資產管理系統&lt;/a&gt;，其中一個需求是自動定期備份 DB，如此便可追蹤這些設備在一段時間內的變化(其實我還是覺得如果要作版本控管的話，用 svn 或者 git 之類的版本控管軟體會更好…)，當發生不幸的意外時也才能迅速的將寶貴的資料還原。&lt;/p&gt; &lt;p&gt;由於 Joomla 的資料都存在 MySQL DB 中，因此今天就 survey 了一下讓 MySQL 定期排程備份的作法。&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 128, 0);font-size:130%;" &gt;I.以 shell script 呼叫 mysqldump 執行備份，將此 script 寫入 crontab 排程中&lt;/span&gt;&lt;/p&gt; &lt;p&gt;參考資料：&lt;a href="http://www.hkcode.com/linux-bsd-notes/125"&gt;MySQL 備份 shell script&lt;/a&gt;。這 script 的核心非常簡單，只有一行而已 (其他更 fancy 的工具應該也是呼叫這個 MySQL 內建的 dump 工具)：&lt;/p&gt; &lt;p&gt;mysqldump -u $db_user -h $db_host -p$db_passwd $db | $GZIP -9 &amp;gt; "$backup_dir/backup.0/$time.$db.gz"&lt;/p&gt; &lt;p&gt;而 crontab 的編寫也是玩 Linux / Unix 的基本功，可參考：&lt;a href="http://linux.vbird.org/linux_basic/0430cron.php"&gt;鳥哥的 Linux 私房菜-第十六章、例行性工作排程 (crontab)&lt;/a&gt;。以這個方法來備份 MySQL 大概是最不求人、也相當普遍的作法。&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 128, 0);font-size:130%;" &gt;II.利用 Navicat full version 來作&lt;/span&gt;&lt;/p&gt; &lt;p&gt;參考資料：&lt;a href="http://www.localsoft.tw/forum/thread-3162-1-1.html"&gt;[教學] MySQL 定期自動備份&lt;/a&gt;。這是一個可安裝在 Windows / Linux / Mac OS X 平台的 client 端軟體，安裝和操作都相當方便 (畫面蠻漂亮的)。雖然說 Navicat 有推出一個&lt;a href="http://www.localsoft.tw/forum/thread-3516-1-1.html"&gt;免費的 Navicat Lite&lt;/a&gt;，但是免費版連手動執行 backup 都做不到呀！因此它就很遺憾的出局了，但是有錢買來用的話應該相當好用 (最貴的授權要台幣一萬出頭)，看來這軟體也是相當的知名。&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 128, 0);font-size:130%;" &gt;III.利用 phpMyBackupPro (pMBP) 來作&lt;/span&gt;&lt;/p&gt; &lt;p&gt;2010-03-23 補充：&lt;a href="http://www.netadmin.com.tw/article_content.asp?sn=0903270001"&gt;[網管人雜誌] MySQL 專用備份工具-phpMyBackupPro&lt;/a&gt; (長篇的詳細說明)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;參考資料：&lt;a href="http://mrangle.macroviz.com/?p=412"&gt;Web 介面的 MySQL 備份工具-phpMyBackupPro&lt;/a&gt;, 官方網站下載頁面在&lt;a href="http://www.phpmybackuppro.net/download.php"&gt;這裡&lt;/a&gt;，這是個 host 在 &lt;a href="http://sourceforge.net/"&gt;SourceForge&lt;/a&gt; 的 open source 專案，所以是&lt;span style="color: rgb(255, 0, 0);"&gt;免費的&lt;/span&gt;！安裝的過程非常簡單，在 Windows 平台上只要把解縮後的 phpMyBackupPro 資料夾複製到 Apache 的根目錄下即可。&lt;/p&gt;&lt;p&gt;2010-03-23 補充：在 Linux 平台上安裝也很簡單，只要把資料夾 &lt;span style="color: rgb(0, 0, 255);"&gt;export&lt;/span&gt; 及檔案 &lt;span style="color: rgb(0, 0, 255);"&gt;global_conf.php&lt;/span&gt; 設定權限為 &lt;span style="color: rgb(255, 0, 0);"&gt;0777 &lt;/span&gt;就可以了。執行身分為 apache。&lt;/p&gt;&lt;p&gt;其中最重要的一點是，若 DB 中有儲存中文資料，要依照論壇中 &lt;a href="http://www.joomla.org.tw/phpbb3/viewtopic.php?f=2&amp;amp;t=1762#p13461"&gt;slimn 前輩提供的修改方式&lt;/a&gt;來調整，經過測試確實有效 (Windows 平台 OK, 目前在 Linux 測試機上仍為亂碼 [2010-03-23])：&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S6eND7dk-AI/AAAAAAAABj0/mHy8NE-SEyA/s1600-h/pMBP_TraditionalChineseTest%5B3%5D.png"&gt;&lt;img style="border: 0px none; display: inline;" title="pMBP_TraditionalChineseTest" alt="pMBP_TraditionalChineseTest" src="http://lh6.ggpht.com/_qUfPJWk25s0/S6eNEzOr4zI/AAAAAAAABj4/dlMejkiawHQ/pMBP_TraditionalChineseTest_thumb%5B1%5D.png?imgmax=800" width="504" border="0" height="246" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;以下補充教學文章中沒有特別說明的設定畫面。&lt;/p&gt; &lt;p&gt;在 configuration tab中，可設定僅備份指定 DB：&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S6eNGXf_kLI/AAAAAAAABj8/AcU6rMArDNg/s1600-h/pMBP_configurationSettings%5B3%5D.png"&gt;&lt;img style="border: 0px none; display: inline;" title="pMBP_configurationSettings" alt="pMBP_configurationSettings" src="http://lh3.ggpht.com/_qUfPJWk25s0/S6eNHyzgREI/AAAAAAAABkE/pnX45eXjimU/pMBP_configurationSettings_thumb%5B1%5D.png?imgmax=800" width="504" border="0" height="237" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;在 backup tab 中，記得要手動選取欲執行備份的 DB：&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_qUfPJWk25s0/S6eNJLWIw4I/AAAAAAAABkI/XSWsH6auMTg/s1600-h/pMBP_BackupSettings%5B3%5D.png"&gt;&lt;img style="border: 0px none; display: inline;" title="pMBP_BackupSettings" alt="pMBP_BackupSettings" src="http://lh5.ggpht.com/_qUfPJWk25s0/S6eNKNOxE8I/AAAAAAAABkM/CoIUZNftJDg/pMBP_BackupSettings_thumb%5B1%5D.png?imgmax=800" width="504" border="0" height="237" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;在 backup tab 中可設定是否要壓縮備份產出的 .sql 檔，有 gzip / zip 格式：&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S6eNLaiqIqI/AAAAAAAABkQ/8BoGZob2s1k/s1600-h/pMBP_BackupCompressionSettings%5B3%5D.png"&gt;&lt;img style="border: 0px none; display: inline;" title="pMBP_BackupCompressionSettings" alt="pMBP_BackupCompressionSettings" src="http://lh3.ggpht.com/_qUfPJWk25s0/S6eNMWyiITI/AAAAAAAABkU/Hs-BkmU0lng/pMBP_BackupCompressionSettings_thumb%5B1%5D.png?imgmax=800" width="504" border="0" height="275" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;在 schedule backup tab 中，可設定自動執行備份的週期：&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_qUfPJWk25s0/S6eNNEtXHYI/AAAAAAAABkY/q-HfRmwCGgY/s1600-h/pMBP_scheduleBackupSettings%5B3%5D.png"&gt;&lt;img style="border: 0px none; display: inline;" title="pMBP_scheduleBackupSettings" alt="pMBP_scheduleBackupSettings" src="http://lh5.ggpht.com/_qUfPJWk25s0/S6eNOimbVNI/AAAAAAAABkc/2FVh29e_c9Y/pMBP_scheduleBackupSettings_thumb%5B1%5D.png?imgmax=800" width="504" border="0" height="273" /&gt;&lt;/a&gt;&lt;br /&gt;包括每小時、每6小時、每12小時、每天、每週、每月等等週期。&lt;/p&gt; &lt;p&gt;在 schedule backup tab 中，也可自訂定期備份 php 檔的檔名： &lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S6eNPDk6KII/AAAAAAAABkg/bulETafeSQk/s1600-h/pMBP_scheduleBackupSettings_SaveNewScriptFile%5B3%5D.png"&gt;&lt;img style="border: 0px none; display: inline;" title="pMBP_scheduleBackupSettings_SaveNewScriptFile" alt="pMBP_scheduleBackupSettings_SaveNewScriptFile" src="http://lh5.ggpht.com/_qUfPJWk25s0/S6eNQY0EtcI/AAAAAAAABkk/yr-1YPnL8iU/pMBP_scheduleBackupSettings_SaveNewScriptFile_thumb%5B1%5D.png?imgmax=800" width="504" border="0" height="273" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;在 import tab 中，若已經執行過備份，則可觀看指定備份檔(.sql) 的各項資訊：&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_qUfPJWk25s0/S6eNRKvmWNI/AAAAAAAABko/b1vsU9YFzko/s1600-h/pMBP_import_viewBackupFileInfo%5B3%5D.png"&gt;&lt;img style="border: 0px none; display: inline;" title="pMBP_import_viewBackupFileInfo" alt="pMBP_import_viewBackupFileInfo" src="http://lh6.ggpht.com/_qUfPJWk25s0/S6eNR8pvhKI/AAAAAAAABks/BwQVJNH9OzQ/pMBP_import_viewBackupFileInfo_thumb%5B1%5D.png?imgmax=800" width="504" border="0" height="273" /&gt;&lt;/a&gt; 包括執行備份的日期時間、DB Name、file size 等。&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 128, 0);font-size:130%;" &gt;關於 schedule backup：&lt;/span&gt;&lt;/p&gt; &lt;p&gt;在&
