<?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:blogger='http://schemas.google.com/blogger/2008' 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-6149981107192626306</id><updated>2024-12-19T11:32:46.345+08:00</updated><title type='text'>閱讀者</title><subtitle type='html'>在閱讀中認識自己。&#xa;讀書心得 | 資料整理 | 技術分享</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>246</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-7252889106337585059</id><published>2021-11-25T19:12:00.000+08:00</published><updated>2021-11-25T19:12:05.197+08:00</updated><title type='text'>CloudMosa 面試心得</title><content type='html'>&lt;p&gt;轉貼&amp;nbsp;&lt;a href=&quot;https://t5318019.home.blog/2019/12/27/cloudmosa-job-interview/&quot;&gt;https://t5318019.home.blog/2019/12/27/cloudmosa-job-interview/&lt;/a&gt; (因為 Google 搜尋不到)&lt;/p&gt;&lt;p style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 0px auto 32px; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;這篇文章分享 CloudMosa (美商雲端科技) 的面試心得。會投這間公司主要是他們的 Puffin Browser 與創辦人，所以就試著應徵 SDET 看看，以自己的能力來說是沒機會的，但還是硬著頭皮去試試，感謝 CloudMosa 面試官的寶貴時間，還讓我問了一堆問題 (感覺反而是採訪)。&lt;/p&gt;&lt;p style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;CloudMosa 面試據說有二階段，我只有去第一階段，第二階段說是用 Skype 跟創辦人面試。第一階段面試大約要 4 小時，我 13:00 去到 19:00 才離開，總共有 4 位面試官輪流面試，各自獨立進行，所以可能要自我介紹 4 次。中間沒有特別休息，只去了一次洗手間，面試結束感覺非常疲累，20:00 回到家吃飯洗澡弄一弄就睡了。&lt;/p&gt;&lt;p style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;面試流程大該分成 3 個部分。第一是自我介紹，說說過去你做了什麼&lt;s style=&quot;box-sizing: inherit; max-width: unset;&quot;&gt;偉大的&lt;/s&gt;事情，第二是面試官提問，第三是自己的提問。面試官的面試時間不一定，每位大概是 1 至 2 小時。 4 位面試官據說是從資歷淺到深來進行，但因為我當天面試官有兩位住在桃園和新竹，導致順序有些調整。&lt;/p&gt;&lt;p style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;面試過程感覺是一關比一關困難，大概在第三關的時候就覺得沒機會了，最後第四關反而比較輕鬆自在，像是在跟同事討論事情的感覺。&lt;/p&gt;&lt;h2 style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; clear: both; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 1.728rem; line-height: 1.125; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;過程&lt;/h2&gt;&lt;p style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;由於自己是軟體開發人員 (SDE)，第一關和第四關的面試官是 SDET，專業領域比較沒有辦法深入的討論，面試過程比較像是討論產品測試的一些想法與問題。&lt;/p&gt;&lt;p style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;第二關的面試官是 SDE ，這部分的面試就硬了。有個簡短的 pseudocode 程式撰寫，考題是 LRU 快取演算法，寫完和面試官討論了程式邏輯和複雜度。事後回想覺得當時太緊張了，面試官的訊息有些沒有抓到，可能回答錯誤。另外，也從我過去的工作經驗問了 SQL 和 NoSQL 的差異與應用情境，這題也沒有回答的很好，覺得「知道是一回事，能夠妥善回答又是另一回事」。&lt;/p&gt;&lt;p style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;當天第三關的面試官是 VP ，主要是問人格特質的部分，技術的問題偏少。這邊我覺得被過去的工作思維給限制住了，像是面試官問了一個要如何規劃設計 Puffin Browser 的測試，當時回答是看看手邊有多少資源才能做多少事，但事後回想這樣應該不正確，必須「以終為始」來規劃設計。要做大事情，要想著可以找到和創造那些資源，而不是被資源限制住。&lt;/p&gt;&lt;p style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;VP 最後問了兩個問題，(1) 如果有一百萬美金從事資訊領域創業，不求任何營收，在兩至三年的時間內，你要做什麼？ (2) 如果有一百萬美金從事資訊領域創業，在兩至三年的時間內需要回收賺錢，你要做什麼？&lt;/p&gt;&lt;p style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;因為第一個問題我沒有答案， VP 才又提出第二個問題，當時覺得第二個問題比較難。但現在我反而認為第一個問題才難，問題的困難其實在於「做什麼去創業」的想法，有營收限制條件的第二題反而比較容易一些。&lt;/p&gt;&lt;h2 style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; clear: both; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 1.728rem; line-height: 1.125; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px;&quot;&gt;心得總結&lt;/h2&gt;&lt;ul style=&quot;-webkit-font-smoothing: antialiased; background-color: white; box-sizing: inherit; color: #181818; font-family: &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 20px; margin: 32px auto; max-width: calc(750px); overflow-wrap: break-word; padding: 0px 0px 0px 32px;&quot;&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;感謝 CloudMosa 的面試機會。 年紀稍大，越覺得時間寶貴，別人願意給面試機會就是對能力的一種肯定。&lt;/li&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;CloudMosa 的面試是專業的，過程中面試者是受到尊重的。據說面試官結束要寫報告，不是隨隨便便的。&lt;/li&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;面試時的自我介紹要練習，因為可能要說 4 遍，不應該太長。&lt;/li&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;第一階段面試很久，大約 4 小時，要吃飽才去啊！中間可以去洗手間，面試官還會問說要不要喝飲料呢。&lt;/li&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;公司距離不是問題，&lt;s style=&quot;box-sizing: inherit; max-width: unset;&quot;&gt;新竹以北的&lt;/s&gt;高手可以試試看。&lt;/li&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;根據面試官表示&lt;ul style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; font-family: var(--font-base, &amp;quot;IBM Plex Sans&amp;quot;, -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Roboto&amp;quot;, &amp;quot;Oxygen&amp;quot;, &amp;quot;Ubuntu&amp;quot;, &amp;quot;Cantarell&amp;quot;, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif); list-style-type: disc; margin: 0px; max-width: unset; overflow-wrap: break-word; padding: 0px 0px 0px 32px;&quot;&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;他們要找高手中的高手，厲害的人做事可以減少一堆問題 。&lt;/li&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;自主管理，工作目標自己找 。&lt;/li&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;彈性上下班，一週有一次和創辦人一起開會。&lt;/li&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;6 個月至 1 年的試用期，不適任資遣 。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style=&quot;-webkit-font-smoothing: antialiased; box-sizing: inherit; margin: 0px; max-width: unset; padding: 0px;&quot;&gt;面試紀念品： Puffin Browser 馬克杯。&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/7252889106337585059/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2021/11/cloudmosa.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/7252889106337585059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/7252889106337585059'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2021/11/cloudmosa.html' title='CloudMosa 面試心得'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-4632648550261987790</id><published>2016-08-09T22:26:00.001+08:00</published><updated>2016-08-10T09:54:43.808+08:00</updated><title type='text'>Windows File API</title><content type='html'>「Windows 有關檔案操作的 API 到底有多少個？」因為這個問題查了 MSDN 而撰寫這篇作為紀錄。&lt;br /&gt;
&lt;br /&gt;
Windows 有關檔案 (file) 操作的 API 目前總共有 130 個，依序字母開頭排序如下：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363770(v=vs.85).aspx&quot;&gt;AddUsersToEncryptedFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363781(v=vs.85).aspx&quot;&gt;AreFileApisANSI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363791(v=vs.85).aspx&quot;&gt;CancelIo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363792(v=vs.85).aspx&quot;&gt;CancelIoEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363794(v=vs.85).aspx&quot;&gt;CancelSynchronousIo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363807(v=vs.85).aspx&quot;&gt;CheckNameLegalDOS8Dot3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363839(v=vs.85).aspx&quot;&gt;CloseEncryptedFileRaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363851(v=vs.85).aspx&quot;&gt;CopyFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/hh449404(v=vs.85).aspx&quot;&gt;CopyFile2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/hh449407(v=vs.85).aspx&quot;&gt;CopyFile2ProgressRoutine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363852(v=vs.85).aspx&quot;&gt;CopyFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363853(v=vs.85).aspx&quot;&gt;CopyFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363854(v=vs.85).aspx&quot;&gt;CopyProgressRoutine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx&quot;&gt;CreateFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/hh449422(v=vs.85).aspx&quot;&gt;CreateFile2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363859(v=vs.85).aspx&quot;&gt;CreateFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363860(v=vs.85).aspx&quot;&gt;CreateHardLink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363861(v=vs.85).aspx&quot;&gt;CreateHardLinkTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363862(v=vs.85).aspx&quot;&gt;CreateIoCompletionPort&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363866(v=vs.85).aspx&quot;&gt;CreateSymbolicLink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363867(v=vs.85).aspx&quot;&gt;CreateSymbolicLinkTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363903(v=vs.85).aspx&quot;&gt;DecryptFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363915(v=vs.85).aspx&quot;&gt;DeleteFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363916(v=vs.85).aspx&quot;&gt;DeleteFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364011(v=vs.85).aspx&quot;&gt;DuplicateEncryptionInfoFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364021(v=vs.85).aspx&quot;&gt;EncryptFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364023(v=vs.85).aspx&quot;&gt;EncryptionDisable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364043(v=vs.85).aspx&quot;&gt;ExportCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364051(v=vs.85).aspx&quot;&gt;FileEncryptionStatus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364052(v=vs.85).aspx&quot;&gt;FileIOCompletionRoutine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364413(v=vs.85).aspx&quot;&gt;FindClose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx&quot;&gt;FindFirstFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364419(v=vs.85).aspx&quot;&gt;FindFirstFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364420(v=vs.85).aspx&quot;&gt;FindFirstFileNameTransactedW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364421(v=vs.85).aspx&quot;&gt;FindFirstFileNameW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364422(v=vs.85).aspx&quot;&gt;FindFirstFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364423(v=vs.85).aspx&quot;&gt;FindFirstStreamTransactedW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364424(v=vs.85).aspx&quot;&gt;FindFirstStreamW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364428(v=vs.85).aspx&quot;&gt;FindNextFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364429(v=vs.85).aspx&quot;&gt;FindNextFileNameW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364430(v=vs.85).aspx&quot;&gt;FindNextStreamW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364439(v=vs.85).aspx&quot;&gt;FlushFileBuffers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364553(v=vs.85).aspx&quot;&gt;FreeEncryptionCertificateHashList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364819(v=vs.85).aspx&quot;&gt;GetBinaryType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364930(v=vs.85).aspx&quot;&gt;GetCompressedFileSize&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364933(v=vs.85).aspx&quot;&gt;GetCompressedFileSizeTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364941(v=vs.85).aspx&quot;&gt;GetExpandedName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364944(v=vs.85).aspx&quot;&gt;GetFileAttributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364946(v=vs.85).aspx&quot;&gt;GetFileAttributesEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364949(v=vs.85).aspx&quot;&gt;GetFileAttributesTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364951(v=vs.85).aspx&quot;&gt;GetFileBandwidthReservation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364952(v=vs.85).aspx&quot;&gt;GetFileInformationByHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364953(v=vs.85).aspx&quot;&gt;GetFileInformationByHandleEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364955(v=vs.85).aspx&quot;&gt;GetFileSize&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364957(v=vs.85).aspx&quot;&gt;GetFileSizeEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364960(v=vs.85).aspx&quot;&gt;GetFileType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx&quot;&gt;GetFinalPathNameByHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364963(v=vs.85).aspx&quot;&gt;GetFullPathName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364966(v=vs.85).aspx&quot;&gt;GetFullPathNameTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364980(v=vs.85).aspx&quot;&gt;GetLongPathName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364982(v=vs.85).aspx&quot;&gt;GetLongPathNameTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364986(v=vs.85).aspx&quot;&gt;GetQueuedCompletionStatus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364988(v=vs.85).aspx&quot;&gt;GetQueuedCompletionStatusEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364989(v=vs.85).aspx&quot;&gt;GetShortPathName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364991(v=vs.85).aspx&quot;&gt;GetTempFileName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364992(v=vs.85).aspx&quot;&gt;GetTempPath&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365148(v=vs.85).aspx&quot;&gt;ImportCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365202(v=vs.85).aspx&quot;&gt;LockFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx&quot;&gt;LockFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365221(v=vs.85).aspx&quot;&gt;LZClose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365223(v=vs.85).aspx&quot;&gt;LZCopy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365224(v=vs.85).aspx&quot;&gt;LZInit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365225(v=vs.85).aspx&quot;&gt;LZOpenFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365226(v=vs.85).aspx&quot;&gt;LZRead&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365227(v=vs.85).aspx&quot;&gt;LZSeek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365239(v=vs.85).aspx&quot;&gt;MoveFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365240(v=vs.85).aspx&quot;&gt;MoveFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365241(v=vs.85).aspx&quot;&gt;MoveFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365242(v=vs.85).aspx&quot;&gt;MoveFileWithProgress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365429(v=vs.85).aspx&quot;&gt;OpenEncryptedFileRaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365430(v=vs.85).aspx&quot;&gt;OpenFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365432(v=vs.85).aspx&quot;&gt;OpenFileById&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365458(v=vs.85).aspx&quot;&gt;PostQueuedCompletionStatus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365463(v=vs.85).aspx&quot;&gt;QueryRecoveryAgentsOnEncryptedFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365464(v=vs.85).aspx&quot;&gt;QueryUsersOnEncryptedFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365466(v=vs.85).aspx&quot;&gt;ReadEncryptedFileRaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx&quot;&gt;ReadFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365468(v=vs.85).aspx&quot;&gt;ReadFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365469(v=vs.85).aspx&quot;&gt;ReadFileScatter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365495(v=vs.85).aspx&quot;&gt;RemoveUsersFromEncryptedFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365497(v=vs.85).aspx&quot;&gt;ReOpenFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365512(v=vs.85).aspx&quot;&gt;ReplaceFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365527(v=vs.85).aspx&quot;&gt;SearchPath&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365531(v=vs.85).aspx&quot;&gt;SetEndOfFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365533(v=vs.85).aspx&quot;&gt;SetFileApisToANSI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365534(v=vs.85).aspx&quot;&gt;SetFileApisToOEM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365535(v=vs.85).aspx&quot;&gt;SetFileAttributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365536(v=vs.85).aspx&quot;&gt;SetFileAttributesTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365537(v=vs.85).aspx&quot;&gt;SetFileBandwidthReservation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365538(v=vs.85).aspx&quot;&gt;SetFileCompletionNotificationModes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365539(v=vs.85).aspx&quot;&gt;SetFileInformationByHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365540(v=vs.85).aspx&quot;&gt;SetFileIoOverlappedRange&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365541(v=vs.85).aspx&quot;&gt;SetFilePointer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365542(v=vs.85).aspx&quot;&gt;SetFilePointerEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365543(v=vs.85).aspx&quot;&gt;SetFileShortName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365544(v=vs.85).aspx&quot;&gt;SetFileValidData&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/dd266735(v=vs.85).aspx&quot;&gt;SetSearchPathMode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365549(v=vs.85).aspx&quot;&gt;SetUserFileEncryptionKey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365715(v=vs.85).aspx&quot;&gt;UnlockFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365716(v=vs.85).aspx&quot;&gt;UnlockFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595725(v=vs.85).aspx&quot;&gt;WofEnumEntries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595726(v=vs.85).aspx&quot;&gt;WofEnumEntryProc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595727(v=vs.85).aspx&quot;&gt;WofEnumFilesProc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595728(v=vs.85).aspx&quot;&gt;WofFileEnumFiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595729(v=vs.85).aspx&quot;&gt;WofGetDriverVersion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595730(v=vs.85).aspx&quot;&gt;WofIsExternalFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595731(v=vs.85).aspx&quot;&gt;WofSetFileDataLocation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595732(v=vs.85).aspx&quot;&gt;WofShouldCompressBinaries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595733(v=vs.85).aspx&quot;&gt;WofWimAddEntry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595734(v=vs.85).aspx&quot;&gt;WofWimEnumFiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595735(v=vs.85).aspx&quot;&gt;WofWimRemoveEntry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595736(v=vs.85).aspx&quot;&gt;WofWimSuspendEntry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595737(v=vs.85).aspx&quot;&gt;WofWimUpdateEntry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365743(v=vs.85).aspx&quot;&gt;Wow64DisableWow64FsRedirection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365744(v=vs.85).aspx&quot;&gt;Wow64EnableWow64FsRedirection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365745(v=vs.85).aspx&quot;&gt;Wow64RevertWow64FsRedirection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365746(v=vs.85).aspx&quot;&gt;WriteEncryptedFileRaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365747(v=vs.85).aspx&quot;&gt;WriteFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365748(v=vs.85).aspx&quot;&gt;WriteFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365749(v=vs.85).aspx&quot;&gt;WriteFileGather&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
將檔案操作的 API 進行分類整理，可以分成下列幾類：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;與檔案 I/O 有關的操作&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363791(v=vs.85).aspx&quot;&gt;CancelIo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363792(v=vs.85).aspx&quot;&gt;CancelIoEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363794(v=vs.85).aspx&quot;&gt;CancelSynchronousIo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363807(v=vs.85).aspx&quot;&gt;CheckNameLegalDOS8Dot3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364439(v=vs.85).aspx&quot;&gt;FlushFileBuffers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364986(v=vs.85).aspx&quot;&gt;GetQueuedCompletionStatus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364988(v=vs.85).aspx&quot;&gt;GetQueuedCompletionStatusEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365202(v=vs.85).aspx&quot;&gt;LockFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx&quot;&gt;LockFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365458(v=vs.85).aspx&quot;&gt;PostQueuedCompletionStatus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx&quot;&gt;ReadFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365468(v=vs.85).aspx&quot;&gt;ReadFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365469(v=vs.85).aspx&quot;&gt;ReadFileScatter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365531(v=vs.85).aspx&quot;&gt;SetEndOfFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365538(v=vs.85).aspx&quot;&gt;SetFileCompletionNotificationModes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365540(v=vs.85).aspx&quot;&gt;SetFileIoOverlappedRange&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365541(v=vs.85).aspx&quot;&gt;SetFilePointer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365542(v=vs.85).aspx&quot;&gt;SetFilePointerEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365715(v=vs.85).aspx&quot;&gt;UnlockFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365716(v=vs.85).aspx&quot;&gt;UnlockFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365747(v=vs.85).aspx&quot;&gt;WriteFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365748(v=vs.85).aspx&quot;&gt;WriteFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365749(v=vs.85).aspx&quot;&gt;WriteFileGather&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;使用在加密的檔案系統上 &lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363770(v=vs.85).aspx&quot;&gt;AddUsersToEncryptedFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363839(v=vs.85).aspx&quot;&gt;CloseEncryptedFileRaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363903(v=vs.85).aspx&quot;&gt;DecryptFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364011(v=vs.85).aspx&quot;&gt;DuplicateEncryptionInfoFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364021(v=vs.85).aspx&quot;&gt;EncryptFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364023(v=vs.85).aspx&quot;&gt;EncryptionDisable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364051(v=vs.85).aspx&quot;&gt;FileEncryptionStatus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364553(v=vs.85).aspx&quot;&gt;FreeEncryptionCertificateHashList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365429(v=vs.85).aspx&quot;&gt;OpenEncryptedFileRaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365463(v=vs.85).aspx&quot;&gt;QueryRecoveryAgentsOnEncryptedFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365464(v=vs.85).aspx&quot;&gt;QueryUsersOnEncryptedFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365466(v=vs.85).aspx&quot;&gt;ReadEncryptedFileRaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365495(v=vs.85).aspx&quot;&gt;RemoveUsersFromEncryptedFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365549(v=vs.85).aspx&quot;&gt;SetUserFileEncryptionKey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365746(v=vs.85).aspx&quot;&gt;WriteEncryptedFileRaw&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;檔案系統重導 (Redirector)
&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365743(v=vs.85).aspx&quot;&gt;Wow64DisableWow64FsRedirection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365744(v=vs.85).aspx&quot;&gt;Wow64EnableWow64FsRedirection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365745(v=vs.85).aspx&quot;&gt;Wow64RevertWow64FsRedirection&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;解壓縮&amp;nbsp;Lempel-Ziv 演算法壓縮的檔案&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364941(v=vs.85).aspx&quot;&gt;GetExpandedName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365221(v=vs.85).aspx&quot;&gt;LZClose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365223(v=vs.85).aspx&quot;&gt;LZCopy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365224(v=vs.85).aspx&quot;&gt;LZInit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365225(v=vs.85).aspx&quot;&gt;LZOpenFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365226(v=vs.85).aspx&quot;&gt;LZRead&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365227(v=vs.85).aspx&quot;&gt;LZSeek&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;回呼 (callback) 函式&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/hh449407(v=vs.85).aspx&quot;&gt;CopyFile2ProgressRoutine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363854(v=vs.85).aspx&quot;&gt;CopyProgressRoutine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364043(v=vs.85).aspx&quot;&gt;ExportCallback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364052(v=vs.85).aspx&quot;&gt;FileIOCompletionRoutine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365148(v=vs.85).aspx&quot;&gt;ImportCallback&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;輔助操作&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363781(v=vs.85).aspx&quot;&gt;AreFileApisANSI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364819(v=vs.85).aspx&quot;&gt;GetBinaryType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364930(v=vs.85).aspx&quot;&gt;GetCompressedFileSize&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364933(v=vs.85).aspx&quot;&gt;GetCompressedFileSizeTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364951(v=vs.85).aspx&quot;&gt;GetFileBandwidthReservation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364955(v=vs.85).aspx&quot;&gt;GetFileSize&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364957(v=vs.85).aspx&quot;&gt;GetFileSizeEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364960(v=vs.85).aspx&quot;&gt;GetFileType&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx&quot;&gt;GetFinalPathNameByHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364963(v=vs.85).aspx&quot;&gt;GetFullPathName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364966(v=vs.85).aspx&quot;&gt;GetFullPathNameTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364980(v=vs.85).aspx&quot;&gt;GetLongPathName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364982(v=vs.85).aspx&quot;&gt;GetLongPathNameTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364989(v=vs.85).aspx&quot;&gt;GetShortPathName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364991(v=vs.85).aspx&quot;&gt;GetTempFileName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364992(v=vs.85).aspx&quot;&gt;GetTempPath&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365527(v=vs.85).aspx&quot;&gt;SearchPath&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365533(v=vs.85).aspx&quot;&gt;SetFileApisToANSI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365534(v=vs.85).aspx&quot;&gt;SetFileApisToOEM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365537(v=vs.85).aspx&quot;&gt;SetFileBandwidthReservation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365543(v=vs.85).aspx&quot;&gt;SetFileShortName&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365544(v=vs.85).aspx&quot;&gt;SetFileValidData&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/dd266735(v=vs.85).aspx&quot;&gt;SetSearchPathMode&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;檔案基本操作&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363851(v=vs.85).aspx&quot;&gt;CopyFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/hh449404(v=vs.85).aspx&quot;&gt;CopyFile2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363852(v=vs.85).aspx&quot;&gt;CopyFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363853(v=vs.85).aspx&quot;&gt;CopyFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363862(v=vs.85).aspx&quot;&gt;CreateIoCompletionPort&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx&quot;&gt;CreateFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/hh449422(v=vs.85).aspx&quot;&gt;CreateFile2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363859(v=vs.85).aspx&quot;&gt;CreateFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363860(v=vs.85).aspx&quot;&gt;CreateHardLink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363861(v=vs.85).aspx&quot;&gt;CreateHardLinkTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363866(v=vs.85).aspx&quot;&gt;CreateSymbolicLink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363867(v=vs.85).aspx&quot;&gt;CreateSymbolicLinkTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363915(v=vs.85).aspx&quot;&gt;DeleteFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363916(v=vs.85).aspx&quot;&gt;DeleteFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364944(v=vs.85).aspx&quot;&gt;GetFileAttributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364946(v=vs.85).aspx&quot;&gt;GetFileAttributesEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364949(v=vs.85).aspx&quot;&gt;GetFileAttributesTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364952(v=vs.85).aspx&quot;&gt;GetFileInformationByHandle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364953(v=vs.85).aspx&quot;&gt;GetFileInformationByHandleEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365239(v=vs.85).aspx&quot;&gt;MoveFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365240(v=vs.85).aspx&quot;&gt;MoveFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365241(v=vs.85).aspx&quot;&gt;MoveFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365242(v=vs.85).aspx&quot;&gt;MoveFileWithProgress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365430(v=vs.85).aspx&quot;&gt;OpenFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365432(v=vs.85).aspx&quot;&gt;OpenFileById&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365497(v=vs.85).aspx&quot;&gt;ReOpenFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365512(v=vs.85).aspx&quot;&gt;ReplaceFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365535(v=vs.85).aspx&quot;&gt;SetFileAttributes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365536(v=vs.85).aspx&quot;&gt;SetFileAttributesTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365539(v=vs.85).aspx&quot;&gt;SetFileInformationByHandle&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;檔案搜尋&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364413(v=vs.85).aspx&quot;&gt;FindClose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx&quot;&gt;FindFirstFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364419(v=vs.85).aspx&quot;&gt;FindFirstFileEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364420(v=vs.85).aspx&quot;&gt;FindFirstFileNameTransactedW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364421(v=vs.85).aspx&quot;&gt;FindFirstFileNameW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364422(v=vs.85).aspx&quot;&gt;FindFirstFileTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364423(v=vs.85).aspx&quot;&gt;FindFirstStreamTransactedW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364424(v=vs.85).aspx&quot;&gt;FindFirstStreamW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364428(v=vs.85).aspx&quot;&gt;FindNextFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364429(v=vs.85).aspx&quot;&gt;FindNextFileNameW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364430(v=vs.85).aspx&quot;&gt;FindNextStreamW&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Wof (Windows Overlay File System)&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595725(v=vs.85).aspx&quot;&gt;WofEnumEntries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595726(v=vs.85).aspx&quot;&gt;WofEnumEntryProc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595727(v=vs.85).aspx&quot;&gt;WofEnumFilesProc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595728(v=vs.85).aspx&quot;&gt;WofFileEnumFiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595729(v=vs.85).aspx&quot;&gt;WofGetDriverVersion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595730(v=vs.85).aspx&quot;&gt;WofIsExternalFile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595731(v=vs.85).aspx&quot;&gt;WofSetFileDataLocation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595732(v=vs.85).aspx&quot;&gt;WofShouldCompressBinaries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595733(v=vs.85).aspx&quot;&gt;WofWimAddEntry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595734(v=vs.85).aspx&quot;&gt;WofWimEnumFiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595735(v=vs.85).aspx&quot;&gt;WofWimRemoveEntry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595736(v=vs.85).aspx&quot;&gt;WofWimSuspendEntry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/mt595737(v=vs.85).aspx&quot;&gt;WofWimUpdateEntry&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ul&gt;
說到檔案 API 也不能不談到目錄 (directory) 操作的 API ，目前總共有 11 個，依序字母開頭排序如下：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363855(v=vs.85).aspx&quot;&gt;CreateDirectory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363856(v=vs.85).aspx&quot;&gt;CreateDirectoryEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363857(v=vs.85).aspx&quot;&gt;CreateDirectoryTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364414(v=vs.85).aspx&quot;&gt;FindCloseChangeNotification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364417(v=vs.85).aspx&quot;&gt;FindFirstChangeNotification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364427(v=vs.85).aspx&quot;&gt;FindNextChangeNotification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364934(v=vs.85).aspx&quot;&gt;GetCurrentDirectory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx&quot;&gt;ReadDirectoryChangesW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365488(v=vs.85).aspx&quot;&gt;RemoveDirectory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365490(v=vs.85).aspx&quot;&gt;RemoveDirectoryTransacted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365530(v=vs.85).aspx&quot;&gt;SetCurrentDirectory&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
將目錄操作的 API 進行分類整理，我們可以分成下列 4 類&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;建立目錄&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363855(v=vs.85).aspx&quot;&gt;CreateDirectory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363856(v=vs.85).aspx&quot;&gt;CreateDirectoryEx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363857(v=vs.85).aspx&quot;&gt;CreateDirectoryTransacted&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;變更通知&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364414(v=vs.85).aspx&quot;&gt;FindCloseChangeNotification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364417(v=vs.85).aspx&quot;&gt;FindFirstChangeNotification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364427(v=vs.85).aspx&quot;&gt;FindNextChangeNotification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx&quot;&gt;ReadDirectoryChangesW&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;當前目錄&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364934(v=vs.85).aspx&quot;&gt;GetCurrentDirectory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365530(v=vs.85).aspx&quot;&gt;SetCurrentDirectory&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;刪除目錄&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365488(v=vs.85).aspx&quot;&gt;RemoveDirectory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa365490(v=vs.85).aspx&quot;&gt;RemoveDirectoryTransacted&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ul&gt;
參考資料：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;File Management Functions&lt;br /&gt;
&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364232(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/windows/desktop/aa364232(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Directory Management Functions&lt;br /&gt;
&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363950(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363950(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/4632648550261987790/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2016/08/windows-file-api.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4632648550261987790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4632648550261987790'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2016/08/windows-file-api.html' title='Windows File API'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-2986365625130205657</id><published>2016-07-11T01:18:00.000+08:00</published><updated>2017-03-31T10:29:56.440+08:00</updated><title type='text'>WiX toolset</title><content type='html'>WiX 是&amp;nbsp;Windows Installer XML 的縮寫，WiX 顧名思義是「Windows 安裝程式的 XML 語言」，除此之外， WiX 提供一系列命令列工具程式，因此稱為「WiX 工具集 (toolset)」。我們使用 WiX toolset 可以做出專業的 Windows 安裝程式來部署我們的產品，重點是 WiX toolset 是免費和開源的軟體，另外 WiX toolset 和 Visual Studio 與 MSBuild 高度整合，支援 IntelliSense 和專案方式的操作，讓開發上更是方便。現在 WiX toolset 的版本是 3.10，大約是每年會發佈一次，目前這個專案已經是&amp;nbsp;&lt;a href=&quot;http://robmensching.com/blog/posts/2016/5/4/wix-toolset-joins-the-.net-foundation/&quot; target=&quot;_blank&quot;&gt;.NET Foundation 的其中一個專案&lt;/a&gt;了。&lt;br /&gt;
&lt;br /&gt;
在開始使用 WiX toolset &amp;nbsp;之前，必須先&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa367449(v=vs.85).aspx&quot; target=&quot;_blank&quot;&gt;瞭解&amp;nbsp;Microsoft Windows Installer&lt;/a&gt;&amp;nbsp;相關的基礎知識，因為 WiX toolset 是基於 Windows Installer 技術所開發出來的工具，XML 標籤的組織方式也是依據 Windows Installer 的概念。Windows Installer 是 Windows 作業系統提供的安裝 (installation) 和配置 (configuration) 服務，目前最新的版本是&amp;nbsp;Windows Installer 5.0。&lt;br /&gt;
&lt;br /&gt;
我們透過安裝包 (installation package) 部署產品 (product) 或應用程式 (application)，安裝上最重要的概念是「&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa372830(v=vs.85).aspx&quot; target=&quot;_blank&quot;&gt;元件 (Components)&lt;/a&gt;」和「&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa372840(v=vs.85).aspx&quot; target=&quot;_blank&quot;&gt;功能 (Features)&lt;/a&gt;」。一個產品包含一至多個功能，功能之間可以是階層關係 (父功能和子功能 )，而一個功能則由一至多個元件所組成&amp;nbsp;，注意到一個元件可能屬於多個功能之中。功能是從使用者的觀點來看，而元件則是從程式設計的觀點來看，使用者通常不會察覺到元件，當使用者選擇安裝的功能後，Installer 會自動安裝相關的元件。因此在打造一個安裝包的過程中，我們必須決定如何組織元件和功能之間的關係。&lt;br /&gt;
&lt;br /&gt;
WiX toolset 是編譯式的工具，需要將 XML 的原始碼透過編譯和連結才能產生 Windows 的安裝包，以下介紹相關的檔案類型和工具。&lt;br /&gt;
&lt;h2&gt;
WiX 工具&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;candle.exe&lt;br /&gt;
前處理器 (preprocessor) 和編譯器 (compiler)，將 XML 的原始碼檔案 (.wxs) 編譯成物件檔 (.wixobj)。&lt;/li&gt;
&lt;li&gt;light.exe&lt;br /&gt;
連結器 (linker)，將一至多個物件檔連結成&amp;nbsp;Windows&amp;nbsp;Installer&amp;nbsp;資料庫 (.msi 或 .msm)。&lt;/li&gt;
&lt;li&gt;lit.exe&lt;br /&gt;
用來將多個物件檔變成程式庫 (.wixlib) 以提供 light 連結器使用。&lt;/li&gt;
&lt;li&gt;dark.exe&lt;br /&gt;
將&amp;nbsp;Windows&amp;nbsp;Installer&amp;nbsp;資料庫轉換成原始碼檔案 (.wxs)。&lt;/li&gt;
&lt;li&gt;heat.exe&lt;br /&gt;
將目錄、檔案或專案「收割 (harvest) 」成原始碼檔案 (.wxs)。&lt;/li&gt;
&lt;li&gt;insignia.exe&lt;br /&gt;
數位簽章的工具&lt;/li&gt;
&lt;li&gt;melt.exe&lt;br /&gt;
將&amp;nbsp;.msm&amp;nbsp;換成原始碼檔案 (.wxs) 的元件群組。&lt;/li&gt;
&lt;li&gt;torch.exe&lt;br /&gt;
執行 diff 差異產生.wixmst 或 .mst 檔案。&lt;/li&gt;
&lt;li&gt;smoke.exe&lt;br /&gt;
執行&amp;nbsp;.msi 或 .msm 的確認驗證。&lt;/li&gt;
&lt;li&gt;pyro.exe&lt;br /&gt;
將 .wixmsp 和 wixmst 產生補丁 (patch) 安裝檔。&lt;/li&gt;
&lt;li&gt;WixCop.exe&lt;br /&gt;
原始碼檔案的 schema 升級與格式化。&lt;/li&gt;
&lt;li&gt;WixUnit.exe&lt;br /&gt;
驗證 XML 檔案和輸出檔案。&lt;/li&gt;
&lt;li&gt;lux.exe&lt;br /&gt;
Wix 的擴充套件，用來做資料驅動的單元測試。&lt;/li&gt;
&lt;li&gt;nit.exe&lt;br /&gt;
執行 lux 的單元測試。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
WiX 檔案類型&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;WiX Include File (.wxi)&lt;br /&gt;類似 C++ &amp;nbsp;語言的標頭檔，這是一個 XML 檔案，根元素是&amp;nbsp;&lt;a href=&quot;http://wixtoolset.org/documentation/manual/v3/xsd/wix/include.html&quot; target=&quot;_blank&quot;&gt;&amp;lt;Include&amp;gt;&lt;/a&gt;。這個檔案是用來被被引入到其他原始碼檔案中。&lt;/li&gt;
&lt;li&gt;WiX Localization File (.wxl)&lt;br /&gt;語言本地化的檔案，根元素是&amp;nbsp;&lt;a href=&quot;http://wixtoolset.org/documentation/manual/v3/xsd/wixloc/wixlocalization.html&quot; target=&quot;_blank&quot;&gt;&amp;lt;WixLocalization&amp;gt;&lt;/a&gt;，這個檔案是用來翻譯顯示的文字。&lt;/li&gt;
&lt;li&gt;WiX Source File (.wxs)&lt;br /&gt;WiX toolset 的原始碼檔案，最重要的一個檔案，根元素是&amp;nbsp;&lt;a href=&quot;http://wixtoolset.org/documentation/manual/v3/xsd/wix/wix.html&quot; target=&quot;_blank&quot;&gt;&amp;lt;Wix&amp;gt;&lt;/a&gt;，用來定義安裝包的行為。&lt;/li&gt;
&lt;li&gt;WiX Object File (.wixobj)&lt;br /&gt;candle.exe 編譯原始碼檔案產生的物件檔。&lt;/li&gt;
&lt;li&gt;WiX XML Output File (.wixout)&lt;br /&gt;light.exe 連結各物件檔產生的輸出檔案。&lt;/li&gt;
&lt;li&gt;WiX Library File (.wixlib)&lt;br /&gt;程式庫檔案，在多個 WiX 專案中共用程式碼。&lt;/li&gt;
&lt;li&gt;WiX Debug File (.wixpdb)&lt;br /&gt;由連結器產生的檔案，用來除錯。&lt;/li&gt;
&lt;li&gt;WiX XML Patch File (.wixmsp)&lt;br /&gt;在補丁專案中連結各物件檔產生的輸出檔案。&lt;/li&gt;
&lt;li&gt;WiX Transform File (.wixmst)&lt;br /&gt;用來表示輸出檔之間的差異&lt;/li&gt;
&lt;li&gt;Windows Installer Installation Package (.msi)&lt;br /&gt;安裝包檔案，Windows Installer&amp;nbsp;最基本的安裝單位。&lt;/li&gt;
&lt;li&gt;Windows Installer Merge Module (.msm)&lt;br /&gt;模組合併檔，用來在多個.msi 檔案之間共用安裝邏輯。&lt;/li&gt;
&lt;li&gt;Windows Installer Transform (.mst)&lt;br /&gt;用來在 .msi 檔案上套用變更。&lt;/li&gt;
&lt;li&gt;Windows Installer Patch Creation Process (.pcp)&lt;br /&gt;使用 Windows Installer SDK 用來建置補丁的輸入檔。&lt;/li&gt;
&lt;/ul&gt;
上述介紹這些可能還不是很清楚，最快認識的方式是自己用 WiX toolset 建置一個 Windows 安裝程式，如果你已經有現成的 Visual Studio 專案，建議先參考「&lt;a href=&quot;http://wixtoolset.org/documentation/manual/v3/votive/authoring_first_votive_project.html&quot; target=&quot;_blank&quot;&gt;Creating a Simple Setup&lt;/a&gt;&amp;nbsp;」這篇文章將專案做成一個安裝程式。&lt;br /&gt;
&lt;br /&gt;
參考資料：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;WiX Toolset v3.x reference manual&lt;br /&gt;
&lt;a href=&quot;http://wixtoolset.org/documentation/manual/v3/&quot;&gt;http://wixtoolset.org/documentation/manual/v3/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Creating a Simple Setup &lt;br /&gt;
&lt;a href=&quot;http://wixtoolset.org/documentation/manual/v3/votive/authoring_first_votive_project.html&quot;&gt;http://wixtoolset.org/documentation/manual/v3/votive/authoring_first_votive_project.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;List of Tools&lt;br /&gt;
&lt;a href=&quot;http://wixtoolset.org/documentation/manual/v3/overview/alltools.html&quot;&gt;http://wixtoolset.org/documentation/manual/v3/overview/alltools.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WiX Tutorial&lt;br /&gt;&lt;a href=&quot;https://www.firegiant.com/wix/tutorial/&quot;&gt;https://www.firegiant.com/wix/tutorial/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Windows Installer&lt;br /&gt;
&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/cc185688(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/cc185688(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Property Reference
&lt;br /&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/aa370905(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/aa370905(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/2986365625130205657/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2016/07/wix-toolset.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/2986365625130205657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/2986365625130205657'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2016/07/wix-toolset.html' title='WiX toolset'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-1037541438458438105</id><published>2016-06-18T00:32:00.001+08:00</published><updated>2016-06-25T08:39:30.368+08:00</updated><title type='text'>A Curious Mind 好奇心</title><content type='html'>「我沒有特殊才能，只有強烈的好奇心。」艾伯特‧愛因斯坦 (Alvert Einstein)&lt;br /&gt;
&lt;br /&gt;
這篇是記錄「&lt;a href=&quot;http://www.cite.com.tw/book?id=59282&quot; target=&quot;_blank&quot;&gt;好奇心：生命不在於找答案，而是問問題&lt;/a&gt;」的重點整理。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuSCrUh6MGFtHoSmb0s9phaxw21sEudlswxnNFcjemxqW15a9aG16jeEoTZI9dhyx7TVpSXZdH-_m9Yd8cH9N3dASGnXsTe138s_E2vTZJIvVj6J8pf6jLvAONGZN7pV3xRlojR9k3R1w/s640/DSC00646.JPG&quot; width=&quot;480&quot; /&gt;&lt;/div&gt;
布萊恩‧葛瑟 (Brian Grazer), 查爾斯‧費希曼 (Charles Fishman) 著，李宜懃，&lt;i&gt;&lt;a href=&quot;http://www.cite.com.tw/book?id=59282&quot; target=&quot;_blank&quot;&gt;好奇心：生命不在於找答案，而是問問題&lt;/a&gt;&lt;/i&gt;，台北市：商周出版：城邦文化發行，2015.08。&lt;br /&gt;
譯自：&lt;a href=&quot;http://books.simonandschuster.com/A-Curious-Mind/Brian-Grazer/9781476730752&quot; target=&quot;_blank&quot;&gt;A Curious Mind: The Secret to a Bigger Life&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
作者葛瑟先生寫這本書有三個目的 (p.22)：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;喚起你重視好奇心的價值和力量。&lt;/li&gt;
&lt;li&gt;分享自己運用好奇心的方式，希望這些經驗能激勵你嘗試在日常生活中身體力行。&lt;/li&gt;
&lt;li&gt;拋磚引玉提醒所有人，為何如此重要的特質在今天仍不受重視，沒有得到適當的教導和啟發。&lt;/li&gt;
&lt;/ol&gt;
以下記錄書上的一些重點整理：&lt;br /&gt;
&lt;br /&gt;
1　無藥可解的好奇心&lt;br /&gt;
&lt;ul&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;
&lt;li&gt;葛瑟先生運用好奇心最重要的方式：用好奇心來說故事，其實這也是他的職業。&lt;/li&gt;
&lt;li&gt;故事是否新奇，端看說故事的人所切入的角度。&lt;/li&gt;
&lt;/ul&gt;
2　警察局長、電影大亨和氫彈之父：從其他人的角度思考&lt;br /&gt;
&lt;ul&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;
&lt;li&gt;出於好奇心而提出問題會鼓勵對方參與，運用好奇心顛覆自己的觀點往往相當值得，縱使結果不如預期。&lt;/li&gt;
&lt;/ul&gt;
3　好奇心是好故事的關鍵要素&lt;br /&gt;
&lt;ul&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;
&lt;li&gt;我們透過故事學習這個世界，了解其他人和他們腦中的想法，以及這些想法與我們之間的差異。&lt;/li&gt;
&lt;li&gt;禮貌 (manners) 是你想要表現出來的方式、想要給人的感受。禮儀 (etiquette) 則是利用一些細節，以優雅和窩心的方式讓人感受到溫暖。&lt;/li&gt;
&lt;/ul&gt;
4　好奇心給你超級英雄般的力量&lt;br /&gt;
&lt;ul&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;
&lt;li&gt;提出問題並不會讓你偏離軌道或分心，反而能讓你步上正軌。 &lt;/li&gt;
&lt;li&gt;「一天中最難打的電話要先打」。它強調的是一種勇氣，一種個性，就算你百般不願意，也要確實面對必須做的任務，然後動手處理。&lt;/li&gt;
&lt;li&gt;好奇心比勇氣更能戰勝恐懼；事實上，單憑生理上的勇氣原本可以避開危險，卻因好奇心而讓許多人置身險境。飢餓、愛和好奇是生命中偉大的動力。&lt;/li&gt;
&lt;/ul&gt;
5　每次交談都是好奇心對話&lt;br /&gt;
&lt;ul&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;
&lt;li&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;如果是人們自己先提出問題，就比較願意接納對方給的建議或單純的指示。&lt;/li&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;
&lt;/ul&gt;
6　好品味，以及適時收起好奇心的力量&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;如果我們不能抱持懷疑的態度提出問題，質問那些告訴我們某件事為真的人，則很容易落入下一個政治或宗教騙子設下的圈套。&lt;/li&gt;
&lt;li&gt;品味是在一個框架下，根據你的判斷結果而產生的想法，品味會為你的判斷結果提供信心，品味會讓你更有自信，因為你對喜歡的東西更加了解，你知道什麼是好的，什麼是不好的。&lt;/li&gt;
&lt;li&gt;養成不斷提出問題的習慣、提醒自己問問題帶來的價值，以及我們問問題的權利。&lt;/li&gt;
&lt;/ul&gt;
7　好奇心的黃金時代&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;好奇心並沒有激發出太多大家對其本身的好奇，我們對各式各樣的事情感到好奇，唯獨漏了好奇心這個概念。&lt;/li&gt;
&lt;li&gt;十七、十八世紀的科學家之所以不同凡響，其中一個主因是他們提出了一些從沒有人問過的問題。
&lt;/li&gt;
&lt;li&gt;因好奇心而提出問題不只是理解世界的一種方式，也是改變世界的一種方式。掌握權力的人一直都知道這個道理，從舊約聖經、希臘羅馬神話可見一斑。&lt;/li&gt;
&lt;li&gt;每個人都必須小心，網路會麻醉我們，而非激勵我們。下面兩件事你無法在網路上找到：一、如果這些問題從沒有人問過，你就搜尋不到答案。二、你無法透過 Google 搜尋新點子。網路只能告訴我們已知的事情。&lt;/li&gt;
&lt;li&gt;你知道的愈多，可以做的就愈多。&lt;/li&gt;
&lt;li&gt;好奇心是一種心態。更具體地說，是心胸要開闊，好奇心是一種接收能力。&lt;/li&gt;
&lt;/ul&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/1037541438458438105/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2016/06/a-curious-mind.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1037541438458438105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1037541438458438105'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2016/06/a-curious-mind.html' title='A Curious Mind 好奇心'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuSCrUh6MGFtHoSmb0s9phaxw21sEudlswxnNFcjemxqW15a9aG16jeEoTZI9dhyx7TVpSXZdH-_m9Yd8cH9N3dASGnXsTe138s_E2vTZJIvVj6J8pf6jLvAONGZN7pV3xRlojR9k3R1w/s72-c/DSC00646.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-3275143315236114456</id><published>2016-05-16T18:05:00.003+08:00</published><updated>2016-05-16T18:09:27.159+08:00</updated><title type='text'>Clean Code 無瑕的程式碼</title><content type='html'>這篇是記錄「無瑕的程式碼」第 1 章至第 5 章的重點整理。&lt;br /&gt;
&lt;h2&gt;
序 (Introduction)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;學習工藝典範 (craftsmanship) 可分成兩部分：知識 (knowledge) 和實作 (work)&lt;/li&gt;
&lt;li&gt;你必須獲得程式工藝師所知道的原則 (principles)、模式 (patterns)、實踐 (practices) 與啟發 (heuristics)，並且必須研磨這些知識，透過努力實作和練習，將這些知識融入你的手指、眼睛和身體裡。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
無瑕的程式碼 (Clean Code)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;撰寫機器能執行的細節需求稱為「撰寫程式 (programming)」，而這些明確描述的文字稱為「程式碼 (code)」。&lt;/li&gt;
&lt;li&gt;程式碼是最終被我們用來闡述需求的語言。 &lt;/li&gt;
&lt;li&gt;急於讓產品上市，導致程式碼變得一團糟，當開始加入越來越多的產品功能時，程式碼就變得越來越糟，一直到再也無法管理這團混亂。劣質的程式碼可能導致一家公司的倒閉。&lt;/li&gt;
&lt;li&gt;勒布朗克法則 (LeBlanc&#39;s Law)：待會兒等於永不。&lt;/li&gt;
&lt;li&gt;花時間保持程式碼的整潔，並不只關係到成本的效益，還關乎到專業職場的生存之道。&lt;/li&gt;
&lt;li&gt;錯並不在這些事物上，而是在我們本身，我們不夠專業。&lt;/li&gt;
&lt;li&gt;你製造了爛的程式並不會因此趕上截止期限，事實上，爛程式只會馬上讓你的開發速度變得更慢，並導致你錯過截止期限。在截止期限前完成工作的唯一方法，也是讓開發速度變快的唯一方法，就是隨時隨地，都確保程式碼盡可能的整齊潔淨。&lt;/li&gt;
&lt;li&gt;能夠分辨程式碼的好壞，不代表知道如何寫出 Clean Code。「程式感 (code-sense)」是能寫出 Clean Code 的關鍵因素。&lt;/li&gt;
&lt;li&gt;沒有辦法先不讀程式就先去寫程式，所以讓程式碼更容易閱讀，也會讓程式碼變得更容易撰寫。&lt;/li&gt;
&lt;li&gt;光是把程式碼寫好還不夠，程式碼還必須持續地保持整潔。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
有意義的命名 (Meaningful Names)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;選一個好的名稱是相當花時間，但省下來的時間比花掉的時間還多。 &lt;/li&gt;
&lt;li&gt;問題不在於程式碼的簡易度，而在於程式碼的隱含性 (implicity)：即程式的上下文資訊未能由程式本身明確地展現出來的程度。&lt;/li&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;
&lt;li&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;避免使用同一個字詞代表兩種不同的目的。使用同一個字詞代表兩種不一樣的想法，基本上就是雙關語，這必須避免。&lt;/li&gt;
&lt;li&gt;優先使用電腦領域的技術性名稱命名變數，其次才是使用問題領域的詞彙來命名。&lt;/li&gt;
&lt;li&gt;較短的命名若能清楚地表達涵義，通常好過於較長的名稱。盡量減少在名稱上加入不必要的上下文資訊 (context)。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
函式 (Functions)&lt;/h2&gt;
&lt;ul&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;
&lt;li&gt;我們希望程式的閱讀就像是由上而下的敘事。我們希望每個函式後面都緊接著「下一層次的抽象概念」。這是降層準則。&lt;/li&gt;
&lt;li&gt;從本質來看，switch 敘述縱是在做 N 件事情。我們無法永遠避開使用&amp;nbsp;switch 敘述，但我們能確保讓每個&amp;nbsp;switch 敘述都被深埋到較低抽象層次的類別裡，而且他永遠不會被重複使用。&lt;/li&gt;
&lt;li&gt;當每個你看到的程式，執行結果都與你想的差不多，你會察覺到你正工作在 Clean Code 之上。&lt;/li&gt;
&lt;li&gt;只要函式越簡短和越集中在做該做的事情上，就越容易替函式取個具有描述性質的名稱。&lt;/li&gt;
&lt;li&gt;函式的參數數量，最理想的是零個 (零參數函式；niladic)，其次是一個&amp;nbsp;(單參數函式；monadic)，再不然就是兩個&amp;nbsp;(雙參數函式；dyadic)。可以的話，盡量避免使用三個參數&amp;nbsp;(三參數函式；triadic)。如果要使用超過三個參數 (多參數函式；polyadic)，必須有非常特殊的理由，否則無論無論如何都不應該如此做。&lt;/li&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;
&lt;li&gt;副作用 (side effects) 就像是個謊言。你的函式保證只做一件事，卻暗地裡偷偷做了七他事情。函式必須要無副作用！&lt;/li&gt;
&lt;li&gt;函式應該要能做某件事，或能回答某個問題，但兩者不該同時發生。&lt;/li&gt;
&lt;li&gt;使用例外處理取代回傳錯誤碼。&lt;/li&gt;
&lt;li&gt;函式應該只做一件事，而錯誤處理就是一件事。所以，一個處理錯誤的函式，應該不能再做其他的事。&lt;/li&gt;
&lt;li&gt;不要重複自己 (Don&#39;t repeat yourself)，重複程式碼也許是軟體裡所有邪惡的根源。從副程式發明以來，軟體發展領域的所有創新，都是為了消除原始碼中的重複。&lt;/li&gt;
&lt;li&gt;每個系統都是由某個特定領域的語言設計而成的，而這種特定領域語言則是「程式設計師為了描述系統所設計的」。函式是這個語言裡的動詞，類別則是這個語言裡的名詞。 &lt;/li&gt;
&lt;li&gt;程式設計大師在撰寫程式時，並不認為自己是在寫程式，而是在說故事。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
註解 (Comments)&lt;/h2&gt;
&lt;ul&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;
&lt;li&gt;真正有益的註解，是你想辦法不寫它的註解。&lt;/li&gt;
&lt;li&gt;在每個原始碼檔案的開頭寫入著作權聲明及作者資訊，就是必須且合理的註解。&lt;/li&gt;
&lt;li&gt;如果你決定要寫下註解，你就應該花上必要的時間，確保你寫出來的是最好的註解。&lt;/li&gt;
&lt;li&gt;如果有一條規則是這麼說的，每個函式都必須有一個 Javadoc ，或每個變數都應該要有註解來說明，那麼這樣的規定就有夠傻的了。&lt;/li&gt;
&lt;li&gt;想儲存修改程式碼的日誌、程式碼的出處及署名、不使用的程式碼，原始碼管控系統會是一個比較好的選擇，不要使用註解來儲存這些資訊。&lt;/li&gt;
&lt;li&gt;被註解掉的程式碼，就像是一瓶壞掉的葡萄酒，在瓶底所沈澱的殘渣，直接刪掉這些程式碼吧。&lt;/li&gt;
&lt;li&gt;註解的目的在於說明無法表達本意的程式碼。如果連註解本身都需要額外的解釋，那真是一件遺憾的事。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
編排 (Formatting)&lt;/h2&gt;
&lt;ul&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;
&lt;li&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;程式裡的某些程式碼，希望能和其他程式碼盡可能地相近，因為它們在概念上有著相似的性質。當這個相似性越高時，它們之間的垂直距離就應該越短越好。&lt;/li&gt;
&lt;li&gt;我們希望函式呼叫呈現一種向下的相依性。也就是說，一個被呼叫的函式，應該要出現在「執行呼叫的函式」的下方。這也產生了一個良好的項下流程，由上往下查看原始碼時，可以依序發現高層模組，再接著找到低層模組。&lt;/li&gt;
&lt;li&gt;一行的程式碼應該有多寬呢？不需要使用捲軸捲到右方才是適當的寬度。(作者個人的寬度上限是 120 個字元)&lt;/li&gt;
&lt;li&gt;一個原始檔是個階層結構，而非大綱結構。在這個階層結構下的各個階層都是一個視野 (scope)。&lt;/li&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;
&lt;/ul&gt;
&lt;h2&gt;
參考書籍&lt;/h2&gt;
Robert C. Martin 著，戴于晉、博碩文化編譯，&lt;a href=&quot;http://www.drmaster.com.tw/bookinfo.asp?BookID=PG21219&quot; target=&quot;_blank&quot;&gt;無瑕的程式碼：敏捷軟體開發技巧守則&lt;/a&gt;，新北市：博碩文化，2013。&lt;br /&gt;
譯自：Clean Code: a handbook of agile software craftsmanship&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/3275143315236114456/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2016/05/clean-code.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/3275143315236114456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/3275143315236114456'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2016/05/clean-code.html' title='Clean Code 無瑕的程式碼'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-7173108052444751178</id><published>2016-03-27T20:07:00.000+08:00</published><updated>2016-03-27T20:07:38.537+08:00</updated><title type='text'>Upstart</title><content type='html'>&lt;a href=&quot;http://upstart.ubuntu.com/&quot; target=&quot;_blank&quot;&gt;Upstart&lt;/a&gt; 是一種 init 服務 (daemon)，init 是 Linux 上第一個執行的行程 (process)。init 系統除了 Upstart 之外，還有過去的 &lt;a href=&quot;https://en.wikipedia.org/wiki/UNIX_System_V&quot; target=&quot;_blank&quot;&gt;System V&lt;/a&gt; init (唸作 System Five, 縮寫為 SysV)，與後來發展的&amp;nbsp;&lt;a href=&quot;https://www.freedesktop.org/wiki/Software/systemd/&quot; target=&quot;_blank&quot;&gt;systemd&lt;/a&gt;&amp;nbsp;。Upstart 是 Ubuntu 為了取代 SysV init 所開發出來的系統，採用事件為基礎的設計 (event-based)，利用事件驅動的方式可以平行執行多個程式，提高開機的速度與效能。&lt;br /&gt;
&lt;br /&gt;
Upstart 有兩個重要的概念：「事件 (Events) 」與「工作 (Jobs)」&lt;br /&gt;
&lt;h2&gt;
Job&lt;/h2&gt;
Job 是一個工作的單位 (unit of work)，Upstart 有三種 Job 類型：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Task Job：程式執行一段時間就會結束， Process 有確定壽命和結束狀態，簡稱「Task」。&lt;/li&gt;
&lt;li&gt;Service Job：長時間執行的程式，通常是背景服務，簡稱「Service」。&lt;/li&gt;
&lt;li&gt;Abstract Job：不會有子行程產生，純粹僅有工作狀態。&lt;/li&gt;
&lt;/ul&gt;
每個 Job 會存在於不同的狀態，共有 11 種狀態 (State)：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;waiting：初始狀態&lt;/li&gt;
&lt;li&gt;starting：工作即將開始&lt;/li&gt;
&lt;li&gt;security：工作正在載入&amp;nbsp;AppArmor 安全政策&lt;/li&gt;
&lt;li&gt;pre-start：執行 pre-start 當中&lt;/li&gt;
&lt;li&gt;spawned：即將執行 script 或 exec&lt;/li&gt;
&lt;li&gt;post-start：執行&amp;nbsp;post-start 當中&lt;/li&gt;
&lt;li&gt;running：在&amp;nbsp;post-start 之後，表示 Job 正在執行的過渡期間狀態&lt;/li&gt;
&lt;li&gt;pre-stop：執行&amp;nbsp;pre-stop&amp;nbsp;當中&lt;/li&gt;
&lt;li&gt;stopping：在&amp;nbsp;pre-stop&amp;nbsp;之後的過渡期間狀態&lt;/li&gt;
&lt;li&gt;killed：工作即將停止&lt;/li&gt;
&lt;li&gt;post-stop：執行&amp;nbsp;post-stop&amp;nbsp;當中&lt;/li&gt;
&lt;/ul&gt;
Job 在 Upstart 系統上是定義在副檔名為 .conf 的組態檔 (Job Configuration File) 裡，檔名應該要能夠表示你所執行的應用服務。至於 Job 要如何撰寫，可以參考 &lt;a href=&quot;http://upstart.ubuntu.com/cookbook/#configuration&quot; target=&quot;_blank&quot;&gt;Upstart 文件的第6章&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
依據組態檔放置的位置不同，Job 可以區分為：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;System Job：組態檔位於&amp;nbsp;/etc/init/ 目錄中。&lt;/li&gt;
&lt;li&gt;User Job：組態檔位於使用者加目錄下的 .init/&amp;nbsp;目錄中，&lt;a href=&quot;https://launchpad.net/upstart/1.x/1.7&quot; target=&quot;_blank&quot;&gt;Upstart v1.7&lt;/a&gt;以後已經不支援。&lt;/li&gt;
&lt;li&gt;Session Job：Upstart v1.7之後才有的功能，Job 是被使用者的 Session 所啟動，組態檔有多個位置，請參考 &lt;a href=&quot;http://upstart.ubuntu.com/cookbook/#session-job&quot; target=&quot;_blank&quot;&gt;cookbook 說明&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Event&lt;/h2&gt;
Event 在 Upstart 裡是用來通知其他 Job 或 Event，Event 被發出 (emit) 後會廣播至整個 Upstart 系統，只有感興趣 (也就是有註冊對應的 Event) 的 &amp;nbsp;Job 或 Event 才會收到。&lt;br /&gt;
&lt;br /&gt;
注意到， Event 的名稱允許和 Job 的名稱是相同的。另外， Event 也可能和 Job State 的名稱相同，但是相同名稱的 Event 和 Job State 不是指同一個事情，雖然運作起來很相似 (變動狀態很像發出事件)。&lt;br /&gt;
&lt;br /&gt;
Upstart 有三種 Event 類型：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Signal Event：信號事件是非阻塞 (non-blocking)、非同步 (asynchronous) 的事件，信號事件發出後會立即回傳，允許呼叫者繼續執行其他工作。&lt;/li&gt;
&lt;li&gt;Method Event：方法事件是阻塞 (blocking)、同步 (synchronous) 的事件，方法事件如同程式設計的 function 功能，呼叫者發出後必須等待方法事件執行完畢，若有問題發生將回傳錯誤資訊。&lt;/li&gt;
&lt;li&gt;Hook Event：掛勾事件與方法事件類似，是阻塞、同步的事件類型，只是用途不太相同，當作旗標 (flag) 的功能通知其他&amp;nbsp;&amp;nbsp;Job 或 Event，確定所有接收者都執行完畢才繼續。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h2&gt;
操作&lt;/h2&gt;
在 Ubuntu 上和 Upstart 溝通與互動，有下列幾個程式可使用，詳細指令請參考連結的內容：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;init - Upstart process management daemon&lt;br /&gt;
&lt;a href=&quot;http://manpages.ubuntu.com/manpages/trusty/en/man8/init.8.html&quot;&gt;http://manpages.ubuntu.com/manpages/trusty/en/man8/init.8.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;initctl - init daemon control tool&lt;br /&gt;
&lt;a href=&quot;http://manpages.ubuntu.com/manpages/trusty/en/man8/initctl.8.html&quot;&gt;http://manpages.ubuntu.com/manpages/trusty/en/man8/initctl.8.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;runlevel - output previous and current runlevel&lt;br /&gt;
&lt;a href=&quot;http://manpages.ubuntu.com/manpages/trusty/en/man8/runlevel.8.html&quot;&gt;http://manpages.ubuntu.com/manpages/trusty/en/man8/runlevel.8.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;telinit - change system runlevel&lt;br /&gt;
&lt;a href=&quot;http://manpages.ubuntu.com/manpages/trusty/en/man8/telinit.8.html&quot;&gt;http://manpages.ubuntu.com/manpages/trusty/en/man8/telinit.8.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
參考資料：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Chapter 3. The system initialization&lt;br /&gt;
&lt;a href=&quot;https://www.debian.org/doc/manuals/debian-reference/ch03.en.html&quot;&gt;https://www.debian.org/doc/manuals/debian-reference/ch03.en.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Debate/initsystem - Debian Wiki &lt;br /&gt;
&lt;a href=&quot;https://wiki.debian.org/Debate/initsystem/&quot;&gt;https://wiki.debian.org/Debate/initsystem/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Upstart Intro, Cookbook and Best Practises&lt;br /&gt;
&lt;a href=&quot;http://upstart.ubuntu.com/cookbook/&quot;&gt;http://upstart.ubuntu.com/cookbook/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ubuntu Manpage: upstart-events - Well-known Upstart events summary&lt;br /&gt;
&lt;a href=&quot;http://manpages.ubuntu.com/manpages/trusty/en/man7/upstart-events.7.html&quot;&gt;http://manpages.ubuntu.com/manpages/trusty/en/man7/upstart-events.7.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ubuntu Manpage: runlevel - event signalling change of system runlevel&lt;br /&gt;
&lt;a href=&quot;http://manpages.ubuntu.com/manpages/trusty/en/man7/runlevel.7.html&quot;&gt;http://manpages.ubuntu.com/manpages/trusty/en/man7/runlevel.7.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/7173108052444751178/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2016/03/upstart.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/7173108052444751178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/7173108052444751178'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2016/03/upstart.html' title='Upstart'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-4215952800931415624</id><published>2016-03-07T15:30:00.001+08:00</published><updated>2017-03-03T09:50:43.119+08:00</updated><title type='text'>Data Storage 資料儲存</title><content type='html'>&lt;div&gt;
資料儲存由下至上分別是磁碟 (Disk)、磁碟區 (Volume) 與檔案系統 (File System)，從作業系統的角度來看都是存放裝置 (Storage) 組成。以下分別說明相關詞彙。&lt;br /&gt;
&lt;h2&gt;
Disk: 磁碟&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;磁盤 (Platter)：一個至多個磁盤組成一個磁碟。&lt;/li&gt;
&lt;li&gt;磁頭 (Head)：一個磁盤有兩面，每一面有一個磁頭，也就是一個磁盤有2個磁頭。&lt;/li&gt;
&lt;li&gt;磁軌 (Track)：磁盤上同心圓定義為磁軌，一面磁盤上有多個磁軌。&lt;/li&gt;
&lt;li&gt;磁柱 (Cylinder)：各磁盤上相同位置的磁軌。&lt;/li&gt;
&lt;li&gt;磁區 (Sector)：磁碟上可定位的最小單位，也就是資料最小的儲存單位。大小通常是 512 bytes，現在改為 4096 bytes (4KiB) 的大小 (稱為 4K 磁區)。另外，CD-ROM 的磁區通常是 2048 bytes。&lt;/li&gt;
&lt;li&gt;磁碟分割(Partition)：磁碟在邏輯上可以分割成不同的區域，讓一個磁碟「看起來」好像有多個磁碟。一個磁碟至少有一至多個磁碟分割。&lt;/li&gt;
&lt;li&gt;主要開機紀錄&amp;nbsp;(Master Boot Record, MBR) ：用來記錄磁碟分割的狀態，位於&amp;nbsp;Disk&amp;nbsp;上的第一個磁區，包含開機程式碼 (boot code) 與磁碟分割表 (Partition Table)。&lt;/li&gt;
&lt;li&gt;GUID 磁碟分割表 &amp;nbsp;(GUID Partition Table)：另一種用來記錄磁碟分割狀態的格式。&lt;/li&gt;
&lt;li&gt;開機磁區 (Boot Sector)：可開機 Partition&amp;nbsp;上的第一個磁區。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h2&gt;
Volume: 磁碟區&lt;/h2&gt;
在邏輯上 (注意是邏輯上而不是實體上)，可建立檔案系統的最小單位。Partition&amp;nbsp;不等於 Volume，透過操作可以將多個 Partition 組成一個 Volume，例如 Logical Volume Management (LVM) 、Redundant Array of Independent Disks (RAID) 技術。&lt;br /&gt;
&lt;h2&gt;
File System: 檔案系統&lt;/h2&gt;
檔案系統的基本功能是決定檔案如何命名、儲存和組織。&lt;br /&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;區塊 (Block)，Windows 系統上稱為叢集 (Cluster)，或是磁叢：磁碟上處理檔案的最小單位。一個叢集由一至多個磁區組成，在檔案系統格式化時決定。&lt;/li&gt;
&lt;li&gt;FAT：檔案配置表 (File Allocation Table) 檔案系統，有多種版本，包括 FAT12、FAT16和FAT32，FAT 後面的數字表示叢集的位元數大小。&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;FAT16：每個 FAT 實體 (entry) 使用 16&amp;nbsp;位元紀錄，也就是說最大可定址到2&lt;sup&gt;16&lt;/sup&gt; (=65,536) 個叢集。支援最大檔案大小為 4GB，支援最大磁碟區大小為 4GB。根目錄的檔案與資料夾總數最多為 512 個。&lt;/li&gt;
&lt;li&gt;FAT32：每個 FAT 實體 (entry) 使用 32&amp;nbsp;位元紀錄，但保留最高4位元，因此最大可定址到2&lt;sup&gt;28&lt;/sup&gt;&amp;nbsp;(=&amp;nbsp;268,435,456) 個叢集。支援最大檔案大小為 4GB，支援最大磁碟區大小為 32GB。每個目錄的檔案與資料夾總數最多為 65534 個。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;NTFS：新技術檔案系統 (New Technology File System)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
參考資料：&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Disk Devices and Partitions (Windows)&lt;br /&gt;
&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363966(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363966(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Basic and Dynamic Disks (Windows)&lt;br /&gt;
&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363785(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/windows/desktop/aa363785(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How FAT Works: Local File Systems&lt;br /&gt;
&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/cc776720(v=ws.10).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/cc776720(v=ws.10).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How NTFS Works&lt;br /&gt;
&lt;a href=&quot;https://technet.microsoft.com/en-us/library/cc781134(v=ws.10).aspx&quot;&gt;https://technet.microsoft.com/en-us/library/cc781134(v=ws.10).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cylinder-head-sector - Wikipedia, the free encyclopedia&lt;br /&gt;
&lt;a href=&quot;https://en.wikipedia.org/wiki/Cylinder-head-sector&quot;&gt;https://en.wikipedia.org/wiki/Cylinder-head-sector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;先進格式 4K 磁區硬碟機轉換|Seagate&lt;br /&gt;
&lt;a href=&quot;http://www.seagate.com/tw/zh/tech-insights/advanced-format-4k-sector-hard-drives-master-ti/&quot;&gt;http://www.seagate.com/tw/zh/tech-insights/advanced-format-4k-sector-hard-drives-master-ti/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ubuntu Manpage: fdisk - manipulate disk partition table&lt;br /&gt;
&lt;a href=&quot;http://manpages.ubuntu.com/manpages/trusty/man8/fdisk.8.html&quot;&gt;http://manpages.ubuntu.com/manpages/trusty/man8/fdisk.8.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;磁碟分割樣式&lt;br /&gt;
&lt;a href=&quot;https://msdn.microsoft.com/zh-tw/library/cc738081(v=ws.10).aspx&quot;&gt;https://msdn.microsoft.com/zh-tw/library/cc738081(v=ws.10).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;File Systems&lt;br /&gt;
&lt;a href=&quot;https://technet.microsoft.com/en-us/library/cc938937.aspx&quot; target=&quot;_blank&quot;&gt;https://technet.microsoft.com/en-us/library/cc938937.aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/4215952800931415624/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2016/03/data-storage.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4215952800931415624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4215952800931415624'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2016/03/data-storage.html' title='Data Storage 資料儲存'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-1022937457611693200</id><published>2016-01-22T17:28:00.000+08:00</published><updated>2016-04-06T14:05:14.539+08:00</updated><title type='text'>Driver Development 驅動程式開發</title><content type='html'>&lt;h2&gt;
什麼是驅動程式？&lt;/h2&gt;
&lt;b&gt;驅動程式 (Driver)&lt;/b&gt; 是一種軟體元件，介於作業系統 (Operating System) 和硬體裝置 (Device)，用途是讓作業系統和裝置彼此能夠溝通。從系統層面上看，由上而下分別是應用程式 (Application)、作業系統、驅動程式與裝置，如下圖所示。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMOMjgwG5-tzsUEQGQy6ztxPfk38-D0qcJjiPLRsApthgacF_T_Z7EwkDuczvBfbavZV2ZVK17JbTP9iP_kyFEnjzNsKhOhmV5BNHkXBno2M1iaNkFWRgBJc8F0mgZoU7h0AEfHhUyBVs/s640/driver.png&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;
驅動程式在架構上是分層堆疊 (layered in a stack) 而成，因此驅動程式不一定只和硬體裝置溝通，可能和其他驅動程式溝通。驅動程式依照用途不同可以分為下列幾類：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;功能驅動程式 (Function Driver)&lt;br /&gt;直接與硬體裝置直接溝通的驅動程式，稱為 Function Driver。&lt;/li&gt;
&lt;li&gt;篩選器驅動程式 (Filter Driver)&lt;br /&gt;輔助處理 I/O 請求的驅動程式，與其他驅動程式相互溝通，稱為 Filter Driver。&lt;/li&gt;
&lt;li&gt;軟體驅動程式 (Software Driver)&lt;br /&gt;與硬體裝置無關，是為了處理作業系統的核心資料結構，稱為&amp;nbsp;Software Driver。&lt;/li&gt;
&lt;li&gt;匯流排驅動程式 (Bus Driver)&lt;br /&gt;驅動匯流排以建立裝置樹的驅動程式，稱為 Bus Driver。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
驅動程式由誰開發？&lt;/h2&gt;
驅動程式是由裝置的設計者或製造者所開發，讓作業系統知道如何操作此裝置，進行資料的讀寫。另一方面，依照硬體標準所設計和製造的裝置，這些驅動程式可能就由作業系統廠商開發提供。&lt;br /&gt;
&lt;h2&gt;
驅動程式模型 (Driver Model)&lt;/h2&gt;
開發硬體裝置的驅動程式有３種模型：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;VxD (Virtual Device Driver)：概念是將硬體裝置虛擬化，讓多個應用程式可以共用實際的硬體，所以稱為「虛擬裝置驅動程式」。是 MS-DOS、Windows 3.x 和 Windows 95 使用的技術。&lt;/li&gt;
&lt;li&gt;Windows Driver Model (WDM)：非 NT-based 的 Windows 98 與 Windows Me，以及&amp;nbsp;NT-based 的 Windows 2000 與 Windows XP 使用的技術。&lt;/li&gt;
&lt;li&gt;Windows Driver Frameworks (WDF) ，以前稱為 Windows Driver Foundation (WDF)，這是 Windows Vista 以後使用的技術，WDF 包含兩種框架：&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/hardware/ff544309(v=vs.85).aspx&quot; target=&quot;_blank&quot;&gt;Kernel-Mode Driver Framework (KMDF)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/hardware/ff561356(v=vs.85).aspx&quot; target=&quot;_blank&quot;&gt;User-Mode Driver Framework (UMDF)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h2&gt;
硬體裝置的作業系統觀點&lt;/h2&gt;
在 Windows 系統中，硬體裝置表示為隨插即用裝置樹 (Plug and Play Device Tree，簡稱 Device Tree) 中的&lt;b&gt;裝置節點 (Device Node)&lt;/b&gt;，裝置節點之間具有父子 (parent/child) 關係，裝置節點由多個&lt;b&gt;裝置物件 (Device Object)&lt;/b&gt; 所堆疊組成，稱為裝置節點的&lt;b&gt;裝置堆疊 (Device Stack)&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
裝置物件是一個&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/hardware/ff543147(v=vs.85).aspx&quot; target=&quot;_blank&quot;&gt;DEVICE_OBJECT結構&lt;/a&gt;，每個裝置物件會有它對應的驅動程式，在系統上表示為驅動程式物件 (Driver Object) ，是一種&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/hardware/ff544174(v=vs.85).aspx&quot; target=&quot;_blank&quot;&gt;DRIVER_OBJECT結構&lt;/a&gt;，從另一個觀點來看，裝置堆疊可以看成是「裝置物件—驅動程式」組合所堆疊而成。&lt;br /&gt;
&lt;br /&gt;
裝置物件依據建立的驅動程式不同，區分為：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;由&amp;nbsp;Bus Driver 建立的裝置物件，稱為 &amp;nbsp;Physical Device Object (PDO)。&lt;/li&gt;
&lt;li&gt;由&amp;nbsp;Function&amp;nbsp;Driver 建立的裝置物件，稱為 &amp;nbsp;Functional&amp;nbsp;Device Object (FDO)。&lt;/li&gt;
&lt;li&gt;由 Filter Driver 建立的裝置物件，稱為 &amp;nbsp;Filter Device Object (Filter DO)。&lt;/li&gt;
&lt;/ul&gt;
注意到 Bus Driver 建立的裝置物件，如果這個裝置物件本身就是匯流排的話，那 Bus Driver 所建立的是 FDO 而不是 PDO。換句話說，一個驅動程式可能同時兼具 Bus Driver 和 Function Driver 的角色功能。另外，一個 Driver Object 可以建立多個 Device Object，這也符合直覺上一個 Driver 可以驅動很多 Device 的想法。&lt;br /&gt;
&lt;br /&gt;
參考資料：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;What is a driver? (Windows Drivers)&lt;br /&gt;
&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/hardware/ff554678(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/windows/hardware/ff554678(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Device nodes and device stacks
&lt;br /&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/hardware/ff554721(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/windows/hardware/ff554721(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Windows Driver Frameworks&lt;br /&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/hardware/ff557565(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/windows/hardware/ff557565(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Writing WDM Drivers&lt;br /&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/hardware/ff566412(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/windows/hardware/ff566412(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Overview of Windows Components (Windows Drivers)&lt;br /&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/windows/hardware/ff558769(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/windows/hardware/ff558769(v=vs.85).aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/1022937457611693200/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2016/01/driver-development.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1022937457611693200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1022937457611693200'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2016/01/driver-development.html' title='Driver Development 驅動程式開發'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMOMjgwG5-tzsUEQGQy6ztxPfk38-D0qcJjiPLRsApthgacF_T_Z7EwkDuczvBfbavZV2ZVK17JbTP9iP_kyFEnjzNsKhOhmV5BNHkXBno2M1iaNkFWRgBJc8F0mgZoU7h0AEfHhUyBVs/s72-c/driver.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-1607259755615908759</id><published>2015-09-24T17:27:00.000+08:00</published><updated>2015-09-26T07:39:34.325+08:00</updated><title type='text'>Cryptosystem 密碼系統</title><content type='html'>這篇記錄&lt;b&gt;密碼系統 (Cryptosystem)&lt;/b&gt; 的分類&lt;br /&gt;
&lt;h2&gt;
依安全性程度&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;無條件安全 (Unconditionally Secure)&lt;/li&gt;
&lt;li&gt;計算安全 (Computationally Secure)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
依加解密資料的處理方式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;串流 (Stream) 密碼系統：每次加解密一個 bit 或一個 byte。&lt;/li&gt;
&lt;li&gt;區塊 (Block) 密碼系統：以數個 bits 或數個 bytes 為一個單位進行加解密。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
依加解密資料的格式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;文字 (Text)&lt;/li&gt;
&lt;li&gt;多媒體 (Multimedia)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
依加解密金鑰的異同&lt;/h2&gt;
並列出著名的加解密方法 (演算法)，與其加密模式、加密方式。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;秘密金鑰&lt;/b&gt;密碼系統 (Secret-Key Cryptosystems)，也稱&lt;b&gt;對稱式&lt;/b&gt;密碼系統 (Symmetric Cryptosystems)、&lt;b&gt;單金鑰&lt;/b&gt;密碼系統 (One-Key Cryptosystems)。&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;資料加密標準 (Data Encryption Standard, DES)：56 位元金鑰，以64位元為區塊加解密。若明文超過區塊大小則切割成數個區塊處理，各個區塊加解密的處理方式有下列加密模式：&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;ECB (Electronic Code Book) 加密模式：每個區塊各自獨立加解密處理。&lt;/li&gt;
&lt;li&gt;CBC (Cipher Block Chaining) 加密模式：利用初始化向量 (IV) 與第一個明文區塊進行XOR運算後加密，第一個密文與第二個明文XOR運算後加密。&lt;/li&gt;
&lt;li&gt;CFB (Cipher Feed Back) 加密模式：初始化向量加密後與第一個明文區塊進行XOR運算，第一個密文加密後與第二個明文區塊進行XOR運算。&lt;/li&gt;
&lt;li&gt;OFB (Output Feed Back) 加密模式：初始化向量加密後與第一個明文區塊進行XOR運算，初始化向量加密二次後與第二個明文區塊進行XOR運算。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;三重資料加密標準(Triple Data Encryption Standard, Triple-DES 或 3DES)：串接 3 個 DES 使用，金鑰為168 位元或112位元，一樣以64位元為區塊加解密。。&lt;/li&gt;
&lt;li&gt;先進加密標準 (Advanced Encryption Standard, AES)，金鑰長度為 128、192 或 256 位元，128 位元區塊加解密，使用&amp;nbsp;Rijndael 演算法 (讀作“Rain Doll“)。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;公開金鑰&lt;/b&gt;密碼系統 (Public-Key Cryptosystems)，也稱&lt;b&gt;非對稱式&lt;/b&gt;密碼系統 (Asymmetric Cryptosystems)、&lt;b&gt;雙金鑰&lt;/b&gt;密碼系統 (Two-Key Cryptosystems)。&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;RSA：第一個公開金鑰密碼系統，由 MIT 的 Ron Rivest, Adi Shamir, 與 Leonard Adleman 三位教授所發明，取其性是第一個字母而稱 RSA。目前標準為&amp;nbsp;&lt;a href=&quot;http://www.emc.com/emc-plus/rsa-labs/standards-initiatives/pkcs-rsa-cryptography-standard.htm&quot; target=&quot;_blank&quot;&gt;PKCS#1&lt;/a&gt;或&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://tools.ietf.org/html/rfc3447&quot; target=&quot;_blank&quot;&gt;RFC 3447&lt;/a&gt;。基於質因數分解，相同的明文會對應到相同的秘文。&lt;/li&gt;
&lt;li&gt;ElGamal：基於解離散對數 (Discrete logarithm)，相同的明文會對應到不同的秘文，密文長度為明文的 2 倍。&lt;/li&gt;
&lt;li&gt;橢圓曲線 (Elliptic curve)：基於橢圓曲線的有限域 (finite field)，其加解密的運算量較少 (與 RSA 和 ElGamal 相比之下)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
根據參考資料描述：「一般來說，對稱式密碼系統的加解密速度大約比非對稱式密碼系統快1000倍。」因此，為了解決金鑰管理和運算量的問題，通常會使用對稱式與非對稱式所組合成的混合式加密機制。另外，在非對稱式密碼系統的標準中，沒有明確規範金鑰長度。&lt;br /&gt;
&lt;br /&gt;
參考資料：&amp;nbsp;黃明祥、林詠章著，資訊與網路安全概論（第二版）：建構安全的電子商務系統，台北市：麥格羅希爾，2007。&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/1607259755615908759/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2015/09/cryptosystem.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1607259755615908759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1607259755615908759'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2015/09/cryptosystem.html' title='Cryptosystem 密碼系統'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-7543411137742970993</id><published>2015-08-07T17:04:00.000+08:00</published><updated>2015-09-25T12:02:09.570+08:00</updated><title type='text'>Agile, Lean, Kanban 敏捷, 精實, 看板</title><content type='html'>這篇記錄軟體開發方法的一些原則&lt;br /&gt;
&lt;h2&gt;
敏捷軟體開發 (Agile Software Development)&lt;/h2&gt;
&lt;div&gt;
敏捷軟體開發的 4 大價值觀 (values)&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;個人與互動 重於 流程與工具&lt;br /&gt;
Individuals and interactions over processes and tools&lt;/li&gt;
&lt;li&gt;可用的軟體 重於 詳盡的文件&lt;br /&gt;
Working software over comprehensive documentation&lt;/li&gt;
&lt;li&gt;與客戶合作 重於 合約協商&lt;br /&gt;
Customer collaboration over contract negotiation&lt;/li&gt;
&lt;li&gt;回應變化 重於 遵循計劃&lt;br /&gt;
Responding to change over following a plan&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
敏捷軟體的 12 個原則 (principles)&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;我們最優先的任務，是透過及早並持績地交付有價值的軟體來滿足客戶需求。&lt;br /&gt;
Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.&lt;/li&gt;
&lt;li&gt;竭誠歡迎改變需求，甚至已處開發後期亦然。敏捷流程掌控變更，以維護客戶的競爭優勢。&lt;br /&gt;
Welcome changing requirements, even late in development. Agile processes harness change for &amp;nbsp;the customer&#39;s competitive advantage.&lt;/li&gt;
&lt;li&gt;經常交付可用的軟體，頻率可以從數週到數個月，以較短時間間隔為佳。&lt;br /&gt;
Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.&lt;/li&gt;
&lt;li&gt;業務人員與開發者必須在專案全程中天天一起工作。&lt;br /&gt;
Business people and developers must work together daily throughout the project.&lt;/li&gt;
&lt;li&gt;以積極的個人來建構專案，給予他們所需的環境與支援，並信任他們可以完成工作。&lt;br /&gt;
Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.&lt;/li&gt;
&lt;li&gt;面對面的溝通是傳遞資訊給開發團隊及團隊成員之間效率最高且效果最佳的方法。&lt;br /&gt;
The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.&lt;/li&gt;
&lt;li&gt;可用的軟體是最主要的進度量測方法。&lt;br /&gt;
Working software is the primary measure of progress.&lt;/li&gt;
&lt;li&gt;敏捷程序提倡可持續的開發。贊助者、開發者及使用者應當能不斷地維持穩定的步調。&lt;br /&gt;
Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.&lt;/li&gt;
&lt;li&gt;持續追求優越的技術與優良的設計，以強化敏捷性。&lt;br /&gt;
Continuous attention to technical excellence and good design enhances agility.&lt;/li&gt;
&lt;li&gt;精簡──或最大化未完成工作量之技藝──是不可或缺的。&lt;br /&gt;
Simplicity--the art of maximizing the amount of work not done--is essential.&lt;/li&gt;
&lt;li&gt;最佳的架構、需求與設計皆來自於能自我組織的團隊。&lt;br /&gt;
The best architectures, requirements, and designs emerge from self-organizing teams.&lt;/li&gt;
&lt;li&gt;團隊定期自省如何更有效率，並據之適當地調整與修正自己的行為。&lt;br /&gt;
At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h2&gt;
精實軟體開發 (Lean Software Development)&lt;/h2&gt;
精實軟體開發的 7 大原則，源自於 Mary Poppendieck &amp;amp; Tom Poppendieck 在 2003 年出版的著作：&lt;a href=&quot;http://www.pearsonhighered.com/educator/product/Lean-Software-Development-An-Agile-Toolkit/9780321150783.page&quot; target=&quot;_blank&quot;&gt;Lean Software Development: An Agile Toolkit&lt;/a&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;消除浪費 (Eliminate waste)&lt;/li&gt;
&lt;li&gt;增強學習 (Amplify learning)&lt;/li&gt;
&lt;li&gt;盡量延遲決策 (Decide as late as possible)&lt;/li&gt;
&lt;li&gt;盡快交付 (Deliver as fast as possible)&lt;/li&gt;
&lt;li&gt;授權團隊 (Empower the team)&lt;/li&gt;
&lt;li&gt;嵌入完整性 (Build integrity in)&lt;/li&gt;
&lt;li&gt;著眼整體 (See the whole)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
看板方法 (Kanban Method)&lt;/h2&gt;
看板方法是由 David J. Anderson 在 2005 年所創造的流程控制方法。&lt;br /&gt;
&lt;br /&gt;
看板方法的 4 個基本原則 (foundational principles)&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;從既有的流程開始&lt;br /&gt;
Start with existing process&lt;/li&gt;
&lt;li&gt;同意持續增量、漸進的變化&lt;br /&gt;
Agree to pursue incremental evolutionary change&lt;/li&gt;
&lt;li&gt;尊重當前的流程、角色、職責和頭銜&lt;br /&gt;
Respect the current process, roles, responsibilities and titles&lt;/li&gt;
&lt;li&gt;鼓勵各層級的領導行為&lt;br /&gt;
Leadership at all levels&lt;/li&gt;
&lt;/ol&gt;
看板方法的 6 個實務 (core practices)&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;步驟１：視覺化&lt;br /&gt;
Visualize&lt;/li&gt;
&lt;li&gt;步驟２：限制半成品 (WIP) 數量&lt;br /&gt;
Limit Work-In-Progress&lt;/li&gt;
&lt;li&gt;步驟３：管理工作流程&lt;br /&gt;
Manage flow&lt;/li&gt;
&lt;li&gt;策略４：讓規則明確&lt;br /&gt;
Make policies explicit&lt;/li&gt;
&lt;li&gt;策略５：落實回饋循環&lt;br /&gt;
Implement feedback loops&lt;/li&gt;
&lt;li&gt;策略６：由協作改善，經實驗演進&lt;br /&gt;
Improve collaboratively, evolve experimentally using models and the scientific method&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
參考資料&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Manifesto for Agile Software Development&lt;br /&gt;
&lt;a href=&quot;http://www.agilemanifesto.org/&quot;&gt;http://www.agilemanifesto.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;李智樺著，&lt;a href=&quot;http://www.delightpress.com.tw/book.aspx?book_id=SKNP00031&quot; target=&quot;_blank&quot;&gt;精實開發與看板方法&lt;/a&gt;，台北：精誠資訊，2015.03。&lt;/li&gt;
&lt;li&gt;Ruddy Lee 分享空間，&lt;a href=&quot;https://ruddyblog.wordpress.com/tag/%E7%B2%BE%E5%AF%A6%E9%96%8B%E7%99%BC%E8%88%87%E7%9C%8B%E6%9D%BF%E6%96%B9%E6%B3%95/&quot;&gt;https://ruddyblog.wordpress.com/tag/精實開發與看板方法/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
###&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/7543411137742970993/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2015/08/agile-lean-kanban.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/7543411137742970993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/7543411137742970993'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2015/08/agile-lean-kanban.html' title='Agile, Lean, Kanban 敏捷, 精實, 看板'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-4413665874759056601</id><published>2014-12-28T20:23:00.000+08:00</published><updated>2015-10-16T12:47:25.833+08:00</updated><title type='text'>Wisdom and Teachings</title><content type='html'>記錄一些原則與智慧，取自『&lt;a href=&quot;http://www.bookzone.com.tw/Publish/book.asp?bookno=bp306&quot; target=&quot;_blank&quot;&gt;柯維經典語錄&lt;/a&gt;』一書。&lt;br /&gt;
&lt;br /&gt;
責任心 (Accountability)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;沒有任何事情比許下承諾卻無法遵守，更快破壞彼此的信任。相反地，沒有任何事情比信守承諾更能夠建立信任。&lt;/li&gt;
&lt;li&gt;想要改善任何情況，你必須先改善自己。想要改變你的妻子，你必須先改變自己。想改變你丈夫的態度，你必須先改變自身的態度。想贏得更多的自由，你必須更有責任心、更加自律。&lt;/li&gt;
&lt;/ul&gt;
平衡 (Balance)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;關鍵不在於排出你行程表上的優先順序，而在於規劃出你人生的優先順序。&lt;/li&gt;
&lt;/ul&gt;
選擇 (Choice)&lt;br /&gt;
&lt;ul&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;
&lt;/ul&gt;
貢獻 (Contribution)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;我們每個人的內心深處，都嚮往偉大且有貢獻的人生 — 真正有意義、且有所作為的非凡人生。在家裡、在職場上，以及在社會裡，我們可以有自覺地選擇遠離平庸的生活，活出偉大的人生。&lt;/li&gt;
&lt;li&gt;這世上有成功者，也有貢獻者。許多成功者也會貢獻，但他們大多只是準備要付出，卻未真的貢獻。你們應該把貢獻當做今生的使命。&lt;/li&gt;
&lt;/ul&gt;
勇氣 (Courage)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;人生最大的風險在於不敢承擔一絲風險。&lt;/li&gt;
&lt;/ul&gt;
效能 (Effectiveness)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;再多更好的建議，若沒有解決真正的問題，都只是空談而已，一點用處也沒有。&lt;/li&gt;
&lt;li&gt;忙碌不等於高效能：有的人雖然忙翻天，效率卻不高。&lt;/li&gt;
&lt;/ul&gt;
同理心 (Empathy)&lt;br /&gt;
&lt;ul&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;
&lt;/ul&gt;
真誠正直 (Integrity)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;不要替別人的短處辯白，也不要為自己的缺點辯護。當你犯了錯，就承認它、修正它、並從中學到教訓 — 立刻去做！&lt;/li&gt;
&lt;li&gt;解決問題不能光說不練，你必須走進問題核心去解決它。&lt;/li&gt;
&lt;/ul&gt;
領導力 (Leadership)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;有效的領導是要事優先處理。有效的管理則是紀律至上，而且要確實執行。&lt;/li&gt;
&lt;li&gt;在工業時代，領導是個職位。在知識時代，領導是種選擇。&lt;/li&gt;
&lt;/ul&gt;
學習 (Learning)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;知道了卻不去做，跟不知道沒有兩樣。&lt;/li&gt;
&lt;/ul&gt;
愛 (Love)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;從你對一個人的態度，可以看出你是怎麼對待其他人的，因為所有人都是一個整體。&lt;/li&gt;
&lt;li&gt;人與人之間的關係裡，沒有不重要的小事，全都是大事。&lt;/li&gt;
&lt;/ul&gt;
潛能 (Potential)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;人有自我察覺的能力：有了這樣的自覺，我們才能在心裡跳脫自我，從旁檢視自身的信念以及行動，去思考自己究竟思考的是什麼。&lt;/li&gt;
&lt;/ul&gt;
自律 (Self-Discipline)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;大多數人會把紀律與不自由劃上等號，但事實上恰好相反：堅持紀律的人才是真正自由的人，不守紀律的人則會淪為情緒、慾望與激情的奴隸。&lt;/li&gt;
&lt;/ul&gt;
綜合統效 (Synergy)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;如果兩人看法相同，其中一人必屬多餘。&lt;/li&gt;
&lt;li&gt;綜合統效跟妥協不一樣，在妥協裡，一加一頂多只等於一個半。&lt;/li&gt;
&lt;/ul&gt;
信任 (Trust)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;想要別人信任你，首先做個值得信任的人。&lt;/li&gt;
&lt;/ul&gt;
真理 (Truth)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;我們看待問題的方式，本身就是一大問題。&lt;/li&gt;
&lt;li&gt;原則與實務不同；實務只適用於特定情況，但原則卻是更深層、更根本的真理，它通用於各種情況。&lt;/li&gt;
&lt;/ul&gt;
願景 (Vision)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;一個人的本性，決定了他看待事物的角度。&lt;/li&gt;
&lt;li&gt;工作本身不會有未來，未來只存在你自己的身上。&lt;/li&gt;
&lt;li&gt;要想有效改變自己，我們首先必須改變自己的看法。&lt;/li&gt;
&lt;/ul&gt;
雙贏 (Win-Win)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;或許在真正懂得分享之前，我們需要先經歷擁有的感覺。&lt;/li&gt;
&lt;li&gt;為自己著想，但不忘他人的權益。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
資料來源：&lt;br /&gt;
史蒂夫．柯維(Stephen R. Covey)著，胡琦君譯，柯維經典語錄：18個關鍵原則，創造成功人生，台北：遠見天下文化，2013。譯自：The wisdom and teachings of Stephen R. Covey&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/4413665874759056601/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/12/wisdom-and-teachings.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4413665874759056601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4413665874759056601'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/12/wisdom-and-teachings.html' title='Wisdom and Teachings'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-9176382744278153059</id><published>2014-10-29T23:53:00.001+08:00</published><updated>2014-10-29T23:55:28.612+08:00</updated><title type='text'>Zero to One</title><content type='html'>如果你想用創業去改變未來，那你一定要看彼得‧提爾 (Peter Thiel) 的「&lt;a href=&quot;http://topic.cwbook.com.tw/reader/2014/zerotoone/&quot; target=&quot;_blank&quot;&gt;從0到1：打開世界運作的未知祕密，在意想不到之處發現價值&lt;/a&gt;」。彼得是 PayPal 的創辦人，現在是矽谷創投公司創辦人基金 (Founder Fund) 的合夥人，這本書源自於彼得在史丹佛大學開設的創業課程，他的學生布雷克‧馬斯特 (Blake Masters) 做了詳盡的筆記後廣為流傳，後來兩人合作改寫成「從 0 到 1 」出版，這本書主要談的就是：&lt;b&gt;如何建立一個可以創新的公司&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqtxRT8M2ZhEbqOTTq7KQQPmzQ1KlPQZTGpAmhVB9craE0kgPRiYGm9MsckucgpwzzwhQCkKICs07R-9FpQuByNOLw3-s4mvSQKGVDF7-J4WgFJMEnSxgoDwp1eue2qvPBqH9eRYlHldw/s1600/zero-to-one.png&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;
創新是一種進步，作者在第一章提到進步有兩種型式：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;垂直或密集式的進步 (vertical or intensive progress)&lt;/b&gt;&lt;br /&gt;
開發新的事物，這是從 0 到 1 的進步，例如&lt;b&gt;科技 (technology)&lt;/b&gt; 的發展。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;水平或延伸式的進步 (horizontal or extensive progress)&lt;/b&gt;&lt;br /&gt;
複製已經成功的事物，這是從 1 到 n 的進步，例如&lt;b&gt;全球化 (globalization)&lt;/b&gt; 的發展。&lt;/li&gt;
&lt;/ul&gt;
這本書談的創新是「從 0 到 1 」這種形式的進步，那我們要如何建立一個可以「創新」的公司呢？作者要我們先從這個問題開始回答：&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;有什麼是你跟其他人有不同看法，但是你覺得很重要的事實？&lt;/b&gt;&lt;/blockquote&gt;
創業家從 1999 年的網路泡沫中得到教訓，但作者的看法則有不同，如下：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;循序漸進，但&lt;b&gt;大膽冒險比無聊瑣碎好&lt;/b&gt;。&lt;/li&gt;
&lt;li&gt;保持精簡有彈性，但&lt;b&gt;壞計畫比沒計畫好&lt;/b&gt;。&lt;/li&gt;
&lt;li&gt;面對競爭求取進步，但&lt;b&gt;競爭市場賺不到錢，要成為獨占市場的企業&lt;/b&gt;。&lt;/li&gt;
&lt;li&gt;專注在產品，而非專注銷售。但&lt;b&gt;銷售與競爭一樣重要，不同產品需要不同的銷售方法&lt;/b&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
大致上整本書圍繞著上述幾個觀點，作者分享他的看法，說明如何建立一個可以創新的公司。如推薦所言：「&lt;i&gt;當一個有冒險精神的人願意寫書，就買來看。如果寫書的是彼得‧提爾，就看兩遍。但是保險起見，請看三遍。因為這本書絕對是經典之作。&lt;/i&gt;」確實如此！&lt;/div&gt;
&lt;br /&gt;
彼得‧提爾 (Peter Thiel)、布雷克‧馬斯特 (Blake Masters)，季晶晶譯，&lt;i&gt;從0到1：打開世界運作的未知祕密，在意想不到之處發現價值&lt;/i&gt;，台北：天下雜誌，2014。&lt;br /&gt;
譯自：&lt;a href=&quot;http://zerotoonebook.com/&quot; target=&quot;_blank&quot;&gt;Zero to One: Notes on Startups, or How to Build the Future&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/9176382744278153059/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/10/zero-to-one.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/9176382744278153059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/9176382744278153059'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/10/zero-to-one.html' title='Zero to One'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqtxRT8M2ZhEbqOTTq7KQQPmzQ1KlPQZTGpAmhVB9craE0kgPRiYGm9MsckucgpwzzwhQCkKICs07R-9FpQuByNOLw3-s4mvSQKGVDF7-J4WgFJMEnSxgoDwp1eue2qvPBqH9eRYlHldw/s72-c/zero-to-one.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-1074093208836244045</id><published>2014-10-14T21:22:00.001+08:00</published><updated>2014-10-17T13:27:48.313+08:00</updated><title type='text'>Project Management 專案管理</title><content type='html'>&lt;h2&gt;
什麼是專案？&lt;/h2&gt;
專案 (Project) 是在一次性的工作中，必須同時完成&lt;b&gt;成效 (performance)&lt;/b&gt; 、&lt;b&gt;時間 (time)&lt;/b&gt; 、&lt;b&gt;成本 (cost)&lt;/b&gt; 和&lt;b&gt;範疇 (scope)&lt;/b&gt; 的多重任務要求，簡稱為 PCTS。換句話說，一個專案必須有特定的成效，有明確的開始和結束時間，有預算，也有明確規範工作的大小。另外，品管學者約瑟夫．朱蘭(Joseph M. Juran) 說：「專案是為了解決問題所排定的進度表。」這是更簡單的解釋。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj67dKcnnZOv_tU9BpUjCWyjcW8xoQdGeyhVVngKcx_Saxr2_G5HWmUYtSRlpwx8UAus5PagNZZoRWesY8xwHtJIAIqQBjenzMeE_cVHLsd1zlMm8xGi6tYuId6vI3O4pv7TI1IvmnZVUw/s1600/project.png&quot; /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h2&gt;
什麼是專案管理？&lt;/h2&gt;
為了完成專案的目標，將所有計劃、進度與管控的行動無瑕的結合運作 (facilitate)，這就是專案管理。專案管理的首要原則：&lt;b&gt;一定要讓未來會牽涉到專案實際作業的人，共同參與專案計畫的工作。&lt;/b&gt;專案管理不同於一般的管理，在於專案的 PCTS 任務特性，例如一般事務性的工作內容，就沒有這些特性。&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
一個專案中的角色成員&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;專案經理 (Project Manager)&lt;br /&gt;
專案的啟動者 (Enabler)，領導並且協助團隊成員順利完成他們所負責的工作。&lt;/li&gt;
&lt;li&gt;團隊成員 (Team Members)&lt;br /&gt;
實際執行工作的人員，負責完成專案所訂定的目標。&lt;/li&gt;
成員可能是組織中可用的人才 (不見得是適合的人才)，因專案的需要才加入團隊中，也可能專案結束後就離開此團隊。
&lt;li&gt;贊助者 (Sponsor)&lt;br /&gt;
指定 PCTS 中的任意 3 個限制條件。另外一個條件是由專案經理所計劃與管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h2&gt;
專案的生命週期&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;概念&lt;br /&gt;
市場概念形成，競爭力調查&lt;/li&gt;
&lt;li&gt;定義&lt;br /&gt;
定義問題，產生願景，擬定專案任務大綱&lt;/li&gt;
&lt;li&gt;計畫&lt;br /&gt;
發展策略，實行計畫，風險管理&lt;/li&gt;
&lt;li&gt;執行&lt;br /&gt;
逐項完成工作，監控過程，修正錯誤&lt;/li&gt;
&lt;li&gt;結案&lt;br /&gt;
結論報告，檢討回顧&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
參考資料&lt;br /&gt;
詹姆斯．路易斯 (James P. Lewis)著，葛迺駿譯，我懂了！專案管理，台北：經濟新潮社，2003。&lt;br /&gt;
&lt;br /&gt;
註：「迺」讀「ㄋㄞˇ」&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/1074093208836244045/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/10/project-management.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1074093208836244045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1074093208836244045'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/10/project-management.html' title='Project Management 專案管理'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj67dKcnnZOv_tU9BpUjCWyjcW8xoQdGeyhVVngKcx_Saxr2_G5HWmUYtSRlpwx8UAus5PagNZZoRWesY8xwHtJIAIqQBjenzMeE_cVHLsd1zlMm8xGi6tYuId6vI3O4pv7TI1IvmnZVUw/s72-c/project.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-5195745655915678346</id><published>2014-10-06T21:35:00.000+08:00</published><updated>2014-10-07T09:58:20.130+08:00</updated><title type='text'>AngularJS</title><content type='html'>&lt;a href=&quot;https://angularjs.org/&quot; target=&quot;_blank&quot;&gt;AngularJS&lt;/a&gt; 是一個用於動態網頁應用程式 (dynamic web apps) 的結構框架 (structural framework)，AngularJS 的特點在於&lt;b&gt;強化 HTML 本身的功能&lt;/b&gt;，讓我們利用 HTML 的語法就能建立一個動態的網頁應用程式。之所以稱為「Angular」是源於 HTML 的「角括號的尖角」，AngularJS&amp;nbsp;有 HTML 延伸的意涵在裡面。換句話說，如果想要學習&amp;nbsp;AngularJS 這個框架，必須對於 HTML 有基本的認識。&lt;br /&gt;
&lt;br /&gt;
HTML 是一種專門描述靜態文件的&lt;b&gt;宣告式語言 (declarative language)&lt;/b&gt;，HTML告訴瀏覽器該做什麼，但沒辦法說明該如何執行功能，本質上不能使用 HTML 建立動態網頁應用程式。意思是說，靜態文件與動態網頁應用程式之間存在著「阻抗不匹配 (impedance mismatch)」的問題。&lt;br /&gt;
&lt;br /&gt;
有兩種方式解決阻抗不匹配的問題：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;程式庫 (library)&lt;br /&gt;
程式庫包含很多開發應用程式需要的函式，呼叫這些函式實現我們需要的功能，例如 &lt;a href=&quot;http://jquery.com/&quot; target=&quot;_blank&quot;&gt;jQuery&lt;/a&gt; 就是其中的一種。&lt;/li&gt;
&lt;li&gt;框架 (framework)&lt;br /&gt;
針對某種應用情境設計的程式架構，我們需要在架構中填入程式碼以實現功能，例如 &lt;a href=&quot;http://durandaljs.com/&quot; target=&quot;_blank&quot;&gt;durandal&lt;/a&gt;, &lt;a href=&quot;http://emberjs.com/&quot; target=&quot;_blank&quot;&gt;ember&lt;/a&gt; 等。&lt;/li&gt;
&lt;/ul&gt;
然而 AngularJS 選擇另一種不同的解決方法，AngularJS 增強 HTML 的語法，使用 JavaScript 開發 HTML 編譯器，讓瀏覽器能夠解析這些新的語法，AngularJS 稱為&lt;b&gt;指令 (directive)&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
AngularJS 所採取的是&lt;b&gt;宣告式語言&lt;/b&gt;這一條路，因此在 AngularJS 的學習上，使用指令會比撰寫 JavaScript 還要來的重要，大部分都是在編輯 HTML 檔案 (也就是使用 directive)。這也和其他用戶端的框架不太一樣，像是 ember,&amp;nbsp;Ext JS 等，因為這類框架採取的是&lt;b&gt;命令式語言 (imperative language)&lt;/b&gt; 這一條路 ，開發上主要是撰寫 JavaScript。&lt;br /&gt;
&lt;br /&gt;
前面提到框架是針對某種應用情境設計的程式架構，AngularJS 的設計主要是針對資料類型的開發，也就是 CRUD (create, read, update and delete) 的應用程式。遊戲與 GUI 操作的應用程式就不太適合使用&amp;nbsp;AngularJS 了， &lt;b&gt;CRUD&amp;nbsp;&lt;/b&gt;&lt;b&gt;的&lt;/b&gt;&lt;b&gt;應用類型是&amp;nbsp;AngularJS 的強項&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
目前 (2014/10) 沒有關於 AngularJS 的中文書籍，對於國內推廣&amp;nbsp;AngularJS 會有些困難。學習上大多是英文網站的資訊，這裡推薦W3Schools 的&amp;nbsp;&lt;a href=&quot;http://www.w3schools.com/angular/default.asp&quot; target=&quot;_blank&quot;&gt;AngularJS Tutorial&lt;/a&gt; ，頗為簡要而易懂，其他資源則請參考&amp;nbsp;AngularJS 官方網站：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.angularjs.org/guide&quot; target=&quot;_blank&quot;&gt;Developer Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.angularjs.org/api&quot; target=&quot;_blank&quot;&gt;API Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
上述內容參考自&amp;nbsp;&lt;a href=&quot;https://docs.angularjs.org/guide/introduction&quot; target=&quot;_blank&quot;&gt;Developer Guide / Introduction&lt;/a&gt; 。&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/5195745655915678346/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/10/angularjs.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/5195745655915678346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/5195745655915678346'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/10/angularjs.html' title='AngularJS'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-2816718775169373085</id><published>2014-09-20T13:11:00.000+08:00</published><updated>2016-06-22T09:47:59.998+08:00</updated><title type='text'>Black Tea 品味紅茶</title><content type='html'>最近研究了一下紅茶，在此分享有關紅茶的知識。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;紅茶&lt;/b&gt;茶葉原產於中國，但卻是英國塑造了紅茶文化，紅茶變成茶的主流，甚至是茶的代名詞。英國人稱紅茶為「Black Tea」是因為紅茶&lt;b&gt;茶葉&lt;/b&gt;是黑色的緣故，而我們東方稱為紅茶是因為紅茶&lt;b&gt;茶湯&lt;/b&gt;色澤呈現紅褐色的緣故。&lt;br /&gt;
&lt;br /&gt;
奶茶：紅茶加牛奶，或是牛奶加紅茶，這是經濟上的考量，有兩種說法。過去茶葉是奢侈品，為了能夠多喝幾杯，於是加入較便宜的牛奶。另一種說法則是有段時間牛奶供不應求，如果添加紅茶在牛奶之中，就能夠減少牛奶的使用量。不論何者真實，奶茶確實是好喝的飲品之一！&lt;br /&gt;
&lt;br /&gt;
茶葉以產地聞名，也通常以產地命名。全世界公認的紅茶生產地有三個國家：印度、錫蘭與中國，其出產的紅茶如下：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;印度，產地位於印度東北部&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;阿薩姆省 (Assam)，稱為&lt;b&gt;阿薩姆紅茶&lt;/b&gt;。&lt;/li&gt;
&lt;li&gt;西孟加拉省 (West Bengal) 的大吉嶺 (Darjeeling)，稱為&lt;b&gt;大吉嶺紅茶&lt;/b&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;斯里蘭卡&amp;nbsp;(Sri Lanka)，統稱為&lt;b&gt;錫蘭紅茶&lt;/b&gt; (Ceylon Tea)。&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;烏沃省 (Uva)&lt;/li&gt;
&lt;li&gt;努沃勒埃利耶區 (Nuwara Eliya)&lt;/li&gt;
&lt;li&gt;汀普拉村 (Dimbula)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;中國&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;安徽省祁門縣，出產的紅茶稱為「祁紅」。(祁：讀作ㄑ一 ˊ)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
除了上述三個國家外，生產紅茶比較著名國家的還有肯亞、爪哇、台灣。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeGvpc5J5vfCG1du9vFABD-qw3o5fj24TZzCVp27g3AgeNXk4Pi0N3QLWD6ar_NH3YEc1IOyYMNEj-SfTnYoLqidct1z7wwU0BuF15fOQLzXFFBRBxPeGThoRw4WSed2Ri_H4xiWx3UM0/s1600/DSC00482.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeGvpc5J5vfCG1du9vFABD-qw3o5fj24TZzCVp27g3AgeNXk4Pi0N3QLWD6ar_NH3YEc1IOyYMNEj-SfTnYoLqidct1z7wwU0BuF15fOQLzXFFBRBxPeGThoRw4WSed2Ri_H4xiWx3UM0/s1600/DSC00482.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
接下來介紹紅茶的等級 (Grade)，所謂的&lt;b&gt;等級和品質無關，純粹只是區分茶葉的大小和生長部位。&lt;/b&gt;為什麼要分級呢？因為與泡茶的時間有關，越大片的茶葉沖泡的時間越長。紅茶的等級如下，依照茶葉生長位置由上而下(葉片由小至大)：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;花橙黃白毫&amp;nbsp;(Flowery Orange Pekoe, 簡稱 FOP)&lt;/li&gt;
&lt;li&gt;橙黃白毫&amp;nbsp;(Orange Pekoe, 簡稱 OP)&lt;/li&gt;
&lt;li&gt;白毫&amp;nbsp;(Pekoe, 簡稱 P)&lt;/li&gt;
&lt;li&gt;白毫小種&amp;nbsp;(Pekoe Souchong, 簡稱 PS)&lt;/li&gt;
&lt;li&gt;小種 (Souchong, 簡稱 S)&lt;/li&gt;
&lt;/ul&gt;
若依茶葉的完整性，有沒有切碎處理，可以分為下列 3 種：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;全葉茶 (Leaf, 沒有簡稱)，或稱葉茶。&lt;/li&gt;
&lt;li&gt;碎茶 (Broken,&amp;nbsp;簡稱 B)，或稱散茶。沖泡時間較全葉茶短。&lt;/li&gt;
&lt;li&gt;粉茶 (Dust, 簡稱 D)，或稱末茶。沖泡時間最短，分級過程中剩下的細粉狀茶葉，通常也最廉價。&lt;/li&gt;
&lt;/ul&gt;
了解產地與分級，最後介紹紅茶的調和變化，這大概是紅茶比較特別的地方。從產地出來是怎樣就是怎樣的紅茶，稱為&lt;b&gt;原味茶&lt;/b&gt;，或稱產地茶。而調和兩種以上的原味茶，則稱為&lt;b&gt;混合茶&lt;/b&gt;。若是在原味紅茶製作過程加入其他果香味，則是&lt;b&gt;加味茶&lt;/b&gt;。以下是這些變化中較知名的紅茶清單：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;原味茶 (Plain Tea)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;阿薩姆 (Assam Tea)&lt;/li&gt;
&lt;li&gt;大吉嶺&amp;nbsp;(Darjeeling Tea)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;混合茶 (Blended Tea)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;英國早餐茶 (English Breakfast Tea)，混合印度、錫蘭或肯亞的產地茶調配而成的紅茶。&lt;/li&gt;
&lt;li&gt;英國下午茶 (English&amp;nbsp;Afternoon Tea)，混合印度及非洲的產地茶調和而成的紅茶。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;加味茶 (Flavoured Tea)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;伯爵茶 (Earl Grey Tea)，在中國的英國外交使節&lt;b&gt;格雷 (Earl Grey) 伯爵&lt;/b&gt;將中國茶葉調製的祕方帶回給傑克森 (Jacksons) 公司而聞名，主要是紅茶調和品味紅茶的香氣而醞釀的獨特風味。&lt;/li&gt;
&lt;li&gt;仕女伯爵紅茶 (Lady Grey Tea)，紅茶加橘皮、檸檬皮和矢車菊葉所調製的。&lt;/li&gt;
&lt;li&gt;薄荷紅茶&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
參考書籍&lt;br /&gt;
孟樊，寫意紅茶：在杯中、書中、影中品味紅茶，臺北：時報文化，2007。&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/2816718775169373085/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/09/black-tea.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/2816718775169373085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/2816718775169373085'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/09/black-tea.html' title='Black Tea 品味紅茶'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeGvpc5J5vfCG1du9vFABD-qw3o5fj24TZzCVp27g3AgeNXk4Pi0N3QLWD6ar_NH3YEc1IOyYMNEj-SfTnYoLqidct1z7wwU0BuF15fOQLzXFFBRBxPeGThoRw4WSed2Ri_H4xiWx3UM0/s72-c/DSC00482.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-4160729759371407405</id><published>2014-09-12T20:07:00.000+08:00</published><updated>2014-09-12T20:13:01.673+08:00</updated><title type='text'>subprocess 子行程管理</title><content type='html'>&lt;a href=&quot;https://docs.python.org/2/library/subprocess.html&quot; target=&quot;_blank&quot;&gt;subprocess&lt;/a&gt;&amp;nbsp;是 Python &amp;nbsp;程式語言中用來新增子行程的模組，這是在 &lt;a href=&quot;http://legacy.python.org/dev/peps/pep-0324/&quot; target=&quot;_blank&quot;&gt;PEP 324&lt;/a&gt; 中所提出的建議，主要是統一 Python 新增子行程的方法，用來取代 os.system, os.spawn*, os.popen*, popen2.*, commands.* 等這些模組和函式。基本上，&lt;b&gt;在 &amp;nbsp;Python 中如果要新增子行程，你只要知道&amp;nbsp;subprocess&amp;nbsp;模組就行了&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
subprocess 模組最重要的是&amp;nbsp;&lt;a href=&quot;https://docs.python.org/2/library/subprocess.html#subprocess.Popen&quot; target=&quot;_blank&quot;&gt;Popen 類別&lt;/a&gt;，建立 Popen 物件時將會新增子行程去執行你要的工作，Popen 類別用起來比較精細，可操作的地方較多，相對較麻煩一些。因此 subprocess 模組提供下列三種方便的函式來新增子行程，注意到這三個函式是屬於同步呼叫 (synchronous call) 的方式，一定會等到子行程結束才執行下一行程式碼。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;subprocess.&lt;b&gt;call&lt;/b&gt;(args, *, stdin=None, stdout=None, stderr=None, shell=False)&lt;br /&gt;
最簡單的子行程新增方式，執行並等待結束，回傳子行程的回傳值 (return code)。&lt;/li&gt;
&lt;li&gt;subprocess.&lt;b&gt;check_call&lt;/b&gt;(args, *, stdin=None, stdout=None, stderr=None, shell=False)&lt;br /&gt;
呼叫子行程，並判斷回傳值是否為是否為 0，不然就引發&amp;nbsp;CalledProcessError 例外。&lt;/li&gt;
&lt;li&gt;subprocess.&lt;b&gt;check_output&lt;/b&gt;(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)&lt;br /&gt;
呼叫子行程，與&amp;nbsp;subprocess.check_call 函式行為相似，但回傳 stdout 的字串值。&lt;/li&gt;
&lt;/ul&gt;
接下來介紹 Popen 類別，Popen 的建構子如下：&lt;br /&gt;
class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)&lt;br /&gt;
&lt;br /&gt;
Popen 物件則有下列方法和屬性：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;方法&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Popen.poll()：判斷子行程是否結束，如果結束回傳&amp;nbsp;returncode 值，否則回傳 None 。&lt;/li&gt;
&lt;li&gt;Popen.wait()：等待子行程結束，回傳 returncode 值。&lt;/li&gt;
&lt;li&gt;Popen.communicate(input=None)：與子行程通訊，回傳 tuple 資料型態為 (stdoutdata, stderrdata)，注意要通訊的 stdin, stdout, stderr 引數必須設定為 subprocess.PIPE 。&lt;/li&gt;
&lt;li&gt;Popen.send_signal(signal)：送信號給子行程。&lt;/li&gt;
&lt;li&gt;Popen.terminate()：終止子行程，送出 SIGTERM 信號。&lt;/li&gt;
&lt;li&gt;Popen.kill()：停止子行程，送出 SIGKILL 信號。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;屬性&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;stdin：如果建立 Popen 時的 stdin 引數是&amp;nbsp;subprocess.PIPE，那麼這個屬性會是&amp;nbsp;file object，否則為&amp;nbsp;None。&lt;/li&gt;
&lt;li&gt;stdout：如果建立 Popen 時的 stdout 引數是 subprocess.PIPE，那麼這個屬性會是 file object，否則為 None。&lt;/li&gt;
&lt;li&gt;stderr：如果建立 Popen 時的 stderr 引數是&amp;nbsp;subprocess.PIPE，那麼這個屬性會是&amp;nbsp;file object，否則為&amp;nbsp;None。&lt;/li&gt;
&lt;li&gt;pid：子行程的&amp;nbsp;process ID。&lt;/li&gt;
&lt;li&gt;returncode：子行程結束的回傳值，如果子行程還在執行沒有結束，returncode 會是 None 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
最後，注意 shell 引數若設定為 True 時，我們必須確定&lt;b&gt;空白字元&lt;/b&gt;和 &lt;b&gt;shell metacharacters&lt;/b&gt; 有被引號正確地包起來，不然建立子行程會錯誤或不如預期。預設的 shell=False 使&amp;nbsp;subprocess 模組會完整傳送所有字元，包含&amp;nbsp;shell metacharacters。看下列範例會更清楚&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: python&quot;&gt;import subprocess
subprocess.check_output([&#39;printf&#39;,&#39;Hello World\n&#39;])
subprocess.check_output([&#39;printf &quot;Hello World\n&quot;&#39;], shell=True)
subprocess.check_output(&#39;printf &quot;Hello World\n&quot;&#39;, shell=True)
&lt;/pre&gt;
&lt;br /&gt;
上述 3 行程式碼執行結果是相同的，差別在於 shell=True 時必須用引號處理空白和&amp;nbsp;metacharacters，最後一行則是因為序列 (sequence) 的引數只有一個，可以簡化成字串作為引數。&lt;br /&gt;
&lt;br /&gt;
文件中建議，如果讓使用者輸入參數作為子行程的引數會有安全行的問題，容易發生 Shell injection 的危險，如果你很確定引數沒有任何疑慮，使用&amp;nbsp;shell=True 倒是讓程式碼更容易閱讀。&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/4160729759371407405/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/09/subprocess.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4160729759371407405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4160729759371407405'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/09/subprocess.html' title='subprocess 子行程管理'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-2776088354511967643</id><published>2014-08-28T12:30:00.002+08:00</published><updated>2014-08-28T12:30:26.881+08:00</updated><title type='text'>103學年大學校院一覽</title><content type='html'>延續前一篇「&lt;a href=&quot;http://www.reader.idv.tw/2014/08/103.html&quot; target=&quot;_blank&quot;&gt;103學年技專校院一覽&lt;/a&gt;」文章，利用&lt;a href=&quot;http://data.gov.tw/&quot; target=&quot;_blank&quot;&gt;政府資料開放平臺&lt;/a&gt;取得大專校院名錄，再利用程式處理就可以得到103學年的&lt;b&gt;大學校院&lt;/b&gt;清單。&lt;br /&gt;
&lt;div&gt;
&lt;h3&gt;
大學(共61所)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;國立政治大學：&lt;a href=&quot;http://www.nccu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nccu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立清華大學：&lt;a href=&quot;http://www.nthu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nthu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺灣大學：&lt;a href=&quot;http://www.ntu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立成功大學：&lt;a href=&quot;http://www.ncku.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ncku.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立中興大學：&lt;a href=&quot;http://www.nchu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nchu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立交通大學：&lt;a href=&quot;http://www.nctu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nctu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立中央大學：&lt;a href=&quot;http://www.ncu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ncu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立中山大學：&lt;a href=&quot;http://www.nsysu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nsysu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺灣海洋大學：&lt;a href=&quot;http://www.ntou.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntou.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立中正大學：&lt;a href=&quot;http://www.ccu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ccu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立陽明大學：&lt;a href=&quot;http://www.ym.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ym.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺北大學：&lt;a href=&quot;http://www.ntpu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntpu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立嘉義大學：&lt;a href=&quot;http://www.ncyu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ncyu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立高雄大學：&lt;a href=&quot;http://www.nuk.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nuk.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立東華大學：&lt;a href=&quot;http://www.ndhu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ndhu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立暨南國際大學：&lt;a href=&quot;http://www.ncnu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ncnu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺北藝術大學：&lt;a href=&quot;http://www.tnua.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tnua.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺灣藝術大學：&lt;a href=&quot;http://www.ntua.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntua.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺東大學：&lt;a href=&quot;http://www.nttu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nttu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立宜蘭大學：&lt;a href=&quot;http://www.niu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.niu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立聯合大學：&lt;a href=&quot;http://www.nuu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nuu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺南藝術大學：&lt;a href=&quot;http://www.tnnua.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tnnua.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺南大學：&lt;a href=&quot;http://web.nutn.edu.tw/&quot; target=&quot;_blank&quot;&gt;web.nutn.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立體育大學：&lt;a href=&quot;http://www.ntsu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntsu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立金門大學：&lt;a href=&quot;http://www.nqu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nqu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺灣體育運動大學：&lt;a href=&quot;http://www.ntupes.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntupes.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立屏東大學：&lt;a href=&quot;http://www.nptu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nptu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;東海大學：&lt;a href=&quot;http://www.thu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.thu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;輔仁大學：&lt;a href=&quot;http://www.fju.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.fju.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;東吳大學：&lt;a href=&quot;http://www.scu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.scu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中原大學：&lt;a href=&quot;http://www.cycu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cycu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;淡江大學：&lt;a href=&quot;http://www.tku.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tku.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中國文化大學：&lt;a href=&quot;http://www.pccu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.pccu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;逢甲大學：&lt;a href=&quot;http://www.fcu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.fcu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;靜宜大學：&lt;a href=&quot;http://www.pu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.pu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;長庚大學：&lt;a href=&quot;http://www.cgu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cgu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;元智大學：&lt;a href=&quot;http://www.yzu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.yzu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中華大學：&lt;a href=&quot;http://www.chu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.chu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;大葉大學：&lt;a href=&quot;http://www.dyu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.dyu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;華梵大學：&lt;a href=&quot;http://www.hfu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.hfu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;義守大學：&lt;a href=&quot;http://www.isu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.isu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;世新大學：&lt;a href=&quot;http://www.shu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.shu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;銘傳大學：&lt;a href=&quot;http://www.mcu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.mcu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;實踐大學：&lt;a href=&quot;http://www.usc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.usc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;高雄醫學大學：&lt;a href=&quot;http://www2.kmu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www2.kmu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;南華大學：&lt;a href=&quot;http://www.nhu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nhu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;真理大學：&lt;a href=&quot;http://www.au.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.au.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;大同大學：&lt;a href=&quot;http://www.ttu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ttu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;慈濟大學：&lt;a href=&quot;http://www.tcu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tcu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;臺北醫學大學：&lt;a href=&quot;http://www.tmu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tmu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中山醫學大學：&lt;a href=&quot;http://www.csmu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.csmu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;長榮大學：&lt;a href=&quot;http://www.cjcu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cjcu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中國醫藥大學：&lt;a href=&quot;http://www.cmu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cmu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;玄奘大學：&lt;a href=&quot;http://www.hcu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.hcu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;亞洲大學：&lt;a href=&quot;http://www.asia.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.asia.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;開南大學：&lt;a href=&quot;http://www.knu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.knu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;佛光大學：&lt;a href=&quot;http://www.fgu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.fgu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;明道大學：&lt;a href=&quot;http://www.mdu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.mdu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;康寧大學：&lt;a href=&quot;http://www.ukn.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ukn.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;台灣首府大學：&lt;a href=&quot;http://www.tsu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tsu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;臺北市立大學：&lt;a href=&quot;http://www.utaipei.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.uTaipei.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
學院(共4所)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;興國管理學院：&lt;a href=&quot;http://www.hku.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.hku.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;稻江科技暨管理學院：&lt;a href=&quot;http://www.toko.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.toko.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;馬偕醫學院：&lt;a href=&quot;http://www.mmc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.mmc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;法鼓文理學院：&lt;a href=&quot;http://www.ddbc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ddbc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
師範&amp;amp;教育大學(共6所)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;國立臺灣師範大學：&lt;a href=&quot;http://www.ntnu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntnu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立高雄師範大學：&lt;a href=&quot;http://www.nknu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nknu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立彰化師範大學：&lt;a href=&quot;http://www.ncue.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ncue.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺北教育大學：&lt;a href=&quot;http://www.ntue.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntue.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立新竹教育大學：&lt;a href=&quot;http://www.nhcue.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nhcue.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺中教育大學：&lt;a href=&quot;http://www.ntcu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntcu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/2776088354511967643/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/08/103_28.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/2776088354511967643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/2776088354511967643'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/08/103_28.html' title='103學年大學校院一覽'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-6094653559799154455</id><published>2014-08-25T17:04:00.002+08:00</published><updated>2014-09-10T16:44:35.763+08:00</updated><title type='text'>103學年技專校院一覽</title><content type='html'>利用&lt;a href=&quot;http://data.gov.tw/&quot; target=&quot;_blank&quot;&gt;政府資料開放平臺&lt;/a&gt;取得&lt;b&gt;大專校院名錄&lt;/b&gt;，再利用程式處理就可以得到103學年的技專校院清單。&lt;br /&gt;
&lt;br /&gt;
103學年和&lt;a href=&quot;http://www.reader.idv.tw/2013/08/list-of-technological-and-vocational.html&quot; target=&quot;_blank&quot;&gt;102學年的技專校院一覽&lt;/a&gt;轉變說明如下：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;國立臺北商業技術學院 →升格「國立臺北商業大學」&lt;/li&gt;
&lt;li&gt;國立屏東商業技術學院 →與「國立屏東教育大學」合併為「&lt;a href=&quot;http://www.nptu.edu.tw/&quot; target=&quot;_blank&quot;&gt;國立屏東大學&lt;/a&gt;」 (一般大學體系)&lt;/li&gt;
&lt;li&gt;華夏技術學院 →升格「華夏科技大學」&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.edu.tw/news1/detail.aspx?Node=1088&amp;amp;Page=24563&amp;amp;Index=1&amp;amp;WID=560d2ade-378e-4cb6-8cb4-c2ce2b227759&quot; target=&quot;_blank&quot;&gt;永達技術學院&amp;nbsp;停辦&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.edu.tw/news1/detail.aspx?Node=1088&amp;amp;Page=22601&amp;amp;Index=1&amp;amp;WID=560d2ade-378e-4cb6-8cb4-c2ce2b227759&quot; target=&quot;_blank&quot;&gt;高鳳數位內容學院&amp;nbsp;停辦&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
103學年技專校院一覽：&lt;br /&gt;
&lt;div&gt;
&lt;h3&gt;
科技大學(共57所)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;國立臺灣科技大學：&lt;a href=&quot;http://www.ntust.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntust.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立雲林科技大學：&lt;a href=&quot;http://www.yuntech.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.yuntech.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立屏東科技大學：&lt;a href=&quot;http://www.npust.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.npust.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺北科技大學：&lt;a href=&quot;http://www.ntut.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntut.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立高雄第一科技大學：&lt;a href=&quot;http://www.nkfust.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nkfust.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立高雄應用科技大學：&lt;a href=&quot;http://www.kuas.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.kuas.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立虎尾科技大學：&lt;a href=&quot;http://www.nfu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nfu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立高雄海洋科技大學：&lt;a href=&quot;http://www.nkmu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nkmu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立澎湖科技大學：&lt;a href=&quot;http://www.npu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.npu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立勤益科技大學：&lt;a href=&quot;http://www.ncut.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ncut.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺北護理健康大學：&lt;a href=&quot;http://www.ntunhs.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntunhs.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立高雄餐旅大學：&lt;a href=&quot;http://www.nkuht.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nkuht.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺中科技大學：&lt;a href=&quot;http://www.nutc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nutc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺北商業大學：&lt;a href=&quot;http://www.ntcb.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntcb.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;朝陽科技大學：&lt;a href=&quot;http://www.cyut.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cyut.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;南臺科技大學：&lt;a href=&quot;http://www.stust.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.stust.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;崑山科技大學：&lt;a href=&quot;http://www.ksu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ksu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;嘉南藥理大學：&lt;a href=&quot;http://www.chna.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.chna.edu.tw&lt;/a&gt;&amp;nbsp;(補充：自民國103年7月21日起變更為「&lt;a href=&quot;http://www.cnu.edu.tw/news-single.asp?id=534&quot; target=&quot;_blank&quot;&gt;www.cnu.edu.tw&lt;/a&gt;」)&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;樹德科技大學：&lt;a href=&quot;http://www.stu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.stu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;龍華科技大學：&lt;a href=&quot;http://www.lhu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.lhu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;輔英科技大學：&lt;a href=&quot;http://www.fy.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.fy.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;明新科技大學：&lt;a href=&quot;http://www.must.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.must.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;弘光科技大學：&lt;a href=&quot;http://www.hk.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.hk.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;健行科技大學：&lt;a href=&quot;http://www.uch.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.uch.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;正修科技大學：&lt;a href=&quot;http://www.csu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.csu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;萬能科技大學：&lt;a href=&quot;http://www.vnu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.vnu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;建國科技大學：&lt;a href=&quot;http://www.ctu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ctu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;明志科技大學：&lt;a href=&quot;http://www.mcut.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.mcut.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;高苑科技大學：&lt;a href=&quot;http://www.kyu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.kyu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;大仁科技大學：&lt;a href=&quot;http://www.tajen.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tajen.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;聖約翰科技大學：&lt;a href=&quot;http://www.sju.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.sju.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;嶺東科技大學：&lt;a href=&quot;http://www.ltu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ltu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中國科技大學：&lt;a href=&quot;http://www.cute.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cute.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中臺科技大學：&lt;a href=&quot;http://www.ctust.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ctust.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;台南應用科技大學：&lt;a href=&quot;http://www.tut.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tut.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;遠東科技大學：&lt;a href=&quot;http://www.feu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.feu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;元培醫事科技大學：&lt;a href=&quot;http://www.ypu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ypu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;景文科技大學：&lt;a href=&quot;http://www.just.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.just.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中華醫事科技大學：&lt;a href=&quot;http://www.hwai.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.hwai.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;東南科技大學：&lt;a href=&quot;http://www.tnu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tnu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;德明財經科技大學：&lt;a href=&quot;http://www.takming.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.takming.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;南開科技大學：&lt;a href=&quot;http://www.nkut.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.nkut.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中華科技大學：&lt;a href=&quot;http://www.cust.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cust.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;僑光科技大學：&lt;a href=&quot;http://www.ocu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ocu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;育達科技大學：&lt;a href=&quot;http://www.ydu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ydu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;美和科技大學：&lt;a href=&quot;http://www.meiho.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.meiho.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;吳鳳科技大學：&lt;a href=&quot;http://www.wfu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.wfu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;環球科技大學：&lt;a href=&quot;http://www.twu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.twu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中州科技大學：&lt;a href=&quot;http://www.ccut.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ccut.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;修平科技大學：&lt;a href=&quot;http://www.hust.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.hust.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;長庚科技大學：&lt;a href=&quot;http://new.cgust.edu.tw/&quot; target=&quot;_blank&quot;&gt;new.cgust.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;台北城市科技大學：&lt;a href=&quot;http://www.tpcu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tpcu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;大華科技大學：&lt;a href=&quot;http://www.tust.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tust.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;醒吾科技大學：&lt;a href=&quot;http://www.hwu.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.hwu.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;南榮科技大學：&lt;a href=&quot;http://www.njtc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.njtc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;文藻外語大學：&lt;a href=&quot;http://www.wtuc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.wtuc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;華夏科技大學：&lt;a href=&quot;http://www.hwh.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.hwh.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
技術學院(共17所)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;國立臺灣戲曲學院：&lt;a href=&quot;http://www.tcpa.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tcpa.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;大漢技術學院：&lt;a href=&quot;http://www.dahan.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.dahan.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;慈濟技術學院：&lt;a href=&quot;http://www.tccn.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tccn.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;和春技術學院：&lt;a href=&quot;http://www.fotech.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.fotech.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;致理技術學院：&lt;a href=&quot;http://www.chihlee.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.chihlee.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;亞東技術學院：&lt;a href=&quot;http://www.oit.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.oit.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;桃園創新技術學院：&lt;a href=&quot;http://www.tiit.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tiit.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;德霖技術學院：&lt;a href=&quot;http://www.dlit.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.dlit.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;蘭陽技術學院：&lt;a href=&quot;http://www.fit.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.fit.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;黎明技術學院：&lt;a href=&quot;http://www.lit.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.lit.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;東方設計學院：&lt;a href=&quot;http://www.tf.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tf.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;經國管理暨健康學院：&lt;a href=&quot;http://www.cku.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cku.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;崇右技術學院：&lt;a href=&quot;http://www.cit.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cit.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;大同技術學院：&lt;a href=&quot;http://www.ttc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ttc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;亞太創意技術學院：&lt;a href=&quot;http://w2.apic.edu.tw/&quot; target=&quot;_blank&quot;&gt;w2.apic.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;臺灣觀光學院：&lt;a href=&quot;http://www.tht.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tht.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;台北海洋技術學院：&lt;a href=&quot;http://www.tcmt.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tcmt.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
專科學校(共14所)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;國立臺南護理專科學校：&lt;a href=&quot;http://www.ntin.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntin.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;國立臺東專科學校：&lt;a href=&quot;http://www.ntc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ntc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;康寧醫護暨管理專科學校：&lt;a href=&quot;http://www.knjc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.knjc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;馬偕醫護管理專科學校：&lt;a href=&quot;http://www.mkc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.mkc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;仁德醫護管理專科學校：&lt;a href=&quot;http://www.jente.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.jente.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;樹人醫護管理專科學校：&lt;a href=&quot;http://www.szmc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.szmc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;慈惠醫護管理專科學校：&lt;a href=&quot;http://www.tzuhui.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.tzuhui.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;耕莘健康管理專科學校：&lt;a href=&quot;http://www.ctcn.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.ctcn.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;敏惠醫護管理專科學校：&lt;a href=&quot;http://www.mhchcm.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.mhchcm.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;高美醫護管理專科學校：&lt;a href=&quot;http://www.kmvs.khc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.kmvs.khc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;育英醫護管理專科學校：&lt;a href=&quot;http://www.yuhing.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.yuhing.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;崇仁醫護管理專科學校：&lt;a href=&quot;http://www.cjc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.cjc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;聖母醫護管理專科學校：&lt;a href=&quot;http://www.smc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.smc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;新生醫護管理專科學校：&lt;a href=&quot;http://www.web.hsc.edu.tw/&quot; target=&quot;_blank&quot;&gt;www.web.hsc.edu.tw&lt;/a&gt;&lt;a href=&quot;https://www.blogger.com/null&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
註：上述學校順序不具任何意義，純粹是電腦程式自動排列輸出。&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/6094653559799154455/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/08/103.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/6094653559799154455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/6094653559799154455'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/08/103.html' title='103學年技專校院一覽'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-427993929444445316</id><published>2014-07-11T21:46:00.000+08:00</published><updated>2014-07-11T21:47:53.465+08:00</updated><title type='text'>如果這不是 Scrum，那什麼才是 Scrum？</title><content type='html'>&lt;ul&gt;
&lt;li&gt;選擇 Scrum 的原因是什麼？為什麼不用其他敏捷方法？&lt;/li&gt;
&lt;li&gt;團隊裡面有多少人真的瞭解 Scrum ，Scrum 有正確執行嗎？&lt;/li&gt;
&lt;li&gt;如果現在執行的不是 Scrum，那什麼才是 Scrum？&lt;/li&gt;
&lt;/ul&gt;
上述 3 個問題是我最近的疑惑，於是把之前&lt;b&gt;台灣第一本專門介紹 Scrum 的中文書&lt;/b&gt;&lt;a href=&quot;http://www.reader.idv.tw/2012/07/teddy-scrum.html&quot; target=&quot;_blank&quot;&gt;笑談軟體工程：敏捷開發法的逆襲&lt;/a&gt;拿出來複習，我也把 Teddy 老師 (北科大校友) 的&amp;nbsp;&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/&quot; target=&quot;_blank&quot;&gt;搞笑談軟工&lt;/a&gt; 上面有關Scrum的文章看了一遍，順便整理歸納一下 (如下3篇)，方便大家有系統地瀏覽閱讀。&lt;br /&gt;
&lt;h2&gt;
認識篇&lt;/h2&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2014/01/scrum.html&quot; target=&quot;_blank&quot;&gt;為什麼要採用Scrum？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2010/01/scrum.html&quot; target=&quot;_blank&quot;&gt;Scrum 是一種制度&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum.html&quot; target=&quot;_blank&quot;&gt;Scrum 不會幫你解決問題&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/02/scrum-2.html&quot; target=&quot;_blank&quot;&gt;Scrum 不會幫你解決問題（2）&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/12/scrum-1.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（1）：雙重回饋機制&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/12/scrum-2.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（2）：Scrum 的內涵&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum-3.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（3）：三種補充文件&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum-4.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（4）：Product Backlog&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum-5-sprint-planning-meeting.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（5）：初探 Sprint Planning Meeting&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum-6sprint-planning-meeting.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（6）：Sprint Planning Meeting 眉角&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum-7daily-scrum.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（7）：Daily Scrum&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum-7sprint-demo-meeting.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（8）：Sprint Demo Meeting&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum-9retrospective-meeting.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（9）：Retrospective Meeting&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum-10.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（10）：時程估算&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum-11.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（11）：不信邪之流程改善精神&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/02/scrum-12focus-factorunplanned-items.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（12）：不要再用focus factor與unplanned items了&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/02/scrum-13focus-factor.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（13）：為什麼不建議使用focus factor？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/02/scrum-14.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（14）：好問題&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/03/scrum-15scrum-master.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（15）：誰適合當Scrum Master？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/03/scrum-16story.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（16）：Story寫得好才容易估算(上)&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/03/scrum-17story.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（17）：Story寫得好才容易估算(下)&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/03/scrum-18story-point.html&quot; target=&quot;_blank&quot;&gt;Scrum 是什麼（18）：到底為什麼要估算Story Point哩？&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
觀念篇&lt;/h2&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/11/blog-post_8.html&quot; target=&quot;_blank&quot;&gt;敏捷精神&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/07/blog-post_31.html&quot; target=&quot;_blank&quot;&gt;馬蓋先與敏捷精神&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/10/blog-post_31.html&quot; target=&quot;_blank&quot;&gt;敏捷開發與軟體架構&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/03/blog-post_7.html&quot; target=&quot;_blank&quot;&gt;敏捷開發團隊所需基本技能&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2010/03/blog-post.html&quot; target=&quot;_blank&quot;&gt;就是這個光： Scrum + Lean + XP&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/06/1.html&quot; target=&quot;_blank&quot;&gt;鬆弛讓你更敏捷（1）&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/06/2.html&quot; target=&quot;_blank&quot;&gt;鬆弛讓你更敏捷（2）：每日工時&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/06/3.html&quot; target=&quot;_blank&quot;&gt;鬆弛讓你更敏捷（3）：不好的進度表&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/01/scrum_17.html&quot; target=&quot;_blank&quot;&gt;Scrum 是一組餐具&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/06/scrum.html&quot; target=&quot;_blank&quot;&gt;Scrum團隊之持續產品開發模式&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2010/06/scrum.html&quot; target=&quot;_blank&quot;&gt;拜託，這是 Scrum 耶&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/06/scrum.html&quot; target=&quot;_blank&quot;&gt;捧油，Scrum 在那裡？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/05/scrumdesign-patterns.html&quot; target=&quot;_blank&quot;&gt;Scrum與Design Patterns&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/06/design-thinkingscrumpattern.html&quot; target=&quot;_blank&quot;&gt;把Design Thinking放入Scrum與Pattern之中&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2010/05/scrum.html&quot; target=&quot;_blank&quot;&gt;導入 Scrum？謝謝再聯絡。&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/10/scrumteddy.html&quot; target=&quot;_blank&quot;&gt;導入Scrum很貴嗎？Teddy算給你看&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/10/scrum.html&quot; target=&quot;_blank&quot;&gt;Scrum釘子戶&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/09/slow-startscrum.html&quot; target=&quot;_blank&quot;&gt;Slow-start：導入Scrum首部曲&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/12/scrum.html&quot; target=&quot;_blank&quot;&gt;導入Scrum三部曲&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/05/blog-post_29.html&quot; target=&quot;_blank&quot;&gt;可是約耳說要關在自己專屬的房間啊&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/02/blog-post.html&quot; target=&quot;_blank&quot;&gt;是不為也，非不能也&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/03/blog-post_28.html&quot; target=&quot;_blank&quot;&gt;都市游擊隊&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2014/01/blog-post_30.html&quot; target=&quot;_blank&quot;&gt;紀律&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2014/01/blog-post_28.html&quot; target=&quot;_blank&quot;&gt;捨我其誰之我不知道要做多久&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/05/story.html&quot; target=&quot;_blank&quot;&gt;同學，Story不是這樣寫滴&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2010/07/story-point.html&quot; target=&quot;_blank&quot;&gt;Story point 為何沒有單位：相對論篇&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/03/scrum_14.html&quot; target=&quot;_blank&quot;&gt;從成語學Scrum&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2009/11/scrum_26.html&quot; target=&quot;_blank&quot;&gt;我真是猜不透你啊：Scrum 篇&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/03/scrum.html&quot; target=&quot;_blank&quot;&gt;Scrum 之逆練九陰真經&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/03/blog-post_23.html&quot; target=&quot;_blank&quot;&gt;同誰，九陰真經不是這樣子練滴&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/05/blog-post_17.html&quot; target=&quot;_blank&quot;&gt;再忙，也要跟你開個自省會議&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2014/01/retrospective-meeting.html&quot; target=&quot;_blank&quot;&gt;影響Retrospective Meeting成效的四個問題&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2009/11/retrospective-meeting.html&quot; target=&quot;_blank&quot;&gt;Retrospective Meeting = 許願池&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/11/scrum.html&quot; target=&quot;_blank&quot;&gt;Scrum團隊如何打考績：有所本篇&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/08/scrum_21.html&quot; target=&quot;_blank&quot;&gt;Scrum團隊如何打考績：鬼扯篇&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/03/run-scrum.html&quot; target=&quot;_blank&quot;&gt;我不能 run Scrum，因為我家人不同意&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/08/scrum-kanban.html&quot; target=&quot;_blank&quot;&gt;Scrum 與 Kanban應用環境&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/08/kanbanscrum.html&quot; target=&quot;_blank&quot;&gt;系統管理團隊結合Kanban與Scrum的經驗&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/08/scrumscrumban.html&quot; target=&quot;_blank&quot;&gt;從Scrum到Scrumban的經驗&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2014/06/scrumkanban.html&quot; target=&quot;_blank&quot;&gt;我去年想嘗試Scrum，今年想用Kanban&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/11/kanban-scrum.html&quot; target=&quot;_blank&quot;&gt;用 Kanban + Scrum 支援大型專案&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/11/kanban-scrum-2.html&quot; target=&quot;_blank&quot;&gt;用 Kanban + Scrum 支援大型專案(2)：分組方式&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/11/kanban-scrum-3.html&quot; target=&quot;_blank&quot;&gt;用 Kanban + Scrum 支援大型專案(3)：三層式每日站立會議&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/11/kanban-scrum-4dod.html&quot; target=&quot;_blank&quot;&gt;用 Kanban + Scrum 支援大型專案(4)：DoD&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/08/agilekanban.html&quot; target=&quot;_blank&quot;&gt;遊戲團隊結合Agile與Kanban的經驗&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/09/kanban.html&quot; target=&quot;_blank&quot;&gt;Kanban在電信業產品維護團隊的經驗（上）&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/09/kanban_3.html&quot; target=&quot;_blank&quot;&gt;Kanban在電信業產品維護團隊的經驗（下）&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/09/kanban_13.html&quot; target=&quot;_blank&quot;&gt;Kanban還少了點什麼&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
問答篇&lt;/h2&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/10/scrum.html&quot; target=&quot;_blank&quot;&gt;只有一個開發人員可以採用Scrum嗎？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/05/scrum.html&quot; target=&quot;_blank&quot;&gt;Scrum團隊不是要互相分工合作嗎？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/10/scrum_18.html&quot; target=&quot;_blank&quot;&gt;導入Scrum真的可以提升一倍的生產力嗎？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2014/07/scrum.html&quot; target=&quot;_blank&quot;&gt;等團隊技術能力提升，再來嘗試Scrum？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/03/scrum_18.html&quot; target=&quot;_blank&quot;&gt;小員工如何說服老闆導入Scrum？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/09/blog-post_7.html&quot; target=&quot;_blank&quot;&gt;你可能改變團隊，但改變老闆？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/09/startup-scrum.html&quot; target=&quot;_blank&quot;&gt;Startup 要不要採用Scrum?&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/02/bugscrum.html&quot; target=&quot;_blank&quot;&gt;專案Bug太多要不要導入Scrum？&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2010/05/story-point.html&quot; target=&quot;_blank&quot;&gt;如何估算 story point？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/06/story.html&quot; target=&quot;_blank&quot;&gt;老問題：Story 做不完怎麼辦？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/12/storytask.html&quot; target=&quot;_blank&quot;&gt;Story與Task的估算單位為什麼不同？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2010/03/sprint.html&quot; target=&quot;_blank&quot;&gt;萬事起頭難：如何開始第一個 Sprint？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/05/scrummaster1.html&quot; target=&quot;_blank&quot;&gt;如何做好ScrumMaster（1）？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2013/02/blog-post_8.html&quot; target=&quot;_blank&quot;&gt;功能做不完怎麼辦？&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/11/scrum_13.html&quot; target=&quot;_blank&quot;&gt;Scrum 分享活動答客問&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/04/blog-post_18.html&quot; target=&quot;_blank&quot;&gt;答客問&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2011/04/blog-post_19.html&quot; target=&quot;_blank&quot;&gt;答客問 (二)&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2014/05/scrum.html&quot; target=&quot;_blank&quot;&gt;Scrum 答客問 (三)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/06/scrum-faq-1.html&quot; target=&quot;_blank&quot;&gt;Scrum FAQ (1)&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/07/scrum-faq-2.html&quot; target=&quot;_blank&quot;&gt;Scrum FAQ (2)&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/08/scrum-faq-3.html&quot; target=&quot;_blank&quot;&gt;Scrum FAQ (3)&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://teddy-chen-tw.blogspot.tw/2012/08/scrum-faq-4.html&quot; target=&quot;_blank&quot;&gt;Scrum FAQ (4)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
最後推薦給大家 Teddy 老師的「笑談軟體工程」系列叢書，不想用行動購買的，也請大家多多瀏覽&amp;nbsp;&lt;b&gt;搞笑談軟工&lt;/b&gt;，期望台灣開發軟體的方法能有較正確的觀念和態度。&lt;br /&gt;
&lt;br /&gt;
開什麼玩笑！談軟體工程：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.delightpress.com.tw/book.aspx?book_id=SKNA00005&quot; target=&quot;_blank&quot;&gt;笑談軟體工程：例外處理設計的逆襲&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.delightpress.com.tw/book.aspx?book_id=SKNA00001&quot; target=&quot;_blank&quot;&gt;笑談軟體工程：敏捷開發法的逆襲&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/427993929444445316/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/07/scrum-scrum.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/427993929444445316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/427993929444445316'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/07/scrum-scrum.html' title='如果這不是 Scrum，那什麼才是 Scrum？'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-3920720628194333094</id><published>2014-07-03T12:54:00.001+08:00</published><updated>2014-07-11T14:13:22.927+08:00</updated><title type='text'>Yeoman 自耕農</title><content type='html'>&lt;a href=&quot;http://yeoman.io/&quot; target=&quot;_blank&quot;&gt;Yeoman&lt;/a&gt; 是一個可以幫助我們快速開發 Web 的&lt;b&gt;鷹架工具 (scaffolding tool)&lt;/b&gt;，規定最佳實踐 (best practices) 的方法，使得 Web 的開發工作更具生產力。Yeoman 是使用稱為「&lt;b&gt;產生器(Generator)&lt;/b&gt;」的外掛方式擴充，使用&amp;nbsp;Generator 可以快速產生 Web 所需的目錄結構和程式庫檔案，於是&amp;nbsp;&amp;nbsp;Web 的開發不需要去煩惱這些瑣事，開發者可以專心寫程式去解決問題。&lt;br /&gt;
&lt;br /&gt;
Yeoman 事實上是 3 個工具的組合 (stack)，各自負責不同的工作。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yeoman/yo&quot; target=&quot;_blank&quot;&gt;yo&lt;/a&gt;&lt;br /&gt;
鷹架工具，執行&amp;nbsp;Yeoman 的&amp;nbsp;Generator，用來產生 Web 鷹架。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gruntjs.com/&quot; target=&quot;_blank&quot;&gt;Grunt&lt;/a&gt;&lt;br /&gt;
建置工具，用來自動化執行任務工作，例如最佳化 HTML 輸出檔案、啟動測試伺服器等。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bower.io/&quot; target=&quot;_blank&quot;&gt;Bower&lt;/a&gt;&lt;br /&gt;
套件管理工具，用來管理程式庫的相依性，例如某些 CSS 套件需要 jQuery 就會一起安裝。&lt;/li&gt;
&lt;/ul&gt;
在 Ubuntu 上安裝&amp;nbsp;Yeoman 必須先擁有 &lt;b&gt;Node.js 套件管理程式&lt;/b&gt;，也就是 &lt;a href=&quot;https://www.npmjs.org/&quot; target=&quot;_blank&quot;&gt;npm&lt;/a&gt;，只要安裝&amp;nbsp;Node.js 後就有&amp;nbsp;npm 可以使用，執行下列指令安裝&amp;nbsp;Yeoman：(注意要變成 root，在執行 npm 安裝 yo 套件)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;sudo su
npm install -g yo
yo --version&lt;/pre&gt;
&lt;br /&gt;
雖然說指令上只有 yo 套件，但執行後會一併安裝&amp;nbsp;yo, grunt, bower 共 3 個工具。&lt;br /&gt;
&lt;br /&gt;
接著滿重要的是，要安裝需要的Generator，一開始是沒有任何&amp;nbsp;Generator，請參考&amp;nbsp;&lt;a href=&quot;http://yeoman.io/generators/official.html&quot; target=&quot;_blank&quot;&gt;Generator 清單&lt;/a&gt;，最常用的大概是 &lt;a href=&quot;https://github.com/yeoman/generator-webapp&quot; target=&quot;_blank&quot;&gt;webapp&amp;nbsp;產生器&lt;/a&gt;，Generator 使用 npm 安裝，以 webapp 產生器來說指令是：&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;sudo su
npm install -g generator-webapp
yo --generators
exit
mkdir my-yo-project
cd my-yo-project
yo webapp&lt;/pre&gt;
&lt;br /&gt;
Generator 的套件名稱通常以&amp;nbsp;generator- 為字首，但應以各個&amp;nbsp;Generator 的網站為依據。Yeoman 的操作請參考官方的 &lt;a href=&quot;http://yeoman.io/learning/index.html&quot; target=&quot;_blank&quot;&gt;Getting started&lt;/a&gt; ，其中&amp;nbsp;Grunt 和&amp;nbsp;Bower 的功能較多，詳細內容可以參閱各自的網站。&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/3920720628194333094/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/07/yeoman.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/3920720628194333094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/3920720628194333094'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/07/yeoman.html' title='Yeoman 自耕農'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-2305843245645396674</id><published>2014-06-25T18:45:00.001+08:00</published><updated>2014-07-10T21:50:12.352+08:00</updated><title type='text'>自我監控分析報告技術 監控工具 smartmontools</title><content type='html'>現代的磁碟機都有&lt;b&gt;自我監控分析報告技術&lt;/b&gt; (Self-Monitoring, Analysis and Reporting Technology, 簡稱 &lt;b&gt;SMART&lt;/b&gt;)，利用 SMART 的資訊我們可以取得磁碟衰退 (degradation) 和故障 (failure) 的警告，提早更換有問題的磁碟機以避免資料損毀。&lt;br /&gt;
&lt;br /&gt;
在 Linux 平台上，我們可以使用 &lt;a href=&quot;http://www.smartmontools.org/&quot; target=&quot;_blank&quot;&gt;smartmontools&lt;/a&gt; 套件讀取磁碟的 SMART 資訊，&lt;br /&gt;
Ubuntu 上安裝的指令是 &amp;nbsp;sudo apt-get -y install smartmontools，&lt;br /&gt;
以下說明皆以 Ubuntu distribution 為主。在smartmontools 套件中包含兩個公用程式 (utility programs)：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.smartmontools.org/browser/trunk/smartmontools/smartctl.8.in&quot; target=&quot;_blank&quot;&gt;smartctl&lt;/a&gt;&lt;br /&gt;
控制和讀取磁碟的 SMART 資訊，與執行 SMART 的測試，指令的最後一個引數是裝置名稱 (例如 /dev/sda )，記得執行 smartctl 需要 root 的權限。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.smartmontools.org/browser/trunk/smartmontools/smartd.8.in&quot; target=&quot;_blank&quot;&gt;smartd&lt;/a&gt;&lt;br /&gt;
監控&amp;nbsp;(monitor) SMART 磁碟的服務程式 (daemon)，&lt;a href=&quot;http://www.smartmontools.org/browser/trunk/smartmontools/smartd.conf.5.in&quot; target=&quot;_blank&quot;&gt;smartd設定檔&lt;/a&gt;位於&amp;nbsp;/etc/smartd.conf，預設是每1800秒 (30分鐘) 檢查磁碟的 SMART 資訊。&lt;/li&gt;
&lt;/ul&gt;
smartctl 和&amp;nbsp;smartd 的使用方法可以參考說明文件，沒有什麼困難的地方。比較需要注意的是 SMART 中有三種測試，這些「測試」的意義和我們認知不太一樣！(下面的 device 是指你的磁碟機位置，例如 /dev/sda )&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;線上測試 (online-testing)&lt;br /&gt;
磁碟的&amp;nbsp;SMART 功能開啟時就會進行的「測試」，對效能沒有影響，利用 smartctl -s on device 指令可以開啟線上測試功能。&lt;/li&gt;
&lt;li&gt;離線測試 (offline-testing)&lt;br /&gt;
每隔4小時進行的「測試」，若磁碟忙碌中則延後執行，對效能可能有影響，利用 smartctl -o on device 指令可以開啟自動離線測試的功能，或是使用 smartctl -t offline device 立即執行離線測試。&lt;/li&gt;
&lt;li&gt;自我測試 (self-testing)&lt;br /&gt;
分成&lt;b&gt;簡短自我測試 (short self-test)&lt;/b&gt; 和&lt;b&gt;擴充自我測試 (extended self-test)&lt;/b&gt; 兩種，擴充自我測試也稱為完整自我測試 (long self-test) ，自我測試需要花費數分鐘至數百分鐘進行，其測試結果會在 SMART 日誌 (Log) 上顯示。使用 smartctl -t short device 或 smartctl -t long device 執行自我測試，再使用&amp;nbsp;smartctl -l selftest device 查看檢查結果。&lt;/li&gt;
&lt;/ul&gt;
嚴格來說，SMART 的&lt;b&gt;線上測試&lt;/b&gt;和&lt;b&gt;離線測試&lt;/b&gt;不能稱為「測試」，線上和離線測試事實上只是更新磁碟 SMART 屬性的數值，因此應該稱為&lt;b&gt;資料收集 (data collection)&lt;/b&gt; 較為貼切，在 smartctl 的說明文件提到使用「測試」一詞是個不幸，容易讓人們混淆。在 smartctl 的「Test」一詞都是指離線測試，而「Self-Test」 則是指自我測試。&lt;br /&gt;
&lt;br /&gt;
如果要使用&amp;nbsp;smartd 當我們監控磁碟狀態，建議安裝 smartmontools 套件執行 sudo service smartd start 啟動服務程式，另外執行 sudo update-rc.d smartd defaults 讓系統啟動時執行&amp;nbsp;smartd&amp;nbsp;服務程式。&lt;br /&gt;
&lt;br /&gt;
最後說明&amp;nbsp;SMART 的屬性 (Attributes)， 每個屬性有個 ID 和名稱，ID 是從 1 至 253 的整數。屬性有 3 個重要的數值：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;RAW_VALUE&lt;br /&gt;
屬性的原始數值&lt;/li&gt;
&lt;li&gt;VALUE&lt;br /&gt;
正規化 (Normalized) 的數值，各磁碟製造商利用自家的演算法將 RAW_VALUE 轉換成&amp;nbsp;1 至 254 的整數&lt;/li&gt;
&lt;li&gt;THRESH&lt;br /&gt;
門檻 (Threshold) 值，範圍從 0 至 255 的整數。&lt;b&gt;當 VALUE 小於或等於 THRESH 則代表故障 (failure)。&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
另外說明屬性的 TYPE 和&amp;nbsp;UPDATED 欄位。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;TYPE 代表屬性的意義，有兩種類型：&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Pre-failure&lt;br /&gt;
預先故障的屬性，當VALUE 低於 THRESH 表示磁碟即將故障。&lt;/li&gt;
&lt;li&gt;Old age&lt;br /&gt;
已使用的屬性，當VALUE 低於 THRESH 表示磁碟超出使用期限與設計的耗損次數。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;UPDATED&amp;nbsp;代表屬性的更新方式，有兩種類型：&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Always&lt;br /&gt;
正常運作下，或是執行離線測試時都會更新數值。&lt;/li&gt;
&lt;li&gt;Offline&lt;br /&gt;
只有在離線測試時才會更新數值。&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
講了這麼多，不如直接看執行的結果會比較清楚，在我的電腦上執行 sudo smartctl -A /dev/sda，得到下列的屬性結果。&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;smartctl 5.41 2011-06-09 r3365 [x86_64-linux-3.11.0-24-generic] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x0033   120   120   050    Pre-fail  Always       -       0
  5 Reallocated_Sector_Ct   0x0033   100   100   003    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       132766029055628
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       249
171 Unknown_Attribute       0x000a   000   000   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   000   000   000    Old_age   Always       -       0
174 Unknown_Attribute       0x0030   000   000   000    Old_age   Offline      -       23
177 Wear_Leveling_Count     0x0000   000   000   000    Old_age   Offline      -       0
181 Program_Fail_Cnt_Total  0x000a   000   000   000    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   000   000   000    Old_age   Always       -       0
187 Reported_Uncorrect      0x0012   100   100   000    Old_age   Always       -       0
194 Temperature_Celsius     0x0022   038   089   000    Old_age   Always       -       38 (Min/Max 15/89)
195 Hardware_ECC_Recovered  0x001c   120   120   000    Old_age   Offline      -       0
196 Reallocated_Event_Count 0x0033   100   100   003    Pre-fail  Always       -       0
201 Soft_Read_Error_Rate    0x001c   120   120   000    Old_age   Offline      -       0
204 Soft_ECC_Correction     0x001c   120   120   000    Old_age   Offline      -       0
230 Head_Amplitude          0x0013   100   100   000    Pre-fail  Always       -       100
231 Temperature_Celsius     0x0013   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0032   000   000   000    Old_age   Always       -       1010
234 Unknown_Attribute       0x0032   000   000   000    Old_age   Always       -       569
241 Total_LBAs_Written      0x0032   000   000   000    Old_age   Always       -       569
242 Total_LBAs_Read         0x0032   000   000   000    Old_age   Always       -       472
&lt;/pre&gt;
&lt;br /&gt;
補充說明，這個 /dev/sda 是 SSD，所以有些屬性不會在硬碟上出現。&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/2305843245645396674/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/06/smartmontools.html#comment-form' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/2305843245645396674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/2305843245645396674'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/06/smartmontools.html' title='自我監控分析報告技術 監控工具 smartmontools'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-5942892218350970713</id><published>2014-06-18T18:38:00.000+08:00</published><updated>2014-06-24T11:35:30.101+08:00</updated><title type='text'>collectd 系統資訊收集服務</title><content type='html'>&lt;a href=&quot;http://collectd.org/&quot; target=&quot;_blank&quot;&gt;collectd&lt;/a&gt; 是收集與統計系統資訊的一個服務程式 (daemon)，並將這些資訊儲存成不同方式，如 &lt;a href=&quot;http://oss.oetiker.ch/rrdtool/&quot; target=&quot;_blank&quot;&gt;RRD&lt;/a&gt; 檔案或資料庫等。這些統計資料 (statistics) 有什麼用途呢？可以用來做&lt;b&gt;效能分析 (performance analysis)&lt;/b&gt;，找出系統的瓶頸，也可以用作&lt;b&gt;容量規劃 (capacity planning)&lt;/b&gt;，預測系統的負載。&lt;br /&gt;
&lt;br /&gt;
在 Ubuntu 上安裝&amp;nbsp;collectd 相當容易，指令是：sudo apt-get -y install collectd，官方目前最新的是 5.4版，不過目前在 Ubuntu 12.04 上的版本是 collectd 4.10。安裝完成之後，有3個設定檔位於：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;/etc/collectd/collectd.conf：主要設定檔。&lt;/li&gt;
&lt;li&gt;/etc/collectd/filters.conf：過濾器的設定檔，用於4.6版新增的&lt;b&gt;規則鍊 (chain)&lt;/b&gt; 功能。&lt;/li&gt;
&lt;li&gt;/etc/collectd/thresholds.conf：門檻值的設定檔，用於4.3版新增的&lt;b&gt;監控 (monitoring)&lt;/b&gt; 功能。&lt;/li&gt;
&lt;/ul&gt;
collectd 是採用&lt;b&gt;外掛架構 (plug-in architecture&lt;/b&gt;) 的設計，因此設定檔大部分都是設定&amp;nbsp;plugin 如何運作。目前官方總共有111個外掛，這些 &lt;a href=&quot;https://collectd.org/wiki/index.php/Table_of_Plugins&quot; target=&quot;_blank&quot;&gt;plugins&lt;/a&gt; 主要分成輸入和輸出兩大類，說明如下：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;輸入外掛 (Input plugins)&lt;/b&gt;&lt;br /&gt;在 collectd 中屬於讀取 (read) 類型，定期從系統查詢 (query) 資訊，並將這些數值資訊派送 (dispatch) 回 collectd&amp;nbsp;服務程式，這類外掛佔了絕大多數。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;輸出外掛 (Output plugins)&lt;/b&gt;&lt;br /&gt;在 collectd 中屬於寫入 (write) 類型，處理&amp;nbsp;collectd 派送的資訊，一般而言是將這些資訊寫入 RRD 或 CSV 檔案，或是透過網路送至遠端。&lt;/li&gt;
&lt;/ul&gt;
某些外掛兼具輸入與輸出兩種功能，如AMQP, Network, UnixSock 這類通訊用途的外掛程式，提供資訊的讀取和寫入。除了上述兩大類外，還有下列三種類型 (占少數)：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;日誌外掛 (Logging plugins)&lt;br /&gt;將訊息寫入系統日誌 (syslog) 中，或是自訂的日誌檔。&lt;/li&gt;
&lt;li&gt;通知外掛 (Notification plugins)&lt;br /&gt;在監控功能中，當門檻值超出設定範圍後，&amp;nbsp;collectd 將發出的通知訊息，這類外掛將接收通知訊息進行處理，通常是發出 email 告知系統管理員。&lt;/li&gt;
&lt;li&gt;繫結外掛 (Binding plugins)&lt;br /&gt;在 collectd 中執行 Java, Perl, Python 的程式，通常是用來開發自己的外掛程式，透過繫結外掛載入並執行。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9QfMKpthKIJqm01-BNyxaFrWQOBzIfmcPeSwy7hl0eIWoEzez5EJwgXI96zs0pJ7xK88rbmtNsKEHwYV7nta4LiINlaIfCDKhkT6_-tIlQraE5uwBpw6qSanlzRUJuiH_e0bpUj6SkSU/s1600/collectd.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9QfMKpthKIJqm01-BNyxaFrWQOBzIfmcPeSwy7hl0eIWoEzez5EJwgXI96zs0pJ7xK88rbmtNsKEHwYV7nta4LiINlaIfCDKhkT6_-tIlQraE5uwBpw6qSanlzRUJuiH_e0bpUj6SkSU/s1600/collectd.png&quot; height=&quot;480&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
這些外掛是以 Shared Object 的方式存在 ( .so 檔案)，位於&amp;nbsp;/usr/lib/collectd 路徑之下。在設定檔中，Interval 設定是比較重要的參數，&lt;b&gt;Interval&amp;nbsp;參數決定 collectd 多久從輸入外掛讀取資料，預設是 10 秒查詢系統資訊一次&lt;/b&gt;，你也可以各別設定每個外掛的 Interval&amp;nbsp;參數，例如 df 外掛用於統計磁碟使用量，我們就可以將 df 的&amp;nbsp;Interval 設大一點，因為磁碟空間的變化量不會太大。&lt;br /&gt;
&lt;br /&gt;
整體來說，collectd 內建大量外掛，加上繫結功能方便開發自己的外掛，可以補足內建不足的部分，設定方式也相當簡單 (主要是 collectd.conf )，非常適合用來收集與統計系統資訊。collectd 的缺點大概是監控功能稍弱 (這不是 collectd 的強項)，缺乏應用服務的監控，畢竟 collectd 主要是收集數據用途 (所以才叫做 collect daemon )，不是用來判別系統是否正常或異常。&lt;br /&gt;
&lt;br /&gt;
若是要求監控功能，建議使用&amp;nbsp;&lt;a href=&quot;http://www.nagios.org/&quot; target=&quot;_blank&quot;&gt;Nagios&lt;/a&gt;&amp;nbsp;這套軟體。可以另外安裝&amp;nbsp;&lt;a href=&quot;http://packages.ubuntu.com/precise/collectd-utils&quot; target=&quot;_blank&quot;&gt;collectd-utils 套件&lt;/a&gt;，此套件中有 &lt;a href=&quot;https://collectd.org/documentation/manpages/collectd-nagios.1.shtml&quot; target=&quot;_blank&quot;&gt;collectd-nagios 程式&lt;/a&gt;，可以將 Nagios 結合&amp;nbsp;collectd 一起運作。利用 collectd 的 unixsock&amp;nbsp;外掛配合&amp;nbsp;collectd-nagios 程式，Nagios 可以擷取&amp;nbsp;collectd 的統計資料進行系統監控。&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/5942892218350970713/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/06/collectd.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/5942892218350970713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/5942892218350970713'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/06/collectd.html' title='collectd 系統資訊收集服務'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9QfMKpthKIJqm01-BNyxaFrWQOBzIfmcPeSwy7hl0eIWoEzez5EJwgXI96zs0pJ7xK88rbmtNsKEHwYV7nta4LiINlaIfCDKhkT6_-tIlQraE5uwBpw6qSanlzRUJuiH_e0bpUj6SkSU/s72-c/collectd.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-7723964500024004731</id><published>2014-06-13T22:18:00.000+08:00</published><updated>2014-06-13T22:27:50.414+08:00</updated><title type='text'>即時串流通信協定 RTSP</title><content type='html'>即時串流通信協定&amp;nbsp;(&lt;b&gt;Real Time Streaming Protocol&lt;/b&gt;, RTSP) 是應用層的通訊協定，定義在 &lt;a href=&quot;http://tools.ietf.org/html/rfc2326&quot; target=&quot;_blank&quot;&gt;RFC 2326&lt;/a&gt; 規範中，RTSP 是用來控制具有即時與同步特性的資料，如音訊和視訊的媒體，資料來源包含現場即時轉播和儲存的片段剪輯，媒體資料與控制資料是採用交錯式 (interleaving) 的方式傳送。&lt;br /&gt;
&lt;br /&gt;
RTSP 沒有連線的概念，而是在伺服器維護 ID 以識別&lt;b&gt;對話 (session)&lt;/b&gt;，RTSP 也沒有限制底下傳輸層的通訊協定，你可以用 TCP 或 UDP 來傳送 RTSP 訊息，一個用戶端可以建立多個連線傳送一個 RTSP 對話。RTSP 控制多個傳送之間的對話，包含選擇傳送通道的方式，以及資料傳送的機制。&lt;br /&gt;
&lt;br /&gt;
媒體來源用URL識別，例如 rtsp://example.com/live.sdp 或 rtspu://example.com/live.sdp，&lt;b&gt;rtsp是以TCP傳輸，而rtspu則是以UDP傳輸&lt;/b&gt;，沒有指定埠號的話，&lt;b&gt;RTSP 預設是用 port 554&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
RTSP 與 HTTP 有些相似，通訊協定的觀念上八九不離十，如果你知道&amp;nbsp;HTTP ，那麼認識&amp;nbsp;RTSP 會更容易一些。不過，RTSP 與 HTTP 差異的地方如下：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;RTSP 增加許多新的方法 (method)，還有不同的識別ID。&lt;/li&gt;
&lt;li&gt;RTSP 伺服器需要維護狀態，但 HTTP 本質上就是無狀態 (stateless)。&lt;br /&gt;(所以開發一個 RTSP伺服器會比 HTTP&amp;nbsp;伺服器還要複雜...)&lt;/li&gt;
&lt;li&gt;RTSP 中，伺服端和用戶端都可以發出請求 ( request)。&lt;/li&gt;
&lt;li&gt;RTSP 的資料是載於不同協定上 (通常使用 RTP 通訊協定)，但 HTTP 是在 HTTP 協定本身的 Message Body中。&lt;/li&gt;
&lt;li&gt;RTSP 的訊息是用 UTF-8 編碼，而 HTTP 是用&amp;nbsp;ISO-8859-1&amp;nbsp;編碼。&lt;/li&gt;
&lt;li&gt;RTSP 的請求總是包含絕對的 URI，而&amp;nbsp;HTTP 請求則是絕對路徑和主機位置分開在 Header 中。&lt;/li&gt;
&lt;/ul&gt;
相同的地方有：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;都是以文字為基礎 (text-based) 的通訊協定，易於擴充。也都是以 CR LF 結尾。&lt;/li&gt;
&lt;li&gt;都是用 Message 的方式請求和回應，信息包含&amp;nbsp;Header 和&amp;nbsp;Body 兩個部分。&lt;/li&gt;
&lt;li&gt;都定義 5 大類的狀態碼 (Status Code)，分類也相同：&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;1xx: 資訊 (Informational)&lt;/li&gt;
&lt;li&gt;2xx: 成功 (Success)&lt;/li&gt;
&lt;li&gt;3xx: 轉向 (Redirection)&lt;/li&gt;
&lt;li&gt;4xx: 用戶端錯誤 (Client Error)&lt;/li&gt;
&lt;li&gt;5xx: 伺服端錯誤 (Server Error)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
如果你對於 HTTP 已經有相當的認識，那麼了解 RSTP 也不是一件困難的事。在 RTSP 當中有幾個術語比較重要，這裡特別提出來說明。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;媒體串流 (Media stream)&lt;br /&gt;或稱串流，是單一的媒體實體。當串流使用的是 RTP 通訊協定時，串流則是指由 RTP 和 RTCP 封包建立的媒體。&lt;/li&gt;
&lt;li&gt;呈現 (Presentation)&lt;br /&gt;由一個或多個串流所組成，在用戶端足以構成完整的媒體。&lt;/li&gt;
&lt;li&gt;呈現描述 (Presentation description)&lt;br /&gt;定義一個呈現中串流的資訊，包含編碼方式、網路位置和內容資訊。通常是用&amp;nbsp;SDP (Session Description Protocol) 規範所定義的資訊。&lt;/li&gt;
&lt;li&gt;聚集控制 (Aggregate control)&lt;br /&gt;在伺服器上使用單一時間軸控制多個串流，意思是用戶端送出單一個播放訊息就可以同時控制音訊和視訊兩種串流的輸出。&lt;/li&gt;
&lt;/ul&gt;
總結來說，RTSP 像是串流媒體的遙控器，或是遠端控制多媒體伺服器的方法，至於串流媒體是用哪種協定規範，這就不在 RTSP 定義之中。(串流媒體的協定參考 RTP，定義在 &lt;a href=&quot;http://tools.ietf.org/html/rfc3550&quot; target=&quot;_blank&quot;&gt;RFC 3550&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/7723964500024004731/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/06/real-time-streaming-protocol.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/7723964500024004731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/7723964500024004731'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/06/real-time-streaming-protocol.html' title='即時串流通信協定 RTSP'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-1717962905466324639</id><published>2014-05-21T18:53:00.000+08:00</published><updated>2014-07-14T11:25:48.033+08:00</updated><title type='text'>Node.js 伺服端事件驅動非阻斷式平台</title><content type='html'>&lt;a href=&quot;http://nodejs.org/&quot; target=&quot;_blank&quot;&gt;Node.js&lt;/a&gt; 是一個建於&amp;nbsp;&lt;a href=&quot;https://code.google.com/p/v8/&quot; target=&quot;_blank&quot;&gt;V8 JavaScript 引擎&lt;/a&gt;上的一套伺服端平台，採用 JavaScript 程式語言，Node.js 使用事件驅動 (event-driven)、非阻斷式 (non-blocking) 的輸入/輸出模型，因此具有輕量級、高效率的特性，特別適合用於資料密集 (data-intensive)、即時 (real-time) 的應用領域。&lt;br /&gt;
&lt;h2&gt;
為什麼創造Node.js&lt;/h2&gt;
Node.js 的創造者瑞安‧達爾 (Ryan Dahl) 在 &lt;a href=&quot;http://shop.oreilly.com/product/0636920015956.do&quot; target=&quot;_blank&quot;&gt;Node: Up and Running&lt;/a&gt; 一書的&lt;a href=&quot;http://chimera.labs.oreilly.com/books/1234000001808/pr01.html&quot; target=&quot;_blank&quot;&gt;前言&lt;/a&gt;說明&amp;nbsp;Node.js 的緣起。Ryan 在2008年尋找用於建置網站的程式語言平台，他注意到&lt;b&gt;推送 (server push)&lt;/b&gt; 這項技術，伺服器將資料推送給用戶，而不是讓使用者以輪巡 (polling) 的方式取得。當時的方式是，伺服器接收請求後，依序發送資料給用戶端，伺服器本身必須處理一堆開啟且閒置的連線，這顯然不是個好方法。&lt;br /&gt;
&lt;br /&gt;
Ryan 知道 C 語言如何解決這個問題，使用&amp;nbsp;Non-Blocking Sockets 的方式可以有效降低閒置連線的成本 (overhead)，因此一台伺服器將能處理上千個閒置連線並且有很高的吞吐量 (throughput)。不過這種方法有兩個問題：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Ryan 不想使用&amp;nbsp;C 語言開發，他想使用動態語言。雖然任何程式語言可以用系統呼叫的方式做，但那會讓程式碼變醜，也僅是另一種Socket程式設計罷了。&lt;/li&gt;
&lt;li&gt;他認為使用 Non-Blocking Sockets根本上是困難的，只要是&amp;nbsp;Non-Blocking 的方法就會讓開發變得困難。&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
在 2008 年 9 月 Google 發表 Chrome 瀏覽器和高效能 JavaScript 引擎 V8 ，執行較快的&amp;nbsp;JavaScript 引擎可以讓網頁速度更快，而 V8 確實讓網頁執行速度快了很多，突然間Google, Apple, Mozilla, 和 Microsoft 開始在&amp;nbsp;JavaScript 引擎上展開競賽。與此同時，Douglas Crockford的「&lt;a href=&quot;http://shop.oreilly.com/product/9780596517748.do&quot; target=&quot;_blank&quot;&gt;JavaScript：優良部分&lt;/a&gt;」這本書的出版，讓鄙視的 JavaScript 變成一種重要的程式語言。&lt;br /&gt;
&lt;br /&gt;
Ryan 有個偉大的想法：&lt;b&gt;JavaScript 的&amp;nbsp;Non-Blocking Sockets&lt;/b&gt;，由於&amp;nbsp;JavaScript 沒有現成的 Socket 程式庫，所以&amp;nbsp;Ryan 可以是第一個引進這種 Socket&amp;nbsp;，並希望提供更好的介面。他所要做的事是：將高效能 JavaScript 引擎 V8 結合 C 語言開發的&amp;nbsp;Non-Blocking Sockets，Ryan 辭掉他的工作，全心全意實現這個想法。&lt;/div&gt;
&lt;br /&gt;
JavaScript 與 Non-Blocking Sockets 結合得非常好，這個特點不是一開始就很明顯清楚的。&lt;b&gt;閉包 (closure)&lt;/b&gt; 讓一切都有可能，人們可以用幾行&amp;nbsp;JavaScript 程式碼完成非常複雜的非阻斷式伺服器。 他原本擔心 Node.js 會變成不能用的平台，但隨著世界各地的社群高手開發程式庫，Ryan 舒緩他的憂慮，由於單一的 Event Loop 和完全的非阻斷式介面，程式庫將可以越加越複雜而不需要採用昂貴的執行緒。&lt;br /&gt;
&lt;br /&gt;
在&amp;nbsp;Node.js 中，使用者發現預設情況下就能容易擴展 (scale)。在於系統核心不允許使用者做出很可怕的事情，例如阻斷運行中的執行緒，所以效能不會顯著地下降，比起傳統阻斷式的方式好上一個數量級 (10倍以上)，可以處理更多的流量。&lt;br /&gt;
&lt;br /&gt;
從上述內容我們可以知道 Non-Blocking 是一件重要的事情，為何需要&amp;nbsp;Non-Blocking 呢？傳統上，伺服器會開啟一定數量的程序(或執行緒)處理連線，&lt;b&gt;當這些程序因為處理 I/O而被 block 時，這個程序將只能等待回應而不能服務其他用戶，由於伺服器開啟的程序數量有上限，阻斷的程序將嚴重影響服務的吞吐量&lt;/b&gt;，特別是一堆開啟且閒置的連線。如果有&amp;nbsp;Non-Blocking 的處理方式，則整體效率將可以提升。&lt;br /&gt;
&lt;h2&gt;
為何要使用Node.js&lt;/h2&gt;
Node.js 用優雅的方法解決&amp;nbsp;Blocking 問題，提供&amp;nbsp;Non-Blocking 的 I/O 程式庫，採用非同步 (Asynchronous) 的呼叫方式，利用簡單的 Event Loop 實作 ，因而具有輕量級、高效率的特性。加上用&amp;nbsp;JavaScript 為程式語言，不需要使用多程序或多執行緒的程式架構，大幅降低學習門檻，提高開發成效。&lt;br /&gt;
&lt;br /&gt;
了解這些開發背景，那些地方適合使用&amp;nbsp;Node.js 呢？我想大概有這些地方：&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;需要伺服端推送資料的應用程式。(長時間的閒置連線)&lt;/li&gt;
&lt;li&gt;資料處理密集的應用程式。(I/O次數非常高)&lt;/li&gt;
&lt;li&gt;具有擴展需求、大量並行處理、即時性的應用程式。&lt;/li&gt;
&lt;li&gt;統一以 JavaScript 程式語言開發的應用程式。&lt;/li&gt;
&lt;/ol&gt;
這些應用特性符合 Node.js 的長處，也才能發揮&amp;nbsp;Node.js 的效益。如果是開發傳統的網頁應用程式(如留言板、部落格等)，不妨以PHP、Python的框架平台進行開發，畢竟這些資源比&amp;nbsp;&amp;nbsp;Node.js 還多，也比較純熟，使用上會更有幫助些。&lt;br /&gt;
&lt;br /&gt;
參考書籍：&lt;br /&gt;
&lt;a href=&quot;http://chimera.labs.oreilly.com/books/1234000001808/index.html&quot; target=&quot;_blank&quot;&gt;Tom Hughes-Croucher &amp;amp; Mike Wilson, Node: Up and Running,&amp;nbsp;O&#39;Reilly Media, 2012&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;
如何安裝&amp;nbsp;Node.js&lt;/h2&gt;
請先到&lt;a href=&quot;http://nodejs.org/download/&quot; target=&quot;_blank&quot;&gt;下載頁面&lt;/a&gt;下載 Node.js ，如果你的系統是 Windows，那就用&amp;nbsp;Windows Installer (.msi)&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;吧！這是最簡單的安裝方式。如果你的系統是 Linux ，可以選擇下載&amp;nbsp;Source Code 自己編譯，或是下載&amp;nbsp;Binaries (注意你的系統是 32 或 64 位元)。以下指令是在 Ubuntu 上自己編譯&amp;nbsp;Node.js，提供大家參考。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;apt-get -y install build-essential
tar xzvf node-v0.10.28.tar.gz
cd node-v0.10.28
./configure
make
sudo make install

node -v

npm
&lt;/pre&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/1717962905466324639/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/05/nodejs.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1717962905466324639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/1717962905466324639'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/05/nodejs.html' title='Node.js 伺服端事件驅動非阻斷式平台'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6149981107192626306.post-4455252250352716127</id><published>2014-05-19T11:41:00.001+08:00</published><updated>2014-05-19T11:46:54.811+08:00</updated><title type='text'>wxPython 跨平台視窗程式庫</title><content type='html'>&lt;a href=&quot;http://www.wxpython.org/&quot; target=&quot;_blank&quot;&gt;wxPython&lt;/a&gt; 是一套 Python 的 GUI 工具 (toolkit)，可以讓我們簡單快速地建立圖形化的使用者介面 (Graphical User Interface, GUI)，wxPython 實際上是將另一套 &lt;a href=&quot;http://wxwidgets.org/&quot; target=&quot;_blank&quot;&gt;wxWidgets&lt;/a&gt; 程式庫包成 Python 可以使用的套件。由於 wxWidgets 本身是一跨平台 (cross-platform) 的程式庫，因此利用&amp;nbsp;wxPython 開發的應用程式也是可以跨平台的，加上&amp;nbsp;wxWidgets 是呼叫系統原生的 API，其運行速度是相當快速。wx 的 w 指的是 Microsoft Windows，而 x&amp;nbsp;指的則是 X Window系統。&lt;br /&gt;
&lt;br /&gt;
wxPython 在&amp;nbsp;Ubuntu 上的運作是這樣：wxPython →&amp;nbsp;wxWidgets&amp;nbsp;→&amp;nbsp;&lt;a href=&quot;http://www.gtk.org/&quot; target=&quot;_blank&quot;&gt;GTK+&lt;/a&gt;&amp;nbsp;。若是在 Windows 上則是：wxPython →&amp;nbsp;wxWidgets&amp;nbsp;→ Windows API 。大部分的事情已經在 wxWidgets 做掉了，&lt;b&gt;wxPython 是 Python 和&amp;nbsp;wxWidgets 之間的橋樑&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
了解 wxPython 的運作原理，我們可以試著裝起來用用看，在 Ubuntu 上安裝&amp;nbsp;wxPython 相當簡單，請執行下列指令：&lt;br /&gt;
sudo apt-get install python-wxgtk2.8&lt;br /&gt;
sudo apt-get install python-wxtools wx2.8-i18n&lt;br /&gt;
&lt;br /&gt;
學習&amp;nbsp;wxPython 實際上就是學習&amp;nbsp;wxWidgets ，我們用 Python 去呼叫&amp;nbsp;wxWidgets 提供的功能。&lt;b&gt;在&amp;nbsp;wxPython 之中的視窗稱之為「Frame」，而不是「Window」&lt;/b&gt;，這點需要特別留意，觀念上很容易混淆，所有的視窗都是繼承 &lt;a href=&quot;http://wxpython.org/docs/api/wx.Frame-class.html&quot; target=&quot;_blank&quot;&gt;Frame&lt;/a&gt; 類別。wxPython &amp;nbsp;提供相當多的工具項 (Widgets) 類別，學習時建議先認識有哪些&lt;b&gt;控制項 (Controls) &lt;/b&gt;，屬於&amp;nbsp;&lt;a href=&quot;http://wxpython.org/docs/api/wx.Control-class.html&quot; target=&quot;_blank&quot;&gt;Control&lt;/a&gt;&amp;nbsp;的子類別，例如常用的按鈕 (button)、文字方塊 (text box)等。&lt;br /&gt;
&lt;br /&gt;
至於新手入門的話，可以先看這篇&amp;nbsp;&lt;a href=&quot;http://wiki.wxpython.org/Getting%20Started&quot; target=&quot;_blank&quot;&gt;Getting started with wxPython&lt;/a&gt;&amp;nbsp;，若需要進一步的&amp;nbsp;API 說明，則可以閱下列連結的內容：&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://wxpython.org/docs/api/&quot;&gt;http://wxpython.org/docs/api/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.wxwidgets.org/2.8/wx_classesbycat.html&quot;&gt;http://docs.wxwidgets.org/2.8/wx_classesbycat.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
整體來說，利用&amp;nbsp;wxPython 開發應用程式具有跨平台的優點，加上以 Python 語言進行撰寫，使得我們可以簡單又快速地建立視窗應用程式。然而&amp;nbsp;wxPython 缺乏一個好用的 IDE 開發工具，像是 Visual Studio 可以用拖拉方式建立應用程式，稍微讓&amp;nbsp;wxPython 的開發顯得不甚完善。如果想用圖形化方式建立&amp;nbsp;wxPython 應用程式，則是可以參考&amp;nbsp;&lt;a href=&quot;http://www.wxdesigner-software.de/&quot; target=&quot;_blank&quot;&gt;wxDesigner&lt;/a&gt; 和 &lt;a href=&quot;http://sourceforge.net/projects/wxformbuilder/&quot; target=&quot;_blank&quot;&gt;wxFormBuilder&lt;/a&gt;&amp;nbsp;這兩項快速開發工具。&lt;br /&gt;
&lt;br /&gt;
###</content><link rel='replies' type='application/atom+xml' href='http://t5318019-ee.blogspot.com/feeds/4455252250352716127/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://t5318019-ee.blogspot.com/2014/05/wxpython.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4455252250352716127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6149981107192626306/posts/default/4455252250352716127'/><link rel='alternate' type='text/html' href='http://t5318019-ee.blogspot.com/2014/05/wxpython.html' title='wxPython 跨平台視窗程式庫'/><author><name>Zheng-Yuan Wu</name><uri>http://www.blogger.com/profile/11445480880895206040</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>