網頁

搜尋此網誌

2014年1月5日 星期日

美的曙光

美,從何而來?

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

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

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

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

###

2013年12月19日 星期四

Debian package 套件開發工具

Debian 套件 (Debian package) 有兩種類型,一種是執行檔套件 (Binary package),另一種是原始檔套件 (Source package),一般使用套件管理工具 (如 apt-get ) 安裝的都是執行檔套件。
  • Binary package
    以 .deb 為副檔名,套件裡面包含可直執行檔、組態檔 (configuration file)、man/info 頁面、版權資訊與相關文件。
  • Source package
    包含兩個部分,以 .dsc 為副檔名的描述檔,以及以 .orig.tar.gz 為副檔名的壓縮原始檔,另外也有可能包含一個以 .diff.gz 為副檔名的壓縮檔。
這裡我主要討論最常使用的 Binary package ,說明建置一個執行檔套件需要有哪些套件?在這裡我將採取最原始的 Debian 套件管理程式 (dpkg) 進行這項工作,使用 dpkg-deb 指令建置 Debain 套件。當然,也有其他高階的工具可以使用,不過那隱藏了一些細節,我認為不利於學習,所以我還是採用 dpkg。

由於系統預設已安裝 debconf 和 dpkg 兩個套件,下列是 Ubuntu 內建的指令:
  • 屬於 dpkg 套件
    • dpkg
    • dpkg-deb
    • dpkg-divert
    • dpkg-maintscript-helper
    • dpkg-query
    • dpkg-split
    • dpkg-statoverride
    • dpkg-trigger
  • 屬於 debconf 套件
    • debconf
    • debconf-apt-progress
    • debconf-communicate
    • debconf-copydb
    • debconf-escape
    • debconf-set-selections
    • debconf-show
    • dpkg-preconfigure
    • dpkg-reconfigure
  • 補充:其中有一個 dpkg-log-summary 指令是屬於 xdiagnose 套件,在此不列入。
當我們想要建立一個執行檔套件時,使用內建的 dpkg-deb 指令就可以開始建置,不需要再安裝其他套件。但是一個 Debain 套件包含相關設定,該如何開始學習呢?這時候就必須參考說明文件,除了線上文件之外,建議安裝 dpkg-dev 套件,或是 build-essential 套件 (build-essential已包含 dpkg-dev),dpkg-dev 除了提供一些指令之外,還包含很多有關 Debain 套件的說明文件,對於學習相當有用。

安裝指令是 sudo apt-get install dpkg-dev 或 sudo apt-get install build-essential,安裝完成之後,Ubuntu 將增加下列說明文件,請使用 man 指令讀取:
  • deb-control
  • deb-extra-override
  • deb-old
  • deb-override
  • deb-shlibs
  • deb-split
  • deb-src-control
  • deb-substvars
  • deb-symbols
  • deb-triggers
  • deb-version
  • deb
  • dpkg-architecture
  • dpkg-buildflags
  • dpkg-buildpackage
  • dpkg-checkbuilddeps
  • dpkg-distaddfile
  • dpkg-genchanges
  • dpkg-gencontrol
  • dpkg-gensymbols
  • dpkg-mergechangelogs
  • dpkg-name
  • dpkg-parsechangelog
  • dpkg-scanpackages
  • dpkg-scansources
  • dpkg-shlibdeps
  • dpkg-source
  • dpkg-vendor
參考資料:
補充:還有 debconf-doc 套件有其他的說明文件。
###

2013年12月11日 星期三

nginx 網頁伺服器

nginx (念作 engine x )是一個由 Igor Sysoev 所開發的伺服器軟體,主要用作 HTTP 和反向代理伺服器,也可以用作郵件代理伺服器。

在 Ubuntu 上安裝只需要使用 apt-get 安裝即可,指令是:sudo apt-get install -y nginx

總共會安裝 3 個套件:nginx, nginx-common, 與 nginx-full,nginx 套件設定的套件相依性,提供 nginx 安裝的進入點,nginx-full 套件包含 nginx 的執行檔,而 nginx-common 則是預設設定檔和說明文件。

安裝完 nginx 之後,預設是沒有開啟伺服器,請用 sudo service nginx start 或 sudo service nginx restart 啟動服務,在瀏覽器輸入 http://127.0.0.1 將會看到「Welcome to nginx」的訊息。

nginx 的設定檔是 /etc/nginx/nginx.conf , 預設的使用者名稱是 www-data,有一個預設虛擬主機的設定檔在 /etc/nginx/sites-available/default ,相關的參數設定可以參考 nginx 核心功能的說明。

最後介紹一本參考書籍,由佳魁資訊所出版的「Nginx-完全取代Apache,超輕、快、強的Web伺服器」,這大概是中文第一本有關 nginx 的書籍,全書共分為四篇:基礎篇、進階篇、實戰篇與模組篇,大致上涵蓋所有 nginx 所需要的知識。不過書上所介紹的 nginx 版本是 0.6.x 版,目前已經是 1.4.x 版,Google 之後發現原簡體書是 2010 年所發行的,目前看來內容稍微舊了一點,但這不影響學習與參考的價值。

張宴,Nginx-完全取代Apache,超輕、快、強的Web伺服器,台北:佳魁資訊,2012。
譯自:實戰Nginx:取代Apache的高性能Web伺服器,電子工業出版社,2010年3月。

補充,目前2013年佳魁資訊已再出版另一本「王者歸來:進擊的伺服器 - 用Nginx取代Apache建立全語言種類的雲端網站」,有興趣者可以參考。

###

2013年12月3日 星期二

Lexical structure of JavaScript and Python 詞彙結構

詞彙結構 (Lexical Structure) 是程式語言最基礎的規則,說明如何使用一個程式語言撰寫程式。當程式語言定義一套詞彙結構之後,程式開發人員撰寫程式碼,詞彙分析器 (Lexical Analyzer) 將程式碼分析為標記 (token),解析器 (parser) 處理標記才能給編譯器或解析器處理,由此可知,一個程式語言最底層的是詞彙結構,若要設計一個程式語言,也應該要從詞彙結構開始。

這裡我將比較 JavaScript 和 Python 這兩種程式語言的詞彙結構。

JavaScript (ECMAScript 3) Python (2.6)
字元集 (character set) Unicode 預設是7-bit ASCII
可使用特殊註解指定字元集
# -*- coding: encoding -*-
識別字 (identifier) 區分大小寫 (case-sensitive)
字母、底線或錢字符號開始
區分大小寫
字母或底線開始
註解 (comment) //雙斜線表示單行註解
/*斜線與星號之間為多行註解*/
#數字符號 (number sign) 表示單行註解
"""多行註解可用3個單引號或雙引號"""
空白 (space) space (\u0020)
tabulation (\u0009)
vertical tabulation (\u000B)
form feed (\u000C)
no-break space (\u00A0)
byte order mark (\uFEFF)
space (\u0020)
tabulation (\u0009)
form feed (\u000C)
行結束字元 (line terminator) line feed (\u000A),即LF
carriage return (\u000D),即CR
line separator (\u2028)
paragraph separator (\u2029)
基本上是line feed (\u000A)
Windows平台則是CRLF
Unix平台則是LF
多行程式碼 程式碼直接分行,最後必須用分號 (semicolon ;) 結束 每行結尾必須用反斜線 (backslash \) 表示分行
關鍵字 (keyword)
保留字 (reserved words)
基本上共29個
break case catch
continue debugger default
delete do else
false finally for
function if in
instanceof new null
return switch this
throw true try
typeof var void
while with

ECMAScript 5增加下列幾個
class const enum export 
extends import super
共31個
and as assert  
break class continue
def del elif
else except exec
finally for from
global if import
in is lambda
not or pass
print raise return
try while with
yield
字面值 (literal) 數字(整數、浮點數)
字串
布林
正規表示式
物件
陣列
字串
數字(整數、浮點數、複數)


###

2013年11月23日 星期六

Knockout JavaScript Library

Knockout 是一個 JavaScript 的程式庫,簡稱 KO ,Knockout 是基於 MVVM (Model-View-View Model) 的設計模式,主要是提供資料繫結 (data-binding) 的功能,讓 UI 與資料模型之間能夠自動地動態更新。

MVVM 設計模式將 Web Application 分成下列三個部分:
  • Model
    模型是指 Web App處理的資料本身,與 UI 沒有任何關係,通常是伺服端資料庫儲存的資料,瀏覽器透過 Ajax 方式取得。
  • View Model
    檢視模型是指 UI 上資料 (data) 與操作 (operations) 的部分,在 Web App 中是一個 JavaScript 物件,物件的屬性對應至 UI 上的資料,而物件的方法則是操作的部分。
  • View
    檢視是檢視模型中可見的 (visible)、互動的部分,在 Web App 中是 HTML 文件,檢視顯示 View Model 的資訊,將命令傳送給 View Model ,並依據 View Model 的狀態更新顯示內容。
使用 KO 開發  Web App 時,我們通常會在前端(用戶端)撰寫 JavaScript 程式,做為 View Model,並設計  HTML 做為 View 的顯示,在 HTML 中使用 data-bind 屬性繫結 View Model。另一方面,後端(伺服端)則是以 Python 或 PHP 等提供資料庫存取的功能,接收或傳送Model 的 JSON 資料。

Knockout 中最重要的是物件「observable」,當 View Model 物件的屬性是 observable 物件時,KO 將自動提供雙向的資料繫結,在 KO 中有 3 種 observable:
  • ko.observable
  • ko.computed
  • ko.observableArray
一般最常使用的是 ko.observable,提供最基本的資料繫結,適合單一個物件的繫結,而 ko.observableArray 則是多個物件的繫結,KO 用的是陣列方式處理物件集合。最後 ko.computed 則提供將 observable 物件計算出新的 observable 物件,例如姓氏是 ko.observable,而名子是另一個  ko.observable,我們則可以利用 ko.computed 計算出姓名。

有了 MVVM 和 observable 的概念,已經可以著手開發以 KO 為基礎的 Web App 了,剩下只是認識 KO 提供的語彙,所幸內容不多很容易快速上手。如果你常常開發 CRUD 類型的 Web App,可以考慮採用 Knockout 程式庫。

###

2013年11月21日 星期四

JavaScript: The Definitive Guide

溫故知新:複習已經學過的知識,也能有新的認識和體會,這是我閱讀「JavaScript 大全」這本書的心得。不論你是 JavaScript 的初學者,或是已經熟悉 JavaScript 的使用者,這本書都能讓你學習並精通 JavaScript 。

David Flanagan著,黃銘偉譯,JavaScript大全,台北:碁峯資訊,2012。(共1080頁,定價  NT$1200 )
譯自:JavaScript: The Definitive Guide, O'Reilly Media, 1100 pages

「JavaScript 大全」總共分成四個部分,實際上內容只有兩個主幹,分別是核心 JavaScript客戶端 JavaScript。前兩部分說明核心與客戶端 JavaScript,後兩部分則是參考資料,因此這本書兼具學習手冊與參考手冊兩種用途。

核心 JavaScript (Core JavaScript) 這一部分主要講述 JavaScript 程式語言本身,包含程式語言的語彙結構、型別、運算式、運算子、陳述式、物件、陣列、函式等,一切有關程式語言的基本要素。

客戶端 JavaScript (Client-Side JavaScript)這部分則是介紹運行 JavaScript 的環境,包含瀏覽器和 HTML5 所提供的 API,其中一章介紹 jQuery 程式庫,讓開發 Web App更加方便,大致上已經涵蓋客戶端所需的相關知識。

我認為這本「JavaScript 大全」是 JavaScript 的聖經本,厚度與價格都是第一名,建議每位  Web 開發人員都必須擁有一本。
###

2013年11月4日 星期一

Development Environment 開發環境

在 Ubuntu 上面開發 Python 應用程式時,需要準備開發環境 (Development Environment),包含編輯器與 Python 相關套件,過去我常常手動逐一安裝,雖然一一安裝並不麻煩,但卻需要花費時間等待,於是寫了一個 Python Script 讓開發環境完全自動化安裝如下。

這個 Script 會安裝 JRE 用於執行 Eclipse IDE,並且安裝 Web Tools Platform 和 PyDev Eclipse Plugin,還有安裝 bpython 便於操作 Python Interpreter,以及 Python 套件管理程式 (pip)。其他 Git 版本管理工具和 Vim 編輯器也一併安裝。

執行 Eclipse 的參數可以參考 Provisioning platform (p2) 或 Running Eclipse

#!/usr/bin/env python
import subprocess
import sys

# JRE
subprocess.call(['wget',
                 '--no-cookies',
                 '--no-check-certificate',
                 '--header', 'Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F',
                 'http://download.oracle.com/otn-pub/java/jdk/7u45-b18/jre-7u45-linux-x64.tar.gz'])
subprocess.call(['mkdir', '/usr/java'])
subprocess.call(['tar', 'xzvf', 'jre-7u45-linux-x64.tar.gz', '-C', '/usr/java', '--no-same-owner'])
subprocess.call(['update-alternatives', '--install', '/usr/bin/java', 'java', '/usr/java/jre1.7.0_45/bin/java', '1'])
subprocess.call(['java', '-version'])

# Eclipse
subprocess.call(['wget', 'http://eclipse.stu.edu.tw/technology/epp/downloads/release/kepler/SR1/eclipse-standard-kepler-SR1-linux-gtk-x86_64.tar.gz'])
subprocess.call(['tar', 'xzvf', 'eclipse-standard-kepler-SR1-linux-gtk-x86_64.tar.gz', '-C', '/opt', '--no-same-owner'])
subprocess.call(['chgrp', '-R', 'sudo', '/opt/eclipse/'])
subprocess.call(['/opt/eclipse/eclipse',
                 '-application', 'org.eclipse.equinox.p2.director',
                 '-repository', 'http://download.eclipse.org/releases/kepler',
                 '-destination', '/opt/eclipse',
                 '-installIU', 'org.eclipse.wst.web_ui.feature.feature.group'])
subprocess.call(['/opt/eclipse/eclipse',
                 '-application', 'org.eclipse.equinox.p2.director',
                 '-repository', 'http://pydev.org/updates',
                 '-destination', '/opt/eclipse',
                 '-installIU', 'org.python.pydev.feature.feature.group'])
subprocess.call(['chmod', '-R', '775', '/opt/eclipse'])

# APT package
subprocess.call(['apt-get', 'update'])
subprocess.call(['apt-get', '-y', 'install', 'vim'])
subprocess.call(['apt-get', '-y', 'install', 'bpython'])
subprocess.call(['apt-get', '-y', 'install', 'git'])
subprocess.call(['apt-get', '-y', 'install', 'python-pip'])

# Desktop Menu
f=open('/usr/share/applications/eclipse.desktop','w')
f.write('''[Desktop Entry]
Type=Application
Name=Eclipse
Exec=/opt/eclipse/eclipse
Icon=/opt/eclipse/icon.xpm
Terminal=false
''')
f.close()

# exit
sys.exit()

歡迎大家參考利用。
###

2013年11月1日 星期五

Multiple Instances of Apache2 多網頁伺服器實體

這篇文章記錄如何將 Apache 設定成多個實體執行。所謂的實體 (instance) 指的是一個完整的執行環境,由多個程序 (process) 或執行緒 (thread),與一個設定組態 (configuration) 所組成。一個主機 (host) 上可以同時擁有多個執行實體,但為何需要多個 Apache 實體呢?

如果需要在一台主機上提供多個網站,使用虛擬主機 (virtual host) 的方式就可以達成,其實不需要多個 Apache 實體。不過採用虛擬主機的前提是:這些虛擬主機都是用相同的模組  (module) 的情況,例如所有的虛擬主機都是執行 PHP 而使用 php5_module 模組,或是為了執行 Python 而使用 mod_wsgi 模組。

當然,你也可以一起載入所有的模組,只是這樣不太好,明明我的虛擬主機只要執行 PHP,卻要載入其他 mod_wsgi 、 mod_perl 之類的模組,造成記憶體的浪費,對於電腦資源的利用不是很有效率。因此,面對這種「多語言」的使用情境,我們就有可能需要多個 Apache 實體。

在 Ubuntu 上建立多個 Apache 實體其實不難,先利用 apt-get install apache2 安裝完 Apache 之後,我們可以在範例中找到建立多個 Apache 實體的 script 程式碼,這個 script 基本上就是建立一組全新的設定組態和 daemon 啟動程式。使用語法如下:

usage: /usr/share/doc/apache2/examples/setup-instance <suffix>

例如:bash /usr/share/doc/apache2/examples/setup-instance mysite,就會建立一個新的mysite實體,原本常用的 apache2ctl 指令會變成 apache2ctl-mysite,其他設定檔也會多了「 -mysite」的字尾。

如果你要啟動新的 Apache 實體,記得去利用 Listen 指令修改伺服器的埠號,不然會與原本的 Apache 發生衝突。以上面例子來說,修改 /etc/apache2-mysite/ports.conf 設定檔,然後執行 sudo service apache2-mysite start 就能啟動新的 Apache 實體。

參考文件:
###

2013年9月25日 星期三

Ubuntu 上安裝與部署 Django

在很久以前曾經說明 Django 在 Windows 的安裝步驟,這篇文章將說明如何在 Ubuntu 上安裝 Django ,並且使用 mod_wsgi 部署在 Apache 伺服器上運行。

廢話不多說,直接提供 Shell Script 安裝部署,可以將下列程式碼儲存為檔案,利用 Bash 執行後將建立一個mysite的網站,你也可以修改 NAME 變數使用不同的網站名稱。

#! /bin/bash

#安裝 Apache HTTP Server, WSGI模組, Python套件安裝器
apt-get -y install apache2
apt-get -y install libapache2-mod-wsgi
apt-get -y install python-pip

#安裝Django web framework
pip install django

#網站名稱變數
NAME=mysite

cd /var/www

#新增一個名稱為NAME的Django專案
django-admin.py startproject $NAME

#新增虛擬主機的組態檔,最精簡的設定
(
cat <<EOF
<virtualhost *:80>
        WSGIScriptAlias / /var/www/$NAME/$NAME/wsgi.py
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</virtualhost>
EOF
) > /etc/apache2/sites-available/$NAME

#設定PYTHONPATH,Python執行時尋找程式庫的位置
(
cat <<EOF
import sys
PROJECT_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(PROJECT_PATH)
EOF
) >> /var/www/$NAME/$NAME/wsgi.py

#啟用Django專案的虛擬主機,關閉預設的虛擬主機
a2ensite $NAME
a2dissite default

#使Apache伺服器重新載入設定檔
service apache2 reload

正確執行後,打開瀏覽器,輸入主機IP或本機位置 (http://127.0.0.1),將可以看到 Django 的歡迎畫面:



其他參考資料

###

2013年9月23日 星期一

NetworkManager 網路管理員

Ubuntu Desktop 的網路設定是由 NetworkManager 管理,NetworkManager 簡稱 NM,目前最新的版本是 0.9.8.x, NM 提供圖形化介面讓使用者設定網路連線,使用者不用去修改 /etc/network/interfaces 這個設定檔,這裡將介紹 NetworkManager 的相關資料與PPPoE的設定方式。

相關資料

設定資訊

  • NetworkManager 的組態檔資料夾位置
    /etc/NetworkManager
  • NetworkManager 的系統組態檔
    /etc/NetworkManager/NetworkManager.conf
  • 系統組態檔的設定意義
    參考:https://wiki.gnome.org/NetworkManager/SystemSettings
    或是:man NetworkManager.conf

預設系統組態檔內容:
[main]
plugins=ifupdown,keyfile
dns=dnsmasq

[ifupdown]
managed=false

意思是使用 ifupdown 和 keyfile 兩個外掛,dns使用dnsmasq這個DNS快取。
ifupdown 從 /etc/network/interfaces 讀取連線,managed=false 是指 /etc/network/interfaces 中的連線不受管理,會被 NetworkManager 忽略。

其他指令

  • 重新啟動 NetworkManager:
    sudo service network-manager restart
  • NetworkManager 完整的使用說明:
    man NetworkManager
  • 命令列工具:
    nmcli
  • 列出連線狀態與裝置資訊(實用!)
    nm-tool

PPPoE

有關PPPoE的設定不建議使用 NetworkManager ,因為經過測試發現,開機後不會自動連線,需要手動點選連線實在不方便,我建議使用pppoeconf這項工具程式,在terminal中輸入pppoeconf會出現對話視窗,輸入使用者帳號和密碼,完成設定後輸入pon dsl-provider手動連線。重新開機後,一樣會自動建立PPPoE連線。

參考資料:https://help.ubuntu.com/community/ADSLPPPoE

###

熱門文章