網頁

搜尋此網誌

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)

###

熱門文章