網頁

搜尋此網誌

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講一開始從人類站立後,雙手擁有創造力而誕生藝術,不同時間有著不一樣的工具和生活方式,因而美的型態與層次也不太一樣。最後一講說明美是什麼?美,是心靈的喜悅,是一種感覺,不存然是感官上的感覺,而是更高層次的感動,我們必須認識感官上「快感」與「美感」的差別,並樂於分享美感的體驗。

###

熱門文章