網頁

搜尋此網誌

2014年12月28日 星期日

Wisdom and Teachings

記錄一些原則與智慧,取自『柯維經典語錄』一書。

責任心 (Accountability)
  • 沒有任何事情比許下承諾卻無法遵守,更快破壞彼此的信任。相反地,沒有任何事情比信守承諾更能夠建立信任。
  • 想要改善任何情況,你必須先改善自己。想要改變你的妻子,你必須先改變自己。想改變你丈夫的態度,你必須先改變自身的態度。想贏得更多的自由,你必須更有責任心、更加自律。
平衡 (Balance)
  • 關鍵不在於排出你行程表上的優先順序,而在於規劃出你人生的優先順序。
選擇 (Choice)
  • 每個人都有四種與生俱來的天賦,自我察覺、良知、獨立意志和創造力。他們賦予人類無限的自由:選擇、回應,以及改變的力量。
  • 真正傷害我們的並不是事件本身,是我們對於該事件的反應傷害了我們。
  • 人類最大的自由在於我們有權、也有能力決定要如何讓其他人,或每件事情影響我們。
  • 你所處的環境是由你的想法、你的信念、你的理想、你的人生觀所形塑出來的;只要你的想法、信念、理想、人生觀沒有改變,你的環境就不會改變。
貢獻 (Contribution)
  • 我們每個人的內心深處,都嚮往偉大且有貢獻的人生 — 真正有意義、且有所作為的非凡人生。在家裡、在職場上,以及在社會裡,我們可以有自覺地選擇遠離平庸的生活,活出偉大的人生。
  • 這世上有成功者,也有貢獻者。許多成功者也會貢獻,但他們大多只是準備要付出,卻未真的貢獻。你們應該把貢獻當做今生的使命。
勇氣 (Courage)
  • 人生最大的風險在於不敢承擔一絲風險。
效能 (Effectiveness)
  • 再多更好的建議,若沒有解決真正的問題,都只是空談而已,一點用處也沒有。
  • 忙碌不等於高效能:有的人雖然忙翻天,效率卻不高。
同理心 (Empathy)
  • 要影響別人,關鍵在於懂得感同身受。
  • 如果要我用一句話總結人際關係最重要的原則,那麼根據我多年的觀察,我會這麼說:若想別人了解你,請先了解別人。
  • 你愈深入了解別人,你會愈欣賞他們,你也會愈發敬重他們。跟別人的靈魂接觸,形同行走在聖殿當中。
  • 話語就像是高處丟下的雞蛋:一旦丟出,你無法叫他們回頭;對於他們落地後造成的髒亂,你也無法視而不見。
真誠正直 (Integrity)
  • 不要替別人的短處辯白,也不要為自己的缺點辯護。當你犯了錯,就承認它、修正它、並從中學到教訓 — 立刻去做!
  • 解決問題不能光說不練,你必須走進問題核心去解決它。
領導力 (Leadership)
  • 有效的領導是要事優先處理。有效的管理則是紀律至上,而且要確實執行。
  • 在工業時代,領導是個職位。在知識時代,領導是種選擇。
學習 (Learning)
  • 知道了卻不去做,跟不知道沒有兩樣。
愛 (Love)
  • 從你對一個人的態度,可以看出你是怎麼對待其他人的,因為所有人都是一個整體。
  • 人與人之間的關係裡,沒有不重要的小事,全都是大事。
潛能 (Potential)
  • 人有自我察覺的能力:有了這樣的自覺,我們才能在心裡跳脫自我,從旁檢視自身的信念以及行動,去思考自己究竟思考的是什麼。
自律 (Self-Discipline)
  • 大多數人會把紀律與不自由劃上等號,但事實上恰好相反:堅持紀律的人才是真正自由的人,不守紀律的人則會淪為情緒、慾望與激情的奴隸。
綜合統效 (Synergy)
  • 如果兩人看法相同,其中一人必屬多餘。
  • 綜合統效跟妥協不一樣,在妥協裡,一加一頂多只等於一個半。
信任 (Trust)
  • 想要別人信任你,首先做個值得信任的人。
真理 (Truth)
  • 我們看待問題的方式,本身就是一大問題。
  • 原則與實務不同;實務只適用於特定情況,但原則卻是更深層、更根本的真理,它通用於各種情況。
願景 (Vision)
  • 一個人的本性,決定了他看待事物的角度。
  • 工作本身不會有未來,未來只存在你自己的身上。
  • 要想有效改變自己,我們首先必須改變自己的看法。
雙贏 (Win-Win)
  • 或許在真正懂得分享之前,我們需要先經歷擁有的感覺。
  • 為自己著想,但不忘他人的權益。

資料來源:
史蒂夫.柯維(Stephen R. Covey)著,胡琦君譯,柯維經典語錄:18個關鍵原則,創造成功人生,台北:遠見天下文化,2013。譯自:The wisdom and teachings of Stephen R. Covey

###

2014年10月29日 星期三

Zero to One

如果你想用創業去改變未來,那你一定要看彼得‧提爾 (Peter Thiel) 的「從0到1:打開世界運作的未知祕密,在意想不到之處發現價值」。彼得是 PayPal 的創辦人,現在是矽谷創投公司創辦人基金 (Founder Fund) 的合夥人,這本書源自於彼得在史丹佛大學開設的創業課程,他的學生布雷克‧馬斯特 (Blake Masters) 做了詳盡的筆記後廣為流傳,後來兩人合作改寫成「從 0 到 1 」出版,這本書主要談的就是:如何建立一個可以創新的公司


創新是一種進步,作者在第一章提到進步有兩種型式:
  • 垂直或密集式的進步 (vertical or intensive progress)
    開發新的事物,這是從 0 到 1 的進步,例如科技 (technology) 的發展。
  • 水平或延伸式的進步 (horizontal or extensive progress)
    複製已經成功的事物,這是從 1 到 n 的進步,例如全球化 (globalization) 的發展。
這本書談的創新是「從 0 到 1 」這種形式的進步,那我們要如何建立一個可以「創新」的公司呢?作者要我們先從這個問題開始回答:
有什麼是你跟其他人有不同看法,但是你覺得很重要的事實?
創業家從 1999 年的網路泡沫中得到教訓,但作者的看法則有不同,如下:
  1. 循序漸進,但大膽冒險比無聊瑣碎好
  2. 保持精簡有彈性,但壞計畫比沒計畫好
  3. 面對競爭求取進步,但競爭市場賺不到錢,要成為獨占市場的企業
  4. 專注在產品,而非專注銷售。但銷售與競爭一樣重要,不同產品需要不同的銷售方法
大致上整本書圍繞著上述幾個觀點,作者分享他的看法,說明如何建立一個可以創新的公司。如推薦所言:「當一個有冒險精神的人願意寫書,就買來看。如果寫書的是彼得‧提爾,就看兩遍。但是保險起見,請看三遍。因為這本書絕對是經典之作。」確實如此!

彼得‧提爾 (Peter Thiel)、布雷克‧馬斯特 (Blake Masters),季晶晶譯,從0到1:打開世界運作的未知祕密,在意想不到之處發現價值,台北:天下雜誌,2014。
譯自:Zero to One: Notes on Startups, or How to Build the Future

###

2014年10月14日 星期二

Project Management 專案管理

什麼是專案?

專案 (Project) 是在一次性的工作中,必須同時完成成效 (performance)時間 (time)成本 (cost)範疇 (scope) 的多重任務要求,簡稱為 PCTS。換句話說,一個專案必須有特定的成效,有明確的開始和結束時間,有預算,也有明確規範工作的大小。另外,品管學者約瑟夫.朱蘭(Joseph M. Juran) 說:「專案是為了解決問題所排定的進度表。」這是更簡單的解釋。

什麼是專案管理?

為了完成專案的目標,將所有計劃、進度與管控的行動無瑕的結合運作 (facilitate),這就是專案管理。專案管理的首要原則:一定要讓未來會牽涉到專案實際作業的人,共同參與專案計畫的工作。專案管理不同於一般的管理,在於專案的 PCTS 任務特性,例如一般事務性的工作內容,就沒有這些特性。

一個專案中的角色成員

  • 專案經理 (Project Manager)
    專案的啟動者 (Enabler),領導並且協助團隊成員順利完成他們所負責的工作。
  • 團隊成員 (Team Members)
    實際執行工作的人員,負責完成專案所訂定的目標。
  • 成員可能是組織中可用的人才 (不見得是適合的人才),因專案的需要才加入團隊中,也可能專案結束後就離開此團隊。
  • 贊助者 (Sponsor)
    指定 PCTS 中的任意 3 個限制條件。另外一個條件是由專案經理所計劃與管理。

專案的生命週期

  1. 概念
    市場概念形成,競爭力調查
  2. 定義
    定義問題,產生願景,擬定專案任務大綱
  3. 計畫
    發展策略,實行計畫,風險管理
  4. 執行
    逐項完成工作,監控過程,修正錯誤
  5. 結案
    結論報告,檢討回顧

參考資料
詹姆斯.路易斯 (James P. Lewis)著,葛迺駿譯,我懂了!專案管理,台北:經濟新潮社,2003。

註:「迺」讀「ㄋㄞˇ」
###

2014年10月6日 星期一

AngularJS

AngularJS 是一個用於動態網頁應用程式 (dynamic web apps) 的結構框架 (structural framework),AngularJS 的特點在於強化 HTML 本身的功能,讓我們利用 HTML 的語法就能建立一個動態的網頁應用程式。之所以稱為「Angular」是源於 HTML 的「角括號的尖角」,AngularJS 有 HTML 延伸的意涵在裡面。換句話說,如果想要學習 AngularJS 這個框架,必須對於 HTML 有基本的認識。

HTML 是一種專門描述靜態文件的宣告式語言 (declarative language),HTML告訴瀏覽器該做什麼,但沒辦法說明該如何執行功能,本質上不能使用 HTML 建立動態網頁應用程式。意思是說,靜態文件與動態網頁應用程式之間存在著「阻抗不匹配 (impedance mismatch)」的問題。

有兩種方式解決阻抗不匹配的問題:
  • 程式庫 (library)
    程式庫包含很多開發應用程式需要的函式,呼叫這些函式實現我們需要的功能,例如 jQuery 就是其中的一種。
  • 框架 (framework)
    針對某種應用情境設計的程式架構,我們需要在架構中填入程式碼以實現功能,例如 durandal, ember 等。
然而 AngularJS 選擇另一種不同的解決方法,AngularJS 增強 HTML 的語法,使用 JavaScript 開發 HTML 編譯器,讓瀏覽器能夠解析這些新的語法,AngularJS 稱為指令 (directive)

AngularJS 所採取的是宣告式語言這一條路,因此在 AngularJS 的學習上,使用指令會比撰寫 JavaScript 還要來的重要,大部分都是在編輯 HTML 檔案 (也就是使用 directive)。這也和其他用戶端的框架不太一樣,像是 ember, Ext JS 等,因為這類框架採取的是命令式語言 (imperative language) 這一條路 ,開發上主要是撰寫 JavaScript。

前面提到框架是針對某種應用情境設計的程式架構,AngularJS 的設計主要是針對資料類型的開發,也就是 CRUD (create, read, update and delete) 的應用程式。遊戲與 GUI 操作的應用程式就不太適合使用 AngularJS 了, CRUD 應用類型是 AngularJS 的強項

目前 (2014/10) 沒有關於 AngularJS 的中文書籍,對於國內推廣 AngularJS 會有些困難。學習上大多是英文網站的資訊,這裡推薦W3Schools 的 AngularJS Tutorial ,頗為簡要而易懂,其他資源則請參考 AngularJS 官方網站:
上述內容參考自 Developer Guide / Introduction
###

2014年9月20日 星期六

Black Tea 品味紅茶

最近研究了一下紅茶,在此分享有關紅茶的知識。

紅茶茶葉原產於中國,但卻是英國塑造了紅茶文化,紅茶變成茶的主流,甚至是茶的代名詞。英國人稱紅茶為「Black Tea」是因為紅茶茶葉是黑色的緣故,而我們東方稱為紅茶是因為紅茶茶湯色澤呈現紅褐色的緣故。

奶茶:紅茶加牛奶,或是牛奶加紅茶,這是經濟上的考量,有兩種說法。過去茶葉是奢侈品,為了能夠多喝幾杯,於是加入較便宜的牛奶。另一種說法則是有段時間牛奶供不應求,如果添加紅茶在牛奶之中,就能夠減少牛奶的使用量。不論何者真實,奶茶確實是好喝的飲品之一!

茶葉以產地聞名,也通常以產地命名。全世界公認的紅茶生產地有三個國家:印度、錫蘭與中國,其出產的紅茶如下:
  • 印度,產地位於印度東北部
    • 阿薩姆省 (Assam),稱為阿薩姆紅茶
    • 西孟加拉省 (West Bengal) 的大吉嶺 (Darjeeling),稱為大吉嶺紅茶
  • 斯里蘭卡 (Sri Lanka),統稱為錫蘭紅茶 (Ceylon Tea)。
    • 烏沃省 (Uva)
    • 努沃勒埃利耶區 (Nuwara Eliya)
    • 汀普拉村 (Dimbula)
  • 中國
    • 安徽省祁門縣,出產的紅茶稱為「祁紅」。(祁:讀作ㄑ一 ˊ)
除了上述三個國家外,生產紅茶比較著名國家的還有肯亞、爪哇、台灣。


接下來介紹紅茶的等級 (Grade),所謂的等級和品質無關,純粹只是區分茶葉的大小和生長部位。為什麼要分級呢?因為與泡茶的時間有關,越大片的茶葉沖泡的時間越長。紅茶的等級如下,依照茶葉生長位置由上而下(葉片由小至大):
  • 花橙黃白毫 (Flowery Orange Pekoe, 簡稱 FOP)
  • 橙黃白毫 (Orange Pekoe, 簡稱 OP)
  • 白毫 (Pekoe, 簡稱 P)
  • 白毫小種 (Pekoe Souchong, 簡稱 PS)
  • 小種 (Souchong, 簡稱 S)
若依茶葉的完整性,有沒有切碎處理,可以分為下列 3 種:
  • 全葉茶 (Leaf, 沒有簡稱),或稱葉茶。
  • 碎茶 (Broken, 簡稱 B),或稱散茶。沖泡時間較全葉茶短。
  • 粉茶 (Dust, 簡稱 D),或稱末茶。沖泡時間最短,分級過程中剩下的細粉狀茶葉,通常也最廉價。
了解產地與分級,最後介紹紅茶的調和變化,這大概是紅茶比較特別的地方。從產地出來是怎樣就是怎樣的紅茶,稱為原味茶,或稱產地茶。而調和兩種以上的原味茶,則稱為混合茶。若是在原味紅茶製作過程加入其他果香味,則是加味茶。以下是這些變化中較知名的紅茶清單:
  • 原味茶 (Plain Tea)
    • 阿薩姆 (Assam Tea)
    • 大吉嶺 (Darjeeling Tea)
  • 混合茶 (Blended Tea)
    • 英國早餐茶 (English Breakfast Tea),混合印度、錫蘭或肯亞的產地茶調配而成的紅茶。
    • 英國下午茶 (English Afternoon Tea),混合印度及非洲的產地茶調和而成的紅茶。
  • 加味茶 (Flavoured Tea)
    • 伯爵茶 (Earl Grey Tea),在中國的英國外交使節格雷 (Earl Grey) 伯爵將中國茶葉調製的祕方帶回給傑克森 (Jacksons) 公司而聞名,主要是紅茶調和品味紅茶的香氣而醞釀的獨特風味。
    • 仕女伯爵紅茶 (Lady Grey Tea),紅茶加橘皮、檸檬皮和矢車菊葉所調製的。
    • 薄荷紅茶
參考書籍
孟樊,寫意紅茶:在杯中、書中、影中品味紅茶,臺北:時報文化,2007。

###

2014年9月12日 星期五

subprocess 子行程管理

subprocess 是 Python  程式語言中用來新增子行程的模組,這是在 PEP 324 中所提出的建議,主要是統一 Python 新增子行程的方法,用來取代 os.system, os.spawn*, os.popen*, popen2.*, commands.* 等這些模組和函式。基本上,在  Python 中如果要新增子行程,你只要知道 subprocess 模組就行了

subprocess 模組最重要的是 Popen 類別,建立 Popen 物件時將會新增子行程去執行你要的工作,Popen 類別用起來比較精細,可操作的地方較多,相對較麻煩一些。因此 subprocess 模組提供下列三種方便的函式來新增子行程,注意到這三個函式是屬於同步呼叫 (synchronous call) 的方式,一定會等到子行程結束才執行下一行程式碼。
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
    最簡單的子行程新增方式,執行並等待結束,回傳子行程的回傳值 (return code)。
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
    呼叫子行程,並判斷回傳值是否為是否為 0,不然就引發 CalledProcessError 例外。
  • subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
    呼叫子行程,與 subprocess.check_call 函式行為相似,但回傳 stdout 的字串值。
接下來介紹 Popen 類別,Popen 的建構子如下:
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)

Popen 物件則有下列方法和屬性:
  • 方法
    • Popen.poll():判斷子行程是否結束,如果結束回傳 returncode 值,否則回傳 None 。
    • Popen.wait():等待子行程結束,回傳 returncode 值。
    • Popen.communicate(input=None):與子行程通訊,回傳 tuple 資料型態為 (stdoutdata, stderrdata),注意要通訊的 stdin, stdout, stderr 引數必須設定為 subprocess.PIPE 。
    • Popen.send_signal(signal):送信號給子行程。
    • Popen.terminate():終止子行程,送出 SIGTERM 信號。
    • Popen.kill():停止子行程,送出 SIGKILL 信號。
  • 屬性
    • stdin:如果建立 Popen 時的 stdin 引數是 subprocess.PIPE,那麼這個屬性會是 file object,否則為 None。
    • stdout:如果建立 Popen 時的 stdout 引數是 subprocess.PIPE,那麼這個屬性會是 file object,否則為 None。
    • stderr:如果建立 Popen 時的 stderr 引數是 subprocess.PIPE,那麼這個屬性會是 file object,否則為 None。
    • pid:子行程的 process ID。
    • returncode:子行程結束的回傳值,如果子行程還在執行沒有結束,returncode 會是 None 。
最後,注意 shell 引數若設定為 True 時,我們必須確定空白字元shell metacharacters 有被引號正確地包起來,不然建立子行程會錯誤或不如預期。預設的 shell=False 使 subprocess 模組會完整傳送所有字元,包含 shell metacharacters。看下列範例會更清楚

import subprocess
subprocess.check_output(['printf','Hello World\n'])
subprocess.check_output(['printf "Hello World\n"'], shell=True)
subprocess.check_output('printf "Hello World\n"', shell=True)

上述 3 行程式碼執行結果是相同的,差別在於 shell=True 時必須用引號處理空白和 metacharacters,最後一行則是因為序列 (sequence) 的引數只有一個,可以簡化成字串作為引數。

文件中建議,如果讓使用者輸入參數作為子行程的引數會有安全行的問題,容易發生 Shell injection 的危險,如果你很確定引數沒有任何疑慮,使用 shell=True 倒是讓程式碼更容易閱讀。

###

2014年8月28日 星期四

103學年大學校院一覽

延續前一篇「103學年技專校院一覽」文章,利用政府資料開放平臺取得大專校院名錄,再利用程式處理就可以得到103學年的大學校院清單。

大學(共61所)

  1. 國立政治大學:www.nccu.edu.tw
  2. 國立清華大學:www.nthu.edu.tw
  3. 國立臺灣大學:www.ntu.edu.tw
  4. 國立成功大學:www.ncku.edu.tw
  5. 國立中興大學:www.nchu.edu.tw
  6. 國立交通大學:www.nctu.edu.tw
  7. 國立中央大學:www.ncu.edu.tw
  8. 國立中山大學:www.nsysu.edu.tw
  9. 國立臺灣海洋大學:www.ntou.edu.tw
  10. 國立中正大學:www.ccu.edu.tw
  11. 國立陽明大學:www.ym.edu.tw
  12. 國立臺北大學:www.ntpu.edu.tw
  13. 國立嘉義大學:www.ncyu.edu.tw
  14. 國立高雄大學:www.nuk.edu.tw
  15. 國立東華大學:www.ndhu.edu.tw
  16. 國立暨南國際大學:www.ncnu.edu.tw
  17. 國立臺北藝術大學:www.tnua.edu.tw
  18. 國立臺灣藝術大學:www.ntua.edu.tw
  19. 國立臺東大學:www.nttu.edu.tw
  20. 國立宜蘭大學:www.niu.edu.tw
  21. 國立聯合大學:www.nuu.edu.tw
  22. 國立臺南藝術大學:www.tnnua.edu.tw
  23. 國立臺南大學:web.nutn.edu.tw
  24. 國立體育大學:www.ntsu.edu.tw
  25. 國立金門大學:www.nqu.edu.tw
  26. 國立臺灣體育運動大學:www.ntupes.edu.tw
  27. 國立屏東大學:www.nptu.edu.tw
  28. 東海大學:www.thu.edu.tw
  29. 輔仁大學:www.fju.edu.tw
  30. 東吳大學:www.scu.edu.tw
  31. 中原大學:www.cycu.edu.tw
  32. 淡江大學:www.tku.edu.tw
  33. 中國文化大學:www.pccu.edu.tw
  34. 逢甲大學:www.fcu.edu.tw
  35. 靜宜大學:www.pu.edu.tw
  36. 長庚大學:www.cgu.edu.tw
  37. 元智大學:www.yzu.edu.tw
  38. 中華大學:www.chu.edu.tw
  39. 大葉大學:www.dyu.edu.tw
  40. 華梵大學:www.hfu.edu.tw
  41. 義守大學:www.isu.edu.tw
  42. 世新大學:www.shu.edu.tw
  43. 銘傳大學:www.mcu.edu.tw
  44. 實踐大學:www.usc.edu.tw
  45. 高雄醫學大學:www2.kmu.edu.tw
  46. 南華大學:www.nhu.edu.tw
  47. 真理大學:www.au.edu.tw
  48. 大同大學:www.ttu.edu.tw
  49. 慈濟大學:www.tcu.edu.tw
  50. 臺北醫學大學:www.tmu.edu.tw
  51. 中山醫學大學:www.csmu.edu.tw
  52. 長榮大學:www.cjcu.edu.tw
  53. 中國醫藥大學:www.cmu.edu.tw
  54. 玄奘大學:www.hcu.edu.tw
  55. 亞洲大學:www.asia.edu.tw
  56. 開南大學:www.knu.edu.tw
  57. 佛光大學:www.fgu.edu.tw
  58. 明道大學:www.mdu.edu.tw
  59. 康寧大學:www.ukn.edu.tw
  60. 台灣首府大學:www.tsu.edu.tw
  61. 臺北市立大學:www.uTaipei.edu.tw

學院(共4所)

  1. 興國管理學院:www.hku.edu.tw
  2. 稻江科技暨管理學院:www.toko.edu.tw
  3. 馬偕醫學院:www.mmc.edu.tw
  4. 法鼓文理學院:www.ddbc.edu.tw

師範&教育大學(共6所)

  1. 國立臺灣師範大學:www.ntnu.edu.tw
  2. 國立高雄師範大學:www.nknu.edu.tw
  3. 國立彰化師範大學:www.ncue.edu.tw
  4. 國立臺北教育大學:www.ntue.edu.tw
  5. 國立新竹教育大學:www.nhcue.edu.tw
  6. 國立臺中教育大學:www.ntcu.edu.tw

###

2014年8月25日 星期一

103學年技專校院一覽

利用政府資料開放平臺取得大專校院名錄,再利用程式處理就可以得到103學年的技專校院清單。

103學年和102學年的技專校院一覽轉變說明如下:

103學年技專校院一覽:

科技大學(共57所)

  1. 國立臺灣科技大學:www.ntust.edu.tw
  2. 國立雲林科技大學:www.yuntech.edu.tw
  3. 國立屏東科技大學:www.npust.edu.tw
  4. 國立臺北科技大學:www.ntut.edu.tw
  5. 國立高雄第一科技大學:www.nkfust.edu.tw
  6. 國立高雄應用科技大學:www.kuas.edu.tw
  7. 國立虎尾科技大學:www.nfu.edu.tw
  8. 國立高雄海洋科技大學:www.nkmu.edu.tw
  9. 國立澎湖科技大學:www.npu.edu.tw
  10. 國立勤益科技大學:www.ncut.edu.tw
  11. 國立臺北護理健康大學:www.ntunhs.edu.tw
  12. 國立高雄餐旅大學:www.nkuht.edu.tw
  13. 國立臺中科技大學:www.nutc.edu.tw
  14. 國立臺北商業大學:www.ntcb.edu.tw
  15. 朝陽科技大學:www.cyut.edu.tw
  16. 南臺科技大學:www.stust.edu.tw
  17. 崑山科技大學:www.ksu.edu.tw
  18. 嘉南藥理大學:www.chna.edu.tw (補充:自民國103年7月21日起變更為「www.cnu.edu.tw」)
  19. 樹德科技大學:www.stu.edu.tw
  20. 龍華科技大學:www.lhu.edu.tw
  21. 輔英科技大學:www.fy.edu.tw
  22. 明新科技大學:www.must.edu.tw
  23. 弘光科技大學:www.hk.edu.tw
  24. 健行科技大學:www.uch.edu.tw
  25. 正修科技大學:www.csu.edu.tw
  26. 萬能科技大學:www.vnu.edu.tw
  27. 建國科技大學:www.ctu.edu.tw
  28. 明志科技大學:www.mcut.edu.tw
  29. 高苑科技大學:www.kyu.edu.tw
  30. 大仁科技大學:www.tajen.edu.tw
  31. 聖約翰科技大學:www.sju.edu.tw
  32. 嶺東科技大學:www.ltu.edu.tw
  33. 中國科技大學:www.cute.edu.tw
  34. 中臺科技大學:www.ctust.edu.tw
  35. 台南應用科技大學:www.tut.edu.tw
  36. 遠東科技大學:www.feu.edu.tw
  37. 元培醫事科技大學:www.ypu.edu.tw
  38. 景文科技大學:www.just.edu.tw
  39. 中華醫事科技大學:www.hwai.edu.tw
  40. 東南科技大學:www.tnu.edu.tw
  41. 德明財經科技大學:www.takming.edu.tw
  42. 南開科技大學:www.nkut.edu.tw
  43. 中華科技大學:www.cust.edu.tw
  44. 僑光科技大學:www.ocu.edu.tw
  45. 育達科技大學:www.ydu.edu.tw
  46. 美和科技大學:www.meiho.edu.tw
  47. 吳鳳科技大學:www.wfu.edu.tw
  48. 環球科技大學:www.twu.edu.tw
  49. 中州科技大學:www.ccut.edu.tw
  50. 修平科技大學:www.hust.edu.tw
  51. 長庚科技大學:new.cgust.edu.tw
  52. 台北城市科技大學:www.tpcu.edu.tw
  53. 大華科技大學:www.tust.edu.tw
  54. 醒吾科技大學:www.hwu.edu.tw
  55. 南榮科技大學:www.njtc.edu.tw
  56. 文藻外語大學:www.wtuc.edu.tw
  57. 華夏科技大學:www.hwh.edu.tw

技術學院(共17所)

  1. 國立臺灣戲曲學院:www.tcpa.edu.tw
  2. 大漢技術學院:www.dahan.edu.tw
  3. 慈濟技術學院:www.tccn.edu.tw
  4. 和春技術學院:www.fotech.edu.tw
  5. 致理技術學院:www.chihlee.edu.tw
  6. 亞東技術學院:www.oit.edu.tw
  7. 桃園創新技術學院:www.tiit.edu.tw
  8. 德霖技術學院:www.dlit.edu.tw
  9. 蘭陽技術學院:www.fit.edu.tw
  10. 黎明技術學院:www.lit.edu.tw
  11. 東方設計學院:www.tf.edu.tw
  12. 經國管理暨健康學院:www.cku.edu.tw
  13. 崇右技術學院:www.cit.edu.tw
  14. 大同技術學院:www.ttc.edu.tw
  15. 亞太創意技術學院:w2.apic.edu.tw
  16. 臺灣觀光學院:www.tht.edu.tw
  17. 台北海洋技術學院:www.tcmt.edu.tw

專科學校(共14所)

  1. 國立臺南護理專科學校:www.ntin.edu.tw
  2. 國立臺東專科學校:www.ntc.edu.tw
  3. 康寧醫護暨管理專科學校:www.knjc.edu.tw
  4. 馬偕醫護管理專科學校:www.mkc.edu.tw
  5. 仁德醫護管理專科學校:www.jente.edu.tw
  6. 樹人醫護管理專科學校:www.szmc.edu.tw
  7. 慈惠醫護管理專科學校:www.tzuhui.edu.tw
  8. 耕莘健康管理專科學校:www.ctcn.edu.tw
  9. 敏惠醫護管理專科學校:www.mhchcm.edu.tw
  10. 高美醫護管理專科學校:www.kmvs.khc.edu.tw
  11. 育英醫護管理專科學校:www.yuhing.edu.tw
  12. 崇仁醫護管理專科學校:www.cjc.edu.tw
  13. 聖母醫護管理專科學校:www.smc.edu.tw
  14. 新生醫護管理專科學校:www.web.hsc.edu.tw
註:上述學校順序不具任何意義,純粹是電腦程式自動排列輸出。

###

2014年7月11日 星期五

如果這不是 Scrum,那什麼才是 Scrum?

  • 選擇 Scrum 的原因是什麼?為什麼不用其他敏捷方法?
  • 團隊裡面有多少人真的瞭解 Scrum ,Scrum 有正確執行嗎?
  • 如果現在執行的不是 Scrum,那什麼才是 Scrum?
上述 3 個問題是我最近的疑惑,於是把之前台灣第一本專門介紹 Scrum 的中文書笑談軟體工程:敏捷開發法的逆襲拿出來複習,我也把 Teddy 老師 (北科大校友) 的 搞笑談軟工 上面有關Scrum的文章看了一遍,順便整理歸納一下 (如下3篇),方便大家有系統地瀏覽閱讀。

認識篇

為什麼要採用Scrum?
Scrum 是一種制度
Scrum 不會幫你解決問題
Scrum 不會幫你解決問題(2)
Scrum 是什麼(1):雙重回饋機制
Scrum 是什麼(2):Scrum 的內涵
Scrum 是什麼(3):三種補充文件
Scrum 是什麼(4):Product Backlog
Scrum 是什麼(5):初探 Sprint Planning Meeting
Scrum 是什麼(6):Sprint Planning Meeting 眉角
Scrum 是什麼(7):Daily Scrum
Scrum 是什麼(8):Sprint Demo Meeting
Scrum 是什麼(9):Retrospective Meeting
Scrum 是什麼(10):時程估算
Scrum 是什麼(11):不信邪之流程改善精神
Scrum 是什麼(12):不要再用focus factor與unplanned items了
Scrum 是什麼(13):為什麼不建議使用focus factor?
Scrum 是什麼(14):好問題
Scrum 是什麼(15):誰適合當Scrum Master?
Scrum 是什麼(16):Story寫得好才容易估算(上)
Scrum 是什麼(17):Story寫得好才容易估算(下)
Scrum 是什麼(18):到底為什麼要估算Story Point哩?

觀念篇

敏捷精神
馬蓋先與敏捷精神
敏捷開發與軟體架構
敏捷開發團隊所需基本技能
就是這個光: Scrum + Lean + XP
鬆弛讓你更敏捷(1)
鬆弛讓你更敏捷(2):每日工時
鬆弛讓你更敏捷(3):不好的進度表

Scrum 是一組餐具
Scrum團隊之持續產品開發模式
拜託,這是 Scrum 耶
捧油,Scrum 在那裡?
Scrum與Design Patterns
把Design Thinking放入Scrum與Pattern之中
導入 Scrum?謝謝再聯絡。
導入Scrum很貴嗎?Teddy算給你看
Scrum釘子戶
Slow-start:導入Scrum首部曲
導入Scrum三部曲
可是約耳說要關在自己專屬的房間啊
是不為也,非不能也
都市游擊隊
紀律
捨我其誰之我不知道要做多久
同學,Story不是這樣寫滴
Story point 為何沒有單位:相對論篇

從成語學Scrum
我真是猜不透你啊:Scrum 篇
Scrum 之逆練九陰真經
同誰,九陰真經不是這樣子練滴
再忙,也要跟你開個自省會議
影響Retrospective Meeting成效的四個問題
Retrospective Meeting = 許願池
Scrum團隊如何打考績:有所本篇
Scrum團隊如何打考績:鬼扯篇
我不能 run Scrum,因為我家人不同意

Scrum 與 Kanban應用環境
系統管理團隊結合Kanban與Scrum的經驗
從Scrum到Scrumban的經驗

我去年想嘗試Scrum,今年想用Kanban
用 Kanban + Scrum 支援大型專案
用 Kanban + Scrum 支援大型專案(2):分組方式
用 Kanban + Scrum 支援大型專案(3):三層式每日站立會議
用 Kanban + Scrum 支援大型專案(4):DoD
遊戲團隊結合Agile與Kanban的經驗
Kanban在電信業產品維護團隊的經驗(上)
Kanban在電信業產品維護團隊的經驗(下)
Kanban還少了點什麼

問答篇

只有一個開發人員可以採用Scrum嗎?
Scrum團隊不是要互相分工合作嗎?
導入Scrum真的可以提升一倍的生產力嗎?
等團隊技術能力提升,再來嘗試Scrum?
小員工如何說服老闆導入Scrum?
你可能改變團隊,但改變老闆?
Startup 要不要採用Scrum?
專案Bug太多要不要導入Scrum?

如何估算 story point?
老問題:Story 做不完怎麼辦?
Story與Task的估算單位為什麼不同?
萬事起頭難:如何開始第一個 Sprint?
如何做好ScrumMaster(1)?
功能做不完怎麼辦?
Scrum 分享活動答客問
答客問
答客問 (二)
Scrum 答客問 (三)

Scrum FAQ (1)
Scrum FAQ (2)
Scrum FAQ (3)
Scrum FAQ (4)

最後推薦給大家 Teddy 老師的「笑談軟體工程」系列叢書,不想用行動購買的,也請大家多多瀏覽 搞笑談軟工,期望台灣開發軟體的方法能有較正確的觀念和態度。

開什麼玩笑!談軟體工程:
###

2014年7月3日 星期四

Yeoman 自耕農

Yeoman 是一個可以幫助我們快速開發 Web 的鷹架工具 (scaffolding tool),規定最佳實踐 (best practices) 的方法,使得 Web 的開發工作更具生產力。Yeoman 是使用稱為「產生器(Generator)」的外掛方式擴充,使用 Generator 可以快速產生 Web 所需的目錄結構和程式庫檔案,於是  Web 的開發不需要去煩惱這些瑣事,開發者可以專心寫程式去解決問題。

Yeoman 事實上是 3 個工具的組合 (stack),各自負責不同的工作。
  • yo
    鷹架工具,執行 Yeoman 的 Generator,用來產生 Web 鷹架。
  • Grunt
    建置工具,用來自動化執行任務工作,例如最佳化 HTML 輸出檔案、啟動測試伺服器等。
  • Bower
    套件管理工具,用來管理程式庫的相依性,例如某些 CSS 套件需要 jQuery 就會一起安裝。
在 Ubuntu 上安裝 Yeoman 必須先擁有 Node.js 套件管理程式,也就是 npm,只要安裝 Node.js 後就有 npm 可以使用,執行下列指令安裝 Yeoman:(注意要變成 root,在執行 npm 安裝 yo 套件)

sudo su
npm install -g yo
yo --version

雖然說指令上只有 yo 套件,但執行後會一併安裝 yo, grunt, bower 共 3 個工具。

接著滿重要的是,要安裝需要的Generator,一開始是沒有任何 Generator,請參考 Generator 清單,最常用的大概是 webapp 產生器,Generator 使用 npm 安裝,以 webapp 產生器來說指令是:

sudo su
npm install -g generator-webapp
yo --generators
exit
mkdir my-yo-project
cd my-yo-project
yo webapp

Generator 的套件名稱通常以 generator- 為字首,但應以各個 Generator 的網站為依據。Yeoman 的操作請參考官方的 Getting started ,其中 Grunt 和 Bower 的功能較多,詳細內容可以參閱各自的網站。

###

2014年6月25日 星期三

自我監控分析報告技術 監控工具 smartmontools

現代的磁碟機都有自我監控分析報告技術 (Self-Monitoring, Analysis and Reporting Technology, 簡稱 SMART),利用 SMART 的資訊我們可以取得磁碟衰退 (degradation) 和故障 (failure) 的警告,提早更換有問題的磁碟機以避免資料損毀。

在 Linux 平台上,我們可以使用 smartmontools 套件讀取磁碟的 SMART 資訊,
Ubuntu 上安裝的指令是  sudo apt-get -y install smartmontools,
以下說明皆以 Ubuntu distribution 為主。在smartmontools 套件中包含兩個公用程式 (utility programs):
  • smartctl
    控制和讀取磁碟的 SMART 資訊,與執行 SMART 的測試,指令的最後一個引數是裝置名稱 (例如 /dev/sda ),記得執行 smartctl 需要 root 的權限。
  • smartd
    監控 (monitor) SMART 磁碟的服務程式 (daemon),smartd設定檔位於 /etc/smartd.conf,預設是每1800秒 (30分鐘) 檢查磁碟的 SMART 資訊。
smartctl 和 smartd 的使用方法可以參考說明文件,沒有什麼困難的地方。比較需要注意的是 SMART 中有三種測試,這些「測試」的意義和我們認知不太一樣!(下面的 device 是指你的磁碟機位置,例如 /dev/sda )
  • 線上測試 (online-testing)
    磁碟的 SMART 功能開啟時就會進行的「測試」,對效能沒有影響,利用 smartctl -s on device 指令可以開啟線上測試功能。
  • 離線測試 (offline-testing)
    每隔4小時進行的「測試」,若磁碟忙碌中則延後執行,對效能可能有影響,利用 smartctl -o on device 指令可以開啟自動離線測試的功能,或是使用 smartctl -t offline device 立即執行離線測試。
  • 自我測試 (self-testing)
    分成簡短自我測試 (short self-test)擴充自我測試 (extended self-test) 兩種,擴充自我測試也稱為完整自我測試 (long self-test) ,自我測試需要花費數分鐘至數百分鐘進行,其測試結果會在 SMART 日誌 (Log) 上顯示。使用 smartctl -t short device 或 smartctl -t long device 執行自我測試,再使用 smartctl -l selftest device 查看檢查結果。
嚴格來說,SMART 的線上測試離線測試不能稱為「測試」,線上和離線測試事實上只是更新磁碟 SMART 屬性的數值,因此應該稱為資料收集 (data collection) 較為貼切,在 smartctl 的說明文件提到使用「測試」一詞是個不幸,容易讓人們混淆。在 smartctl 的「Test」一詞都是指離線測試,而「Self-Test」 則是指自我測試。

如果要使用 smartd 當我們監控磁碟狀態,建議安裝 smartmontools 套件執行 sudo service smartd start 啟動服務程式,另外執行 sudo update-rc.d smartd defaults 讓系統啟動時執行 smartd 服務程式。

最後說明 SMART 的屬性 (Attributes), 每個屬性有個 ID 和名稱,ID 是從 1 至 253 的整數。屬性有 3 個重要的數值:
  • RAW_VALUE
    屬性的原始數值
  • VALUE
    正規化 (Normalized) 的數值,各磁碟製造商利用自家的演算法將 RAW_VALUE 轉換成 1 至 254 的整數
  • THRESH
    門檻 (Threshold) 值,範圍從 0 至 255 的整數。當 VALUE 小於或等於 THRESH 則代表故障 (failure)。
另外說明屬性的 TYPE 和 UPDATED 欄位。
  • TYPE 代表屬性的意義,有兩種類型:
    • Pre-failure
      預先故障的屬性,當VALUE 低於 THRESH 表示磁碟即將故障。
    • Old age
      已使用的屬性,當VALUE 低於 THRESH 表示磁碟超出使用期限與設計的耗損次數。
  • UPDATED 代表屬性的更新方式,有兩種類型:
    • Always
      正常運作下,或是執行離線測試時都會更新數值。
    • Offline
      只有在離線測試時才會更新數值。

講了這麼多,不如直接看執行的結果會比較清楚,在我的電腦上執行 sudo smartctl -A /dev/sda,得到下列的屬性結果。

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

補充說明,這個 /dev/sda 是 SSD,所以有些屬性不會在硬碟上出現。

###

2014年6月18日 星期三

collectd 系統資訊收集服務

collectd 是收集與統計系統資訊的一個服務程式 (daemon),並將這些資訊儲存成不同方式,如 RRD 檔案或資料庫等。這些統計資料 (statistics) 有什麼用途呢?可以用來做效能分析 (performance analysis),找出系統的瓶頸,也可以用作容量規劃 (capacity planning),預測系統的負載。

在 Ubuntu 上安裝 collectd 相當容易,指令是:sudo apt-get -y install collectd,官方目前最新的是 5.4版,不過目前在 Ubuntu 12.04 上的版本是 collectd 4.10。安裝完成之後,有3個設定檔位於:
  • /etc/collectd/collectd.conf:主要設定檔。
  • /etc/collectd/filters.conf:過濾器的設定檔,用於4.6版新增的規則鍊 (chain) 功能。
  • /etc/collectd/thresholds.conf:門檻值的設定檔,用於4.3版新增的監控 (monitoring) 功能。
collectd 是採用外掛架構 (plug-in architecture) 的設計,因此設定檔大部分都是設定 plugin 如何運作。目前官方總共有111個外掛,這些 plugins 主要分成輸入和輸出兩大類,說明如下:
  • 輸入外掛 (Input plugins)
    在 collectd 中屬於讀取 (read) 類型,定期從系統查詢 (query) 資訊,並將這些數值資訊派送 (dispatch) 回 collectd 服務程式,這類外掛佔了絕大多數。
  • 輸出外掛 (Output plugins)
    在 collectd 中屬於寫入 (write) 類型,處理 collectd 派送的資訊,一般而言是將這些資訊寫入 RRD 或 CSV 檔案,或是透過網路送至遠端。
某些外掛兼具輸入與輸出兩種功能,如AMQP, Network, UnixSock 這類通訊用途的外掛程式,提供資訊的讀取和寫入。除了上述兩大類外,還有下列三種類型 (占少數):
  • 日誌外掛 (Logging plugins)
    將訊息寫入系統日誌 (syslog) 中,或是自訂的日誌檔。
  • 通知外掛 (Notification plugins)
    在監控功能中,當門檻值超出設定範圍後, collectd 將發出的通知訊息,這類外掛將接收通知訊息進行處理,通常是發出 email 告知系統管理員。
  • 繫結外掛 (Binding plugins)
    在 collectd 中執行 Java, Perl, Python 的程式,通常是用來開發自己的外掛程式,透過繫結外掛載入並執行。

這些外掛是以 Shared Object 的方式存在 ( .so 檔案),位於 /usr/lib/collectd 路徑之下。在設定檔中,Interval 設定是比較重要的參數,Interval 參數決定 collectd 多久從輸入外掛讀取資料,預設是 10 秒查詢系統資訊一次,你也可以各別設定每個外掛的 Interval 參數,例如 df 外掛用於統計磁碟使用量,我們就可以將 df 的 Interval 設大一點,因為磁碟空間的變化量不會太大。

整體來說,collectd 內建大量外掛,加上繫結功能方便開發自己的外掛,可以補足內建不足的部分,設定方式也相當簡單 (主要是 collectd.conf ),非常適合用來收集與統計系統資訊。collectd 的缺點大概是監控功能稍弱 (這不是 collectd 的強項),缺乏應用服務的監控,畢竟 collectd 主要是收集數據用途 (所以才叫做 collect daemon ),不是用來判別系統是否正常或異常。

若是要求監控功能,建議使用 Nagios 這套軟體。可以另外安裝 collectd-utils 套件,此套件中有 collectd-nagios 程式,可以將 Nagios 結合 collectd 一起運作。利用 collectd 的 unixsock 外掛配合 collectd-nagios 程式,Nagios 可以擷取 collectd 的統計資料進行系統監控。

###

2014年6月13日 星期五

即時串流通信協定 RTSP

即時串流通信協定 (Real Time Streaming Protocol, RTSP) 是應用層的通訊協定,定義在 RFC 2326 規範中,RTSP 是用來控制具有即時與同步特性的資料,如音訊和視訊的媒體,資料來源包含現場即時轉播和儲存的片段剪輯,媒體資料與控制資料是採用交錯式 (interleaving) 的方式傳送。

RTSP 沒有連線的概念,而是在伺服器維護 ID 以識別對話 (session),RTSP 也沒有限制底下傳輸層的通訊協定,你可以用 TCP 或 UDP 來傳送 RTSP 訊息,一個用戶端可以建立多個連線傳送一個 RTSP 對話。RTSP 控制多個傳送之間的對話,包含選擇傳送通道的方式,以及資料傳送的機制。

媒體來源用URL識別,例如 rtsp://example.com/live.sdp 或 rtspu://example.com/live.sdp,rtsp是以TCP傳輸,而rtspu則是以UDP傳輸,沒有指定埠號的話,RTSP 預設是用 port 554

RTSP 與 HTTP 有些相似,通訊協定的觀念上八九不離十,如果你知道 HTTP ,那麼認識 RTSP 會更容易一些。不過,RTSP 與 HTTP 差異的地方如下:
  • RTSP 增加許多新的方法 (method),還有不同的識別ID。
  • RTSP 伺服器需要維護狀態,但 HTTP 本質上就是無狀態 (stateless)。
    (所以開發一個 RTSP伺服器會比 HTTP 伺服器還要複雜...)
  • RTSP 中,伺服端和用戶端都可以發出請求 ( request)。
  • RTSP 的資料是載於不同協定上 (通常使用 RTP 通訊協定),但 HTTP 是在 HTTP 協定本身的 Message Body中。
  • RTSP 的訊息是用 UTF-8 編碼,而 HTTP 是用 ISO-8859-1 編碼。
  • RTSP 的請求總是包含絕對的 URI,而 HTTP 請求則是絕對路徑和主機位置分開在 Header 中。
相同的地方有:
  • 都是以文字為基礎 (text-based) 的通訊協定,易於擴充。也都是以 CR LF 結尾。
  • 都是用 Message 的方式請求和回應,信息包含 Header 和 Body 兩個部分。
  • 都定義 5 大類的狀態碼 (Status Code),分類也相同:
    • 1xx: 資訊 (Informational)
    • 2xx: 成功 (Success)
    • 3xx: 轉向 (Redirection)
    • 4xx: 用戶端錯誤 (Client Error)
    • 5xx: 伺服端錯誤 (Server Error)
如果你對於 HTTP 已經有相當的認識,那麼了解 RSTP 也不是一件困難的事。在 RTSP 當中有幾個術語比較重要,這裡特別提出來說明。
  • 媒體串流 (Media stream)
    或稱串流,是單一的媒體實體。當串流使用的是 RTP 通訊協定時,串流則是指由 RTP 和 RTCP 封包建立的媒體。
  • 呈現 (Presentation)
    由一個或多個串流所組成,在用戶端足以構成完整的媒體。
  • 呈現描述 (Presentation description)
    定義一個呈現中串流的資訊,包含編碼方式、網路位置和內容資訊。通常是用 SDP (Session Description Protocol) 規範所定義的資訊。
  • 聚集控制 (Aggregate control)
    在伺服器上使用單一時間軸控制多個串流,意思是用戶端送出單一個播放訊息就可以同時控制音訊和視訊兩種串流的輸出。
總結來說,RTSP 像是串流媒體的遙控器,或是遠端控制多媒體伺服器的方法,至於串流媒體是用哪種協定規範,這就不在 RTSP 定義之中。(串流媒體的協定參考 RTP,定義在 RFC 3550)

###

2014年5月21日 星期三

Node.js 伺服端事件驅動非阻斷式平台

Node.js 是一個建於 V8 JavaScript 引擎上的一套伺服端平台,採用 JavaScript 程式語言,Node.js 使用事件驅動 (event-driven)、非阻斷式 (non-blocking) 的輸入/輸出模型,因此具有輕量級、高效率的特性,特別適合用於資料密集 (data-intensive)、即時 (real-time) 的應用領域。

為什麼創造Node.js

Node.js 的創造者瑞安‧達爾 (Ryan Dahl) 在 Node: Up and Running 一書的前言說明 Node.js 的緣起。Ryan 在2008年尋找用於建置網站的程式語言平台,他注意到推送 (server push) 這項技術,伺服器將資料推送給用戶,而不是讓使用者以輪巡 (polling) 的方式取得。當時的方式是,伺服器接收請求後,依序發送資料給用戶端,伺服器本身必須處理一堆開啟且閒置的連線,這顯然不是個好方法。

Ryan 知道 C 語言如何解決這個問題,使用 Non-Blocking Sockets 的方式可以有效降低閒置連線的成本 (overhead),因此一台伺服器將能處理上千個閒置連線並且有很高的吞吐量 (throughput)。不過這種方法有兩個問題:
  1. Ryan 不想使用 C 語言開發,他想使用動態語言。雖然任何程式語言可以用系統呼叫的方式做,但那會讓程式碼變醜,也僅是另一種Socket程式設計罷了。
  2. 他認為使用 Non-Blocking Sockets根本上是困難的,只要是 Non-Blocking 的方法就會讓開發變得困難。
在 2008 年 9 月 Google 發表 Chrome 瀏覽器和高效能 JavaScript 引擎 V8 ,執行較快的 JavaScript 引擎可以讓網頁速度更快,而 V8 確實讓網頁執行速度快了很多,突然間Google, Apple, Mozilla, 和 Microsoft 開始在 JavaScript 引擎上展開競賽。與此同時,Douglas Crockford的「JavaScript:優良部分」這本書的出版,讓鄙視的 JavaScript 變成一種重要的程式語言。

Ryan 有個偉大的想法:JavaScript 的 Non-Blocking Sockets,由於 JavaScript 沒有現成的 Socket 程式庫,所以 Ryan 可以是第一個引進這種 Socket ,並希望提供更好的介面。他所要做的事是:將高效能 JavaScript 引擎 V8 結合 C 語言開發的 Non-Blocking Sockets,Ryan 辭掉他的工作,全心全意實現這個想法。

JavaScript 與 Non-Blocking Sockets 結合得非常好,這個特點不是一開始就很明顯清楚的。閉包 (closure) 讓一切都有可能,人們可以用幾行 JavaScript 程式碼完成非常複雜的非阻斷式伺服器。 他原本擔心 Node.js 會變成不能用的平台,但隨著世界各地的社群高手開發程式庫,Ryan 舒緩他的憂慮,由於單一的 Event Loop 和完全的非阻斷式介面,程式庫將可以越加越複雜而不需要採用昂貴的執行緒。

在 Node.js 中,使用者發現預設情況下就能容易擴展 (scale)。在於系統核心不允許使用者做出很可怕的事情,例如阻斷運行中的執行緒,所以效能不會顯著地下降,比起傳統阻斷式的方式好上一個數量級 (10倍以上),可以處理更多的流量。

從上述內容我們可以知道 Non-Blocking 是一件重要的事情,為何需要 Non-Blocking 呢?傳統上,伺服器會開啟一定數量的程序(或執行緒)處理連線,當這些程序因為處理 I/O而被 block 時,這個程序將只能等待回應而不能服務其他用戶,由於伺服器開啟的程序數量有上限,阻斷的程序將嚴重影響服務的吞吐量,特別是一堆開啟且閒置的連線。如果有 Non-Blocking 的處理方式,則整體效率將可以提升。

為何要使用Node.js

Node.js 用優雅的方法解決 Blocking 問題,提供 Non-Blocking 的 I/O 程式庫,採用非同步 (Asynchronous) 的呼叫方式,利用簡單的 Event Loop 實作 ,因而具有輕量級、高效率的特性。加上用 JavaScript 為程式語言,不需要使用多程序或多執行緒的程式架構,大幅降低學習門檻,提高開發成效。

了解這些開發背景,那些地方適合使用 Node.js 呢?我想大概有這些地方:
  1. 需要伺服端推送資料的應用程式。(長時間的閒置連線)
  2. 資料處理密集的應用程式。(I/O次數非常高)
  3. 具有擴展需求、大量並行處理、即時性的應用程式。
  4. 統一以 JavaScript 程式語言開發的應用程式。
這些應用特性符合 Node.js 的長處,也才能發揮 Node.js 的效益。如果是開發傳統的網頁應用程式(如留言板、部落格等),不妨以PHP、Python的框架平台進行開發,畢竟這些資源比  Node.js 還多,也比較純熟,使用上會更有幫助些。

參考書籍:
Tom Hughes-Croucher & Mike Wilson, Node: Up and Running, O'Reilly Media, 2012

如何安裝 Node.js

請先到下載頁面下載 Node.js ,如果你的系統是 Windows,那就用 Windows Installer (.msi) 吧!這是最簡單的安裝方式。如果你的系統是 Linux ,可以選擇下載 Source Code 自己編譯,或是下載 Binaries (注意你的系統是 32 或 64 位元)。以下指令是在 Ubuntu 上自己編譯 Node.js,提供大家參考。

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

###

2014年5月19日 星期一

wxPython 跨平台視窗程式庫

wxPython 是一套 Python 的 GUI 工具 (toolkit),可以讓我們簡單快速地建立圖形化的使用者介面 (Graphical User Interface, GUI),wxPython 實際上是將另一套 wxWidgets 程式庫包成 Python 可以使用的套件。由於 wxWidgets 本身是一跨平台 (cross-platform) 的程式庫,因此利用 wxPython 開發的應用程式也是可以跨平台的,加上 wxWidgets 是呼叫系統原生的 API,其運行速度是相當快速。wx 的 w 指的是 Microsoft Windows,而 x 指的則是 X Window系統。

wxPython 在 Ubuntu 上的運作是這樣:wxPython → wxWidgets → GTK+ 。若是在 Windows 上則是:wxPython → wxWidgets → Windows API 。大部分的事情已經在 wxWidgets 做掉了,wxPython 是 Python 和 wxWidgets 之間的橋樑

了解 wxPython 的運作原理,我們可以試著裝起來用用看,在 Ubuntu 上安裝 wxPython 相當簡單,請執行下列指令:
sudo apt-get install python-wxgtk2.8
sudo apt-get install python-wxtools wx2.8-i18n

學習 wxPython 實際上就是學習 wxWidgets ,我們用 Python 去呼叫 wxWidgets 提供的功能。在 wxPython 之中的視窗稱之為「Frame」,而不是「Window」,這點需要特別留意,觀念上很容易混淆,所有的視窗都是繼承 Frame 類別。wxPython  提供相當多的工具項 (Widgets) 類別,學習時建議先認識有哪些控制項 (Controls) ,屬於 Control 的子類別,例如常用的按鈕 (button)、文字方塊 (text box)等。

至於新手入門的話,可以先看這篇 Getting started with wxPython ,若需要進一步的 API 說明,則可以閱下列連結的內容:
整體來說,利用 wxPython 開發應用程式具有跨平台的優點,加上以 Python 語言進行撰寫,使得我們可以簡單又快速地建立視窗應用程式。然而 wxPython 缺乏一個好用的 IDE 開發工具,像是 Visual Studio 可以用拖拉方式建立應用程式,稍微讓 wxPython 的開發顯得不甚完善。如果想用圖形化方式建立 wxPython 應用程式,則是可以參考 wxDesignerwxFormBuilder 這兩項快速開發工具。

###

2014年5月2日 星期五

NSIS 建置 Windows 安裝程式

NSIS (Nullsoft Scriptable Install System) 是一套建置 Windows 安裝程式 (installers) 的開源軟體,用來將程式或文件打包成一個執行檔給客戶安裝使用。NSIS 採用腳本 (Script) 的方式建置 Windows 安裝程式,有點像寫程式的方式,先撰寫一個副檔名為 .nsi 的 Script,再利用 MakeNSIS 編譯 .nsi 檔案,將可以得到安裝程式的執行檔。

NSIS 提供大量的範例可以參考,因此學習 NSIS 不會很困難,加上外掛 (plug-in) 程式,我們可以快速地建置相當專業的安裝程式。雖然 NSIS 的指令很多,但不用擔心,實際會用的指令不不超過 20 個,有需要再查找就行了,缺點大概就是只有英文的操作介面吧!除了 NSIS 這個開源軟體之外,還有 Inno Setup 和 WiX Toolset 這兩套免費軟體可以使用,大家有興趣不妨比較看看。

學習 NSIS 最重要的是了解 .nsi 檔案的內容,Script 中有幾個重要觀念如下:

  • 安裝程式屬性 (Installer Attributes)
    這是用來設定安裝程式的行為,例如安裝路徑、名稱、圖示、版本資訊等,屬於全域的設定。詳細參閱http://nsis.sourceforge.net/Docs/Chapter4.html#4.8
  • 頁面 (Pages)
    可以將安裝程式顯示的每個視窗當作一個頁面,NSIS 內建數個頁面類型,例如版權頁面用來顯示版權資訊,元件頁面讓用戶選擇安裝元件等。頁面之間是有先後順序的,在撰寫 Script 要特別注意,頁面主要是利用 Page 和 UninstPage 兩個指令進行設定。詳細參閱http://nsis.sourceforge.net/Docs/Chapter4.html#4.5
  • 章節 (Sections)
    可以把 NSIS 的章節當作程式元件來看,例如一個安裝程式需要安裝兩個軟體,這時候就需要兩個章節,在元件頁面的視窗就會看到兩個軟體元件。比較注意的是每個章節會有一個名稱作為元件名稱,如果是 Uninstall 或字首為un.的名稱則是用在移除的元件。詳細參閱http://nsis.sourceforge.net/Docs/Chapter4.html#4.6
  • 指令 (Instructions)
    指令占了 NSIS 說明的大部分,包含檔案操作、登錄檔 (Registry) 操作、程式或系統的呼叫執行等等,基本上都是安裝或移除會用到的操作指令。詳細參閱http://nsis.sourceforge.net/Docs/Chapter4.html#4.9
  • 函式 (Functions)
    將常用的操作定義成函式以避免重複,特別的是 NSIS 定義一些回呼函式,我們可以撰寫一些操作讓 NSIS 執行時呼叫,例如啟動或關閉 NSIS 時執行某些工作。詳細參閱http://nsis.sourceforge.net/Docs/Chapter4.html#4.7
  • 編譯時期命令 (Compile Time Commands)
    這是用來設定 NSIS 編譯的行為,常用的命令有引用外掛 (plug-in) 程式、定義常數等。詳細參閱http://nsis.sourceforge.net/Docs/Chapter5.html

最後,介紹 NSIS 的安裝,NSIS 有兩種版本,一種是 NSIS ( http://nsis.sourceforge.net/ 網站上面的版本) ,另一種是 Unicode NSIS。如果不需要多國語言,以英語為安裝程式的語言,那麼兩種版本的 NSIS 是沒有什麼差異,但若希望安裝程式顯示中文或其他多國語言,則建議採用 Unicode NSIS,比較不會出現亂碼的情形。必須注意的是,Unicode NSIS的 .nsi 檔案必須是 UTF-8 編碼的 Script ,這樣 Unicode 版本的 MakeNSIS 才能正常編譯。此外,這兩種版本是可以同時安裝在一個系統上的。

###

2014年4月29日 星期二

Oreka 電話錄音系統在 Ubuntu 上安裝

Oreka 是一個開源 (Open Source) 的電話錄音系統,音訊來源可以是VoIP SIP, SCCP 或 raw RTP等等,因此可以從用戶交換機 (Private Branch Exchange, PBX)進行電話錄音,Oreka 也提供一個網頁的使用者操作介面,方便使用者取得錄音檔案。我們通常將 Oreka 應用在客服中心 (Call Centers, Contact Centers) 進行服務監測的用途。

Oreka 這套電話錄音系統由三個服務所組成,分別是
  • OrkAudio:提供電話音訊的錄音和儲存的服務,以 C++ 程式語言開發。
  • OrkTrack:將 OrkAudio 的運行活動記錄在資料庫中,由 J2EE servlet 技術所開發。
  • OrkWeb:提供 Web 的使用者操作介面,以 Java 程式語言的 Tapestry 框架所開發。
如果需要更詳細的說明,可以參考 Oreka 的開發者文件

Oreka 網站上目前最新版本是 1.7 ,但只提供  CentOS/RHEL 與 Windows 平台的安裝程式,Ubuntu/Debian 平台的程式依舊是 0.5 版,如果想要在 Ubuntu 上安裝,可以參考下面的 Bash Script 將 Oreka 原始碼編譯成執行檔。

#!/bin/bash
apt-get install -y subversion
svn checkout svn://svn.code.sf.net/p/oreka/svn/trunk oreka-svn

apt-get install -y build-essential automake libtool

apt-get install -y libboost-dev libpcap-dev libsndfile1-dev libapr1-dev libspeex-dev liblog4cxx10-dev libace-dev libxerces-c2-dev

ln -sf /usr/lib/x86_64-linux-gnu/libspeex.so /usr/lib/liborkspeex.so
ln -sf /usr/lib/x86_64-linux-gnu/libspeex.a /usr/lib/liborkspeex.a

cd oreka-svn/orkbasecxx
aclocal
libtoolize
echo 'AC_CONFIG_MACRO_DIR([m4])' >> configure.in
echo 'ACLOCAL_AMFLAGS=-I m4' >> Makefile.am
autoheader
automake -a
make -f Makefile.cvs
./configure
make
make install

cd ../orkaudio
aclocal
libtoolize
echo 'AC_CONFIG_MACRO_DIR([m4])' >> configure.in
echo 'ACLOCAL_AMFLAGS=-I m4' >> Makefile.am
autoheader
automake -a
make -f Makefile.cvs
./configure
make
make install

這個 Script 在 Ubuntu 12.04 LTS 上測試過,會安裝編譯所需要的相關套件,並且利用 svn 下載 Oreka 原始碼進行編譯。

###

2014年1月5日 星期日

美的曙光

美,從何而來?

「美的曙光」這本書娓娓道來美的根源,從人類開始站立的那天開始說起,內容橫跨石器時代、陶器時代、青銅器時代到文字時代,每段時期人類對於美有不同的理解,追究其原因在於人類的生活從狩獵、畜牧到農業不斷演進。

很喜歡蔣勳老師的述說方式,就是有種如沐春風的感覺,一段又一段的故事讓人很想閱讀下去,他會跟你說一件事情的源由以及影響,每個章節又相互呼應,非常精彩!

蔣勳,美的曙光,台北:有鹿文化,2009。

「美的曙光」全書總共14講,依照美的歷史時間先後編排,因此閱讀上建議從頭開始,每一講不要急著看完它,一邊閱讀一邊想像著蔣勳老師的描述,讀完後有種上了14堂歷史課的感覺。
  • 第一講 創世紀——藝術的誕生
  • 第二講 石破天驚 ——舊石器時代
  • 第三講 形狀的發現與工具利用
  • 第四講 新石器時代與土陶製作
  • 第五講 安土敦乎仁——農業定居與陶器製作
  • 第六講 河流與文明
  • 第七講 埃及金字塔 - 對抗死亡
  • 第八講 美索不達米亞文明 
  • 第九講 黃河半坡、仰韶、馬家窯文化
  • 第十講 長江流域良渚文化,蒙古紅山文化
  • 第十一講 上古人像造型比較——埃及、印度、中國、希臘
  • 第十二講 青銅時代——夏二里頭文化
  • 第十三講 文字時代的來臨:歷史曙光
  • 第十四講 美是心靈的覺醒
這14講一開始從人類站立後,雙手擁有創造力而誕生藝術,不同時間有著不一樣的工具和生活方式,因而美的型態與層次也不太一樣。最後一講說明美是什麼?美,是心靈的喜悅,是一種感覺,不存然是感官上的感覺,而是更高層次的感動,我們必須認識感官上「快感」與「美感」的差別,並樂於分享美感的體驗。

###

熱門文章