網頁

搜尋此網誌

2013年7月29日 星期一

National Taipei University of Technology 台北科技大學

今年(2013年)捐贈書籍的時間又到了。延續去年 Web 浪潮,今年對於 Web 與行動網頁開發的書籍非常多, HTML5 和 CSS3 方面的基礎書籍已經逐漸飽和(氾濫),出版社開始引進較進階的內容(吸引讀者),像是效能最佳化、大規模建置等議題。

另一方面,NoSQL 資料庫的風潮逐漸受到開發者注意,彈性而無 Schema 的方式讓生產力有所提升,目前也有些 NoSQL 資料庫的書籍翻譯發行。這種有別於關聯式資料庫 (RDBMS) 的開發使用方式還很新,值得各位開發人員學習並評估是否適用。



這次捐贈的書籍清單如下所述:
  • Kristina Chodorow, Michael Dirolf著,吳曜撰譯 ,MongoDB技術手冊,台北:歐萊禮,2012。
  • Christopher Schmitt, Kyle Simpson著,賴屹民譯 ,HTML5 錦囊妙計,台北:歐萊禮,2013。
  • Steve Souders著,楊仁和譯,高效能網站建置指南,台北:歐萊禮,2013。
  • Rachel Andrew著,羅友志譯,CSS3網頁設計師手札,台北:碁峰資訊,2013。
  • 郭欣,巨型網站大師親自指導-建立極速Web站台的祕密,台北:佳魁資訊,2013。
  •  Matt West著,林盈新譯,HTML5 新世代網頁建置-新手也可以快速設計出專業網站,台北:果禾文化,2013。
  • 郭家寶,Google 御用網頁語言 Node.js:一流程式設計師養成精華,台北:佳魁資訊,2013。
  • 高俊峰,網站平台全面換血+完美優化:Linux伺服器加速營運14大原則,台北:佳魁資訊,2013。
  • Pramod J. Sadalage、Martin Fowler著,吳曜撰譯,搞懂NoSQL的15堂課,台北,碁峰資訊,2013。
  • 張春曉等編著,王者歸來:UNIX 王者殿堂,台北:佳魁資訊,2013。
  • Ian Lunn著,陳亦苓譯,CSS3 網頁設計優化-新手也能快速建立跨平台網頁台北:果禾文化,2013。
  • 張宴,Nginx-完全取代Apache,超輕、快、強的Web伺服器,台北:佳魁資訊,2013。
###

2013年7月23日 星期二

NoSQL Distilled 搞懂 NoSQL 的15堂課

最近這一年以來,NoSQL 資料庫越來越熱門,一直缺少一本書籍好好介紹 NoSQL ,現在,「搞懂NoSQL的15堂課 (NoSQL Distilled 中文版)」是很好的基礎入門書,讓我們搞清楚什麼是 NoSQL 資料庫,作者不講各個資料庫的操作細節,而是站在一個高度下有系統的介紹 NoSQL 資料庫,讓我們清楚瞭解 NoSQL 資料庫,不管你是否正在使用 NoSQL ,這本搞懂 NoSQL 的15堂課都非常值得閱讀。

Pramod J. Sadalage、Martin Fowler 著,吳曜撰譯,搞懂 NoSQL 的15堂課,台北,碁峰資訊,2013。
譯自:NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot Persistence

NoSQL 不是 Not Only SQL ,事實是來自 Twitter 的分類標籤 (hashtag) ,由 Johan Oskarsson 命名使用的。實際上, NoSQL 是對一種類型資料庫的統稱,這類資料庫有幾個特徵:聚集 (aggregate) 的資料模型、無綱要 (schemaless) 、使用叢集 (cluster) 執行等,目前世界上有的 NoSQL 清單可以參考這個網站:http://nosql-databases.org/

「搞懂 NoSQL 的15堂課」分成兩大部分共15章,第一部分介紹 NoSQL 的資料模型,主要讓我們瞭解 NoSQL 的特點,第二部分則針對實作進行說明,主要是說明鍵值資料庫 (Key-Value Databases)文件資料庫 (Document Databases)欄位群資料庫 (Column-Family Stores ) 圖形資料庫 (Graph Databases) 這四大資料模型的差異與特性。

NoSQL 由於無綱要的性質,使得程式設計師開發應用程式的生產力提高,加上叢集的實現方式, NoSQL 有利於大規模的資料量。相對的,這些看似優點的特性也產生另外一些問題,例如一致性 (consistency) 的議題,由於無綱要與叢集的性質,這讓資料必須分散在各主機上,加上聚集的資料模型,使資料庫在讀取與更新的一致性必須處理與注意。

書中最後提到不同的資料庫是設計用來解決不同的問題,我們面對 NoSQL 的同時,不應該完全放棄使用關聯式資料庫,針對不同應用場合使用特定的資料庫,或是採用多語言維持 (polyglot persistence) 的儲存方式,這些都值得我們進一步思考設計。

###

2013年7月21日 星期日

Go Programming Language

最近檢視一下Google開發的Go程式語言,這裡是一些學習筆記。
  • 發明者
    • Robert Griesemer
    • Rob Pike
    • Ken Thompson (B語言發明者)
  • 開發小組,總共有5人,除3位發明者外,還有
    • Ian Taylor
    • Russ Cox
Go程式語言的發展歷史,這部份可以參考常見問題,摘要如下:
Go程式語言的標準規範:http://golang.org/ref/spec

Go程式語言的簡介,參考『The Expressiveness of Go』投影片的內容
  • 發明原因:為了Google內部需要
    • 有效率大規模的編程
    • 加速編輯撰寫
    • 分散式系統
    • 多核心與網路硬體
  • 速度與安全,或容易使用,結合下列兩類語言的特質
    • C++, Java
    • Python, JavaScript
  • 設計4原則
    • 簡單(simple)
      • 概念是容易理解認識的
    • 正交(orthogonal)
      • 混合概念是清楚的
      • 容易理解和預測發生什麼行為
    • 簡潔(succint)
      • 不需要預先宣告任何意圖
    • 安全(safe)
      • 違反的行為應該被偵測到
  • 簡單原則可以從語言的關鍵字評比
    • Go語言:25個
    • Python 2.7:31
    • C (K&R):32
    • C++:48
    • C#:77
  • 著眼點
    • Go相信程式設計師所寫下的程式碼
    • 意思是,Go試著尊重程式設計師的意圖
    • 這將是安全(safe)而有趣(fun)
    • 用比喻來說,這是安全帶(seat belts)和輔助輪(training wheels)的差異
到這裡為止,對Go程式語言已有初步的認識,了解Go是為了大規模的分散式系統而發明的程式語言。目前工作上也沒有這類應用場合,所以也不會特別花心思去學習,但Go在大規模Web Application上的應用確實有潛力,值得留意Go程式語言的發展。

###

2013年6月25日 星期二

Beginning Eclipse

Eclipse 是一個強大的整合式開發環境 (Integrated Development Environment, IDE) ,除了可以開發 Java 應用程式之外,也支援其他程式語言的開發,如 C, C++, Python, PHP 等。

這篇文章將說明如何將 Eclipse 安裝在 Ubuntu 上,或者你也可以參閱官方的安裝指南

Step 1. 安裝Java Virtual Machine (JVM)
  • 可以參考 Ubuntu 的社群文件:https://help.ubuntu.com/community/Java
  • JVM 有很多實踐方式,建議安裝 Oracle Java ,可以參考安裝教學
    • 前往http://www.oracle.com/technetwork/java/javase/downloads/index.html
    • 依照作業系統是32或64位元選擇 JRE 下載,以64位元為例,選擇下載 Linux x64 的檔案為 jre-7u21-linux-x64.tar.gz
    • 在 /usr 下建立 java 目錄,指令:sudo mkdir /usr/java
    • 將 jre-7u21-linux-x64.tar.gz 解壓縮至 /usr/java 下,
      指令:sudo tar xzvf jre-7u21-linux-x64.tar.gz -C /usr/java/ --no-same-owner
    • 利用 update-alternatives 安裝 java 命令,指令:
      sudo update-alternatives --install "/usr/bin/java" "java" "/usr/java/jre1.7.0_21/bin/java" 1
    • 在 Terminal 中輸入:java -version,將顯示版本資訊,用以測試 java 是否安裝成功。
Step 2. 安裝 Eclipse
  • 前往http://www.eclipse.org/downloads/
  • Eclipse 有不同套裝軟體(差異請參考比較表),建議下載 Eclipse Classic ,請依據作業系統是32或64位元選擇。
  • 下載後,解壓縮至 /opt 目錄下,以64位元的最新版 Eclipse 為例,指令:
    sudo tar xzvf eclipse-SDK-4.2.2-linux-gtk-x86_64.tar.gz -C /opt --no-same-owner
  • 變更權限,指令:sudo chgrp -R sudo /opt/eclipse/
  • 執行 /opt/eclipse/eclipse 這個執行檔將啟動 Eclipse Classic ,第一次啟動會要求設定工作區 (workspace)
Step 3. 安裝 Marketplace Client
  • Eclipse Classic 預設是沒有安裝 Marketplace Client ,有了 Marketplace Client 可以讓我們安裝延伸套件更加方便,有點類似 App Store !
  • 啟動 Eclipse ,在工具列的 Help 選擇「Install New Software...」,在 Work With 選擇 Juno 項目,下方表格中選擇 General Purpose Tools 的 Marketplace Client 。
  • 按下 Next ,之後確認 License 繼續安裝。安裝完成後會要求重新啟動 Eclipse 。
Step 4. 安裝 Eclipse Color Themes
  • Eclipse Color Themes 是一個佈景配色管理的套件,能夠讓Eclipse的編輯環境有不同的高亮 (highlight) 顯示方式。
  • 啟動 Eclipse ,在工具列的 Help 選擇「Eclipse Marketplace...」,搜尋 Eclipse Color Themes 安裝,完成後重新啟動 Eclipse。
  • 另外必須安裝 Web content engine library for GTK+才能正常工作,
    指令:sudo apt-get install libwebkitgtk-1.0-0
  • 上述步驟都完成後,可以在 Eclipse 的 Preferences 裡面的 Appearance 看到 Color Theme 的設定項目。
到此,你已經擁有一個完整又強大的程式開發環境囉!

補充:
2013/07已經發布 Eclipse 4.3 (代號 Kepler ),看來把 Eclipse Classic 稱為 Eclipse Standard ,這次發行增加許多功能,請見http://eclipse.org/kepler/

###

2013年6月12日 星期三

Big Data 大數據

Big Data稱為巨量資料大數據,這大概是雲端運算之後最為流行的科技議題,然而沒多少人知道什麼是巨量資料。現在,這本「大數據」清楚解釋什麼是巨量資料,以及巨量資料對人類造成的革命性改變(如同雲端運算對商業模式的影響),這本書的內容在技術方面著墨不深,主要是說明巨量資料的觀念與影響,非常適合任何對於巨量資料有興趣的人閱讀,可說是巨量資料的入門書(科普書)。

麥爾荀伯格、庫基耶著,林俊宏譯,大數據,台北:天下遠見,2013。
譯自: Big data: a revolution that will transform how we live, work, and think

「大數據」整本書是一個金字塔架構,全書共10章,從現在談到未來,如果你真的沒有時間,只看第一章也能對巨量資料有基本的認識,這本書建議各位依序閱讀完全,感覺就像上了兩位大數據專家的一堂課。

巨量資料目前還沒有明確定義,不妨參考 Gartner 公司的研究副總裁蘭尼 (Doug Laney) 提出的「三個V」性質(參閱第一章參考資料),即資料量 (volume) 、速度 (velocity) 、種類 (variety) ,這樣對於「巨量」會比較有感覺。這本書沒有確切說明何謂巨量資料,主要是強調巨量資料帶來的改變,主要改變有三點:
  1. 能夠取得、分析的資料量大為增加
  2. 不會堅持一切都要做到精確
  3. 放下長久以來對於因果關係的堅持
之所以有這些改變在於現在是從「小量資料」轉變到「巨量資料」的時刻,由於科技的進步,分析處理巨量資料已經不再困難,然而過去小量資料 (small data) 的時代發產出來概念已不適用於未來。

第一個改變來自於資料取得不是隨機抽樣的方式。過去,因為處理資料能力有限,不得不對真實世界以隨機抽樣取得小量資料,現在,已有能力處理巨量資料,資料的取得盡可能是真實世界的全部且完整的資訊,或者說:全部都是樣本。

第二個改變基於第一個。由於資料是全部的測量點(取樣點),因而產生三個結果:發生錯誤的可能性相對提高、取得不同來源與類型的資料、各資料格式也會不盡一致,這些都是雜亂 (messy) 。雜亂是巨量資料的特性,資料的「精確」已經不是重點,關注的反而是「可能性」這個目標,由於有了全部的資料,我們在乎的是整體輪廓的價值。對於巨量資料而言,資料的數量比品質更為重要。

第三個改變是最重要的變革。基於我們已經擁有完整的資料,分析某個現象的因果關係其實已經不太重要,不太需要知道「為何如此」,我們只需要了解現象之間彼此的相關性 (correlation) ,觀念必須改為知道「正是如此」就夠了,這個概念讓我們得到更多新的「因果關係」,將足以改變我們看待一切的方式。

上述這三個改變將影響我們的生活與工作,並建立全新的思考方式,若想更進一步瞭解巨量資料,這本「大數據」絕對值得好好閱讀。

###

2013年6月4日 星期二

Selenium Browser Automation 瀏覽器自動化

Selenium (硒) 」是一套瀏覽器自動化 (browser automation) 的套件軟體,包含一系列工具程式 (suite of tools) ,最主要的目的是用來自動化測試 (testing) 網頁應用程式 (web application) ,或者利用自動化的功能建立網頁操作的管理工作。簡單來說,利用Selenium去幫我們操作瀏覽器,免除人為操作而達成自動化。

Selenium目前的版本是第2版,稱為「Selenium 2」,Selenium 的工具程式主要有4個部分,其中以 IDE 和 WebDriver 最為重要,各程式介紹如下:
  • Selenium IDE
    這是一個 Firefox 的附加元件,提供測試工作的錄製、編輯、執行與除錯等功能。
  • Selenium WebDriver
    這是一個用來操作瀏覽器的 API,對 Selenium 而言就像是瀏覽器的「驅動程式」,不同瀏覽器必須安裝不同的 WebDriver ,呼叫這個 API 的方式是安裝不同程式語言的程式庫,程式庫將直接對瀏覽器進行操作(直接呼叫瀏覽器的 API )。這是在第2版才加入的工具程式, Selenium WebDriver 又稱為「Selenium 2」。
  • Selenium Remote Control
    簡稱 Selenium RC ,也稱為「Selenium 1」,目前不建議 (deprecated) 使用。 Selenium RC 採用 Server-Client 架構的方式進行瀏覽器自動化,主要是利用瀏覽器內的 JavaScript 來達到自動化的操作。
  • Selenium Grid
    這是可以同時間執行多個 Selenium 的技術,由一個 Hub 和多個 Node 組成一個 Grid ,使用者透過 WebDriver 將測試工作送至 Hub ,而 Hub 將依據瀏覽器不同分派至特定 Node 執行,利用這種方式可以縮短總執行時間。
執行 Selenium 瀏覽器自動化必須在有桌面環境的系統下執行,例如 Windows 或 Ubuntu Desktop 的作業系統,因為 Selenium 會去真的啟動瀏覽器程序並控制它的動作,若要在 Ubuntu Server 上執行就會發生錯誤(沒有安裝瀏覽器)。

一般會建議使用 Windows 系統進行自動化測試,因為在 Windows 上可以執行 Internet Explorer (IE)、Chrome、Firefox、Safari 都不會有問題,適合進行 Web Application 的相容性(跨瀏覽器)測試,因為 IE 只能在 Windows 上執行!不然就是使用 Selenium RC Server ,遠端操作不同作業系統的瀏覽器。

###

2013年5月16日 星期四

Size of Python built-in types 內建型別大小

利用sys模組的getsizeof函式,可以取得Python物件的大小。這裡我用來取得Python內建型別的物件大小,用來分析一個最基本的型別物件(實體化物件,不指定初值)之成本(overhead),各型別物件的大小如下表所述。

TypeSize (Bytes)
bool24
bytearray48
bytes37
complex32
dict280
float24
frozenset232
int24
list72
long24
object16
property88
set232
str37
tuple56
unicode52

可以看到萬物基礎的object物件,其初始大小是16 bytes,其他物件都是繼承至object類別,因此物件不會比「object」小。最大的型別物件是280 bytes,dict用起來非常方便,用key就能取得value,但要注意「成本」,撰寫程式時務必選擇適當的型別,才不會造成記憶體的浪費(雖然,現在記憶體都是1~2GB以上)。

從這個表格也可以看到一件事,可變更(mutable)的物件普遍比不可變更(immutable)來得大,例如「list」比「tuple」大,而「bytearray」比「str」大,如果撰寫程式時不會變更其值,不妨使用較「經濟」的型別!

計算上述物件成本是用程式撰寫而產生,其程式碼如下:

if __name__ == "__main__":
    import types
    import sys
    tbody='<tr><th>Type</th><th>Size (Bytes)</th></tr>'
    for item in dir(__builtins__):
        attr = getattr(__builtins__, item)
        if type(attr) is types.TypeType and \
           not issubclass(attr, BaseException):
            try:
                obj =attr()
                tbody +='<tr><td>%s</td><td>%s</td></tr>' %\
                      (item, sys.getsizeof(obj))
            except TypeError:
                pass
    table = '<table border="1" cellpadding="5" style="width: 80%%;">%s</table>' % tbody
    print table

###

2013年5月14日 星期二

Visualization of Python’s built-in exceptions 視覺化Python內建例外

修改前一篇的程式碼,可以得到內建例外(Built-in Exceptions)的繼承關係。

if __name__ == "__main__":
    import types
    import gv
    g = gv.digraph('exceptions')
    gv.setv(g, 'overlap', 'false')
    gv.setv(g, 'splines', 'true')
    gv.setv(g, 'pad', '1')
    for item in dir(__builtins__):
        attr = getattr(__builtins__, item)
        if type(attr) is types.TypeType and \
           issubclass(attr, BaseException):
            tail = None
            head = None            
            for i in attr.__mro__:
                nodename = i.__name__
                tail = gv.findnode(g, nodename)
                if not tail:
                    tail = gv.node(g, nodename)
                if head and not gv.findedge(tail, head):
                    gv.edge(tail, head)
                head = tail
    
    gv.layout(g, 'neato')
    gv.render(g, 'png', 'built-in_exceptions.png')

視覺化結果如下圖所示:(大圖連結)

由圖上可以看到,例外物件的基底類別是BaseException,而Exception繼承BaseException,提供給所有內建的、系統的與使用者定義的例外去繼承Exception,這裡可以看到Python例外分成兩大類,一個是StandardError,另一個是Warning

###

2013年5月13日 星期一

Visualization of Python’s built-in types 視覺化Python內建型別

利用Graphviz軟體可以將結構性資料用圖形呈現,這裡將以圖形繪製Python內建型別的繼承關係,我使用Graphviz的Python API輸出PNG圖形,程式碼如下:

if __name__ == "__main__":
    import types
    import gv
    g = gv.digraph('types')
    gv.setv(g, 'overlap', 'false')
    gv.setv(g, 'splines', 'true')
    for item in dir(__builtins__):
        attr = getattr(__builtins__, item)
        if type(attr) is types.TypeType and \
           not issubclass(attr, BaseException):
            tail = None
            head = None            
            for i in attr.__mro__:
                nodename = i.__name__
                tail = gv.findnode(g, nodename)
                if not tail:
                    tail = gv.node(g, nodename)
                if head and not gv.findedge(tail, head):
                    gv.edge(tail, head)
                head = tail
    
    gv.layout(g, 'neato')
    gv.render(g, 'png', 'built-in_types.png')

執行完畢之後,將會在程式同一路徑下產生一個檔名為built-in_types的PNG檔。

從這張圖可以看到所有的型別都是繼承至object類別。

###

2013年5月6日 星期一

安裝Python

記錄Python安裝過程與套件管理工具的安裝。

Linux (Ubuntu Distribution)平台,以Ubuntu 12.04 LTS為例。
  • 內建已經安裝Python 2.7。
  • 安裝套件管理工具,指令:sudo apt-get install pip。
Windows平台,以Windows 7 64-bit為例。
  • 下載python-2.7.3.amd64.msi,執行安裝,預設路徑安裝至C:\Python27。
  • 下載setuptools,由於64位元系統沒有MSI安裝精靈,請下載ez_setup.py,使用python.exe執行,指令:C:\Python27\python.exe ez_setup.py
  • 利用easy_install.exe安裝套件管理工具,指令:c:\Python27\Scripts\easy_install.exe pip
在Windows上也可以用pip喔!

如果在開發Python應用程式有需要任何套件,都可以使用「pip install 套件名稱」進行下載安裝(前提是要可以上網),非常方便。

###

熱門文章