因綠際會讓我有機會去研究 Amazon Web Service 。那是個與 GAE 功能相同,但操作模式不盡相同的雲端服務。
閱讀更多…
轉移公告
計劃把 http://blog.hoamon.info/ 文章全部轉移至 http://www.hoamon.info/blog/ 這裡,而本 Blogger 站台的文章近 500 篇,我預計在 2014-12-31 前移轉完畢,完成後 http://blog.hoamon.info/ 將只作代轉服務,一律把舊連結如 http://blog.hoamon.info/index.html 轉成 http://www.hoamon.info/blog/index.html ,敬請舊雨新知互相走告。
何岳峰 敬上
2012年9月18日 星期二
2011年6月11日 星期六
Install Python2.5 on Ubuntu 11.04 x86_64 for Google App Engine
之前所提的「Install Python2.5 on Ubuntu 10.04 i386 for Google App Engine」,主要是在 i386 Ubuntu 的安裝方式。我這一次換了電腦,也裝了 Ubuntu 11.04 amd64 的版本,所以安裝方式有些許不同:
1. 系統內建的 sqlite 函式庫無法連結。
2. 某些 .so 檔不再放在 /usr/lib ,而是在 /usr/lib32, /usr/lib64, /usr/lib/x86_64-linux-gnu 等地。
另外在安裝 python2.5 時,也想順便套上 readline 及 ipython 。以下是安裝過程:
先裝上 Ubuntu 內建的函式庫:
$ apt-get install liblcms1-dev zlib1g-dev libfreetype6-dev libjpeg62-dev libsqlite3-dev libssl-dev tk-dev libreadline-dev
安裝 sqlite3:
$ cd sqlite-autoconf-3070603/
$ ./configure --prefix=/usr/local/sqlite3 --enable-readline --enable-threadsafe --enable-dynamic-extensions
$ make && sudo make install
安裝 Python2.5.6:
$ cd Python2.5.6/
$ ./configure --prefix=/usr/local/python25 --with-zlib -with-zlib-library=/usr/lib/x86_64-linux-gnu --with-zlib-include=/usr/include --with-tk --with-tk-library=/usr/lib32 --with-tk-include=/usr/include --with-tcl --with-tcl-library=/usr/lib32 --with-tcl-include=/usr/include --libdir=/usr/local/sqlite3/lib --includedir=/usr/local/sqlite3/include --with-freetype2 --with-jpeg --with-readline
$ make && sudo make install
安裝 ipython
$ cd ipython/
$ sudo /usr/local/python25/bin/python2.5 setup.py install
安裝 GAE 相依模組 ipaddr:
$ cd ipaddr-2.1.1/
$ sudo /usr/local/python25/bin/python2.5 setup.py install
安裝 GAE 相依模組 python-ssl:
$ cd python-ssl-1.15/
$ cp -rf ../Python2.5.6/Include/* /usr/local/python25/include/ # 需要 Python 源碼
$ sudo /usr/local/python25/bin/python2.5 setup.py install
安裝 PIL:
修改 Imaging-1.1.7/setup.py 中的參數如下:
TCL_ROOT = '/usr/lib32'
JPEG_ROOT = '/usr/lib32'
ZLIB_ROOT = '/usr/lib/x86_64-linux-gnu/'
TIFF_ROOT = '/usr/lib32'
FREETYPE_ROOT = '/usr/lib32'
LCMS_ROOT = '/usr/lib32'
檢查模組是否可使用
$ /usr/local/bin/python2.5 setup.py build_ext -i
測試模組
$ /usr/local/bin/python2.5 selftest.py
看到如下訊息,就代表模組皆有支援
--- PIL CORE support ok
--- TKINTER support ok
--- JPEG support not installed
--- ZLIB (PNG/ZIP) support not installed
--- FREETYPE2 support ok
--- LITTLECMS support ok
再執行
$ sudo /usr/local/python25/bin/python2.5 setup.py install
最後,再把 dev_appserver.py, appcfg.py 中的 #!/usr/bin/env python 改成 #!/usr/bin/env python2.5 即可(也不是必須的,只要你知道執行 GAE server 時是用 python2.5 就夠了)。
完成後就可以在 Ubuntu 11.04+ x86_64 中開發 GAE 程式了。
1. 系統內建的 sqlite 函式庫無法連結。
2. 某些 .so 檔不再放在 /usr/lib ,而是在 /usr/lib32, /usr/lib64, /usr/lib/x86_64-linux-gnu 等地。
另外在安裝 python2.5 時,也想順便套上 readline 及 ipython 。以下是安裝過程:
先裝上 Ubuntu 內建的函式庫:
$ apt-get install liblcms1-dev zlib1g-dev libfreetype6-dev libjpeg62-dev libsqlite3-dev libssl-dev tk-dev libreadline-dev
安裝 sqlite3:
$ cd sqlite-autoconf-3070603/
$ ./configure --prefix=/usr/local/sqlite3 --enable-readline --enable-threadsafe --enable-dynamic-extensions
$ make && sudo make install
安裝 Python2.5.6:
$ cd Python2.5.6/
$ ./configure --prefix=/usr/local/python25 --with-zlib -with-zlib-library=/usr/lib/x86_64-linux-gnu --with-zlib-include=/usr/include --with-tk --with-tk-library=/usr/lib32 --with-tk-include=/usr/include --with-tcl --with-tcl-library=/usr/lib32 --with-tcl-include=/usr/include --libdir=/usr/local/sqlite3/lib --includedir=/usr/local/sqlite3/include --with-freetype2 --with-jpeg --with-readline
$ make && sudo make install
安裝 ipython
$ cd ipython/
$ sudo /usr/local/python25/bin/python2.5 setup.py install
安裝 GAE 相依模組 ipaddr:
$ cd ipaddr-2.1.1/
$ sudo /usr/local/python25/bin/python2.5 setup.py install
安裝 GAE 相依模組 python-ssl:
$ cd python-ssl-1.15/
$ cp -rf ../Python2.5.6/Include/* /usr/local/python25/include/ # 需要 Python 源碼
$ sudo /usr/local/python25/bin/python2.5 setup.py install
安裝 PIL:
修改 Imaging-1.1.7/setup.py 中的參數如下:
TCL_ROOT = '/usr/lib32'
JPEG_ROOT = '/usr/lib32'
ZLIB_ROOT = '/usr/lib/x86_64-linux-gnu/'
TIFF_ROOT = '/usr/lib32'
FREETYPE_ROOT = '/usr/lib32'
LCMS_ROOT = '/usr/lib32'
檢查模組是否可使用
$ /usr/local/bin/python2.5 setup.py build_ext -i
測試模組
$ /usr/local/bin/python2.5 selftest.py
看到如下訊息,就代表模組皆有支援
--- PIL CORE support ok
--- TKINTER support ok
--- JPEG support not installed
--- ZLIB (PNG/ZIP) support not installed
--- FREETYPE2 support ok
--- LITTLECMS support ok
再執行
$ sudo /usr/local/python25/bin/python2.5 setup.py install
最後,再把 dev_appserver.py, appcfg.py 中的 #!/usr/bin/env python 改成 #!/usr/bin/env python2.5 即可(也不是必須的,只要你知道執行 GAE server 時是用 python2.5 就夠了)。
完成後就可以在 Ubuntu 11.04+ x86_64 中開發 GAE 程式了。
2010年7月4日 星期日
「郵遞區號」: 3+2 = 5 碼郵遞區號查詢離線網頁程式(已放上 Google Code)
當我開始開發資訊系統時,就一直認為地址處理是一般資訊系統中最基本且常見的功能。不過,目前使用過的資訊系統,了不起就是把 3 碼郵遞區號作完而已,很少看到網頁系統有作到無碼 5 碼的地址處理功能(當然啦,郵局自家的確有提供 5 碼查詢功能,但是不好用)。所以我想郵局苦心推動大家使用 5 碼,除了能讓寄信速度加快外,未來在許多 GIS 應用愈來愈普及下,我相信大家都會利用 5 碼郵遞區號來作加值應用的。
所以為了搔自己的癢,我寫了 http://zipcode.ho600.com/ 網站,除了可作網上查詢 5 碼功能外,也把 HTML5 的 Offline 作進去,讓查詢功能可在無網路的本機端處理。另外也提供其他人嵌入「地址查詢表單」的方法。詳細說明請見「嵌入方法」,本專案我也放到 Google Code 開發,授權條款是 NEW BSD License ,希望能聽到您們的聲音。
這個程式是跑在 GAE 上的,不過可以很容易地移稙到其他框架中,因為這個功能,我主要是用 javascript 開發的。 GAE 不過提供檔案放置的功能。
注意,第一次瀏覽會比較慢,因為要把約 2MB 的郵遞區號資訊下載下來。不過,如果你用的是支援 html5 offline 功能的瀏覽器,像 Firefox3.6+, chrome4+, safari4+ 的話,之後就不用再下載了。
範例:
所以為了搔自己的癢,我寫了 http://zipcode.ho600.com/ 網站,除了可作網上查詢 5 碼功能外,也把 HTML5 的 Offline 作進去,讓查詢功能可在無網路的本機端處理。另外也提供其他人嵌入「地址查詢表單」的方法。詳細說明請見「嵌入方法」,本專案我也放到 Google Code 開發,授權條款是 NEW BSD License ,希望能聽到您們的聲音。
這個程式是跑在 GAE 上的,不過可以很容易地移稙到其他框架中,因為這個功能,我主要是用 javascript 開發的。 GAE 不過提供檔案放置的功能。
注意,第一次瀏覽會比較慢,因為要把約 2MB 的郵遞區號資訊下載下來。不過,如果你用的是支援 html5 offline 功能的瀏覽器,像 Firefox3.6+, chrome4+, safari4+ 的話,之後就不用再下載了。
範例:
2010年5月28日 星期五
Install Python2.5 on Ubuntu 10.04 i386 for Google App Engine
Ubuntu 10.04 已經預設不包 Python2.5 了,對寫 GAE 的人來說,這有點麻煩,到目前為止 GAE 並未正式地支援 2.6 ,所以最好認命地在 Ubuntu 10.04 中創建一個 Python2.5 的環境。
裝 2.5 的目的是為了開發 GAE 程式,所以我們需要額外下載這些程式碼:
# 利用 apt-get 安裝相關函式庫,除 libssl-dev 外,其他的套件是給 PIL 用的
$ sudo apt-get install liblcms1-dev zlib1g-dev libfreetype6-dev libjpeg62-dev libsqlite3-dev libssl-dev
# 安裝 Python2.5.5 至 /usr/local
$ tar -jxf Python-2.5.5.tar.bz2
$ cd Python-2.5.5
$ ./configure -with-zlib-library=/usr/lib --with-zlib-include=/usr/include --with-tk --with-tcl-library=/usr/lib --with-tcl-include=/usr/include --with-tk-library=/usr/lib --with-tk-include=/usr/include
$ make
$ sudo make install
# 安裝 GAE 相依模組 ipaddr
$ tar -zxf ipaddr-2.1.1.tar.gz
$ cd ipaddr-2.1.1/
$ sudo /usr/local/bin/python2.5 setup.py install
# 安裝 GAE 相依模組 python-ssl
$ tar -zxf python-ssl-1.15.tgz
$ cd python-ssl-1.15/
$ sudo /usr/local/bin/python2.5 setup.py install
#安裝 PIL
$ tar -zxf Imaging-1.1.7.tar.gz
$ cd Imaging-1.1.7
# 修改 setup.py 中的使用函式庫位置
# LCMS_ROOT = '/usr/lib'
# TCL_ROOT = '/usr/lib'
# JPEG_ROOT = "/usr/lib"
# ZLIB_ROOT = "/lib"
# TIFF_ROOT = '/usr/lib'
# FREETYPE_ROOT = "/lib"
#檢查模組是否可使用
$ /usr/local/bin/python2.5 setup.py build_ext -i
#測試模組
$ /usr/local/bin/python2.5 selftest.py
PIL 1.1.7 TEST SUMMARY
--------------------------------------------------------------------
Python modules loaded from ./PIL
Binary modules loaded from ./PIL
--------------------------------------------------------------------
--- PIL CORE support ok
--- TKINTER support ok
*** JPEG support not installed
*** ZLIB (PNG/ZIP) support not installed
--- FREETYPE2 support ok
--- LITTLECMS support ok
--------------------------------------------------------------------
雖然有過 build_ext ,但到了 selftest.py 時,我總是會得到 JPEG 及 ZLIB 兩種函式庫不支援的情形,但因為我的網頁程式不太用到影像處理的功能,所以我直接強制安裝 pil 。
$ sudo /usr/local/bin/python2.5 setup.py install
最後,再把 dev_appserver.py, appcfg.py 中的 #!/usr/bin/env python 改成 #!/usr/bin/env python2.5 即可(也不是必須的,只要你知道執行 GAE server 時是用 python2.5 就夠了)。
完成後就可以在 Ubuntu 10.04+ 中開發 GAE 程式了。
2009年5月31日 星期日
將三個網址全托管給同一個 GAE(google app engine) 程式
在我還將網頁程式全部放在 Ubuntu 中以 Apache 服務時,針對不同類型的資料,我會給定不同的網址像是: www.hoamon.info, down.hoamon.info, ssvn.hoamon.info, book.hoamon.info …等。但是現在我的策略是把所有個人化的網站全部交給 GAE 處理。
既然如此,難道我要一個網址就開一個 GAE spot 嗎? 如果我的各項個人化網站的資料是超過 500mb 的話,在不想花錢的情況下,的確是一個網站開一個 GAE spot ,但我的個人化網站的資料量都不大,這麼作太浪費了。
這次我想整合的網址是 down.hoamon.info, ssvn.hoamon.info ,它們兩個網址原本就只是在作靜態檔案的分享,一個是鬆散無結構化集成的檔案,另一個則是有作 subversion 管理的檔案。
因為在我其他已存在的文章、網頁以及我正使用的名片上,早就標明那些檔案的下載網址,像是: http://ssvn.hoamon.info/OpenTrunk/hoamon.pgp.asc 、 http://down.hoamon.info/resume070403.tex …等。所以我不能變更這些已存在的 url ,而是讓 GAE 能分辦那些 url 要求是要跑到原本 www.hoamon.info spot 的,那些 url 則是直接以靜態方式存取的。
我打算讓 http://down.hoamon.info/(.*) 的 url 會被 redirect 成 http://down.hoamon.info/_d/(.*); 而 http://ssvn.hoamon.info/(.*) 的 url 則被 redirect 成 http://ssvn.hoamon.info/_s/(.*) 。
這樣我就能在 app.yaml 設定如下:
那麼如何讓 down.hoamon.info 開頭的網址能 redirect 成 down.hoamon.info/_d 的呢? 我們就必須在 index_views.py 動手腳了。在 GAE 中,要讓 python 程式得取目前的 http request 是以什麼 url 作要求的,就是從這個變數 request.headers['HOST'] 下手,不過這個變數目前好像只存在於 webapp.RequestHandler 中,所以我處理的方式如下:
因為我只會在 webapp.RequestHandler.request.headers['HOST'] 中抓到使用者要求網址,所以就會把 dispatch 邏輯寫在 view(MTV)/controller(MVC) 中,這樣的程式能完成工作但不算漂亮。
GAE spot 的程式完成後,記得還要把 down.hoamon.info, ssvn.hoamon.info CNAME 到 ghs.google.com *,這樣就成功合併了。
PS1 額外提醒! 這個動作是要到你的 domain name 服務商的設定介面處理。不過,你也得在 GAE 的 [admin 介面]
> [Versions]
> [Add Domain]
> [填入 hoamon.info(請不要照填 hoamon.info ,這是我的托管給 google apps 的網址,你的一定不是這個。且作這一步驟,你得先有 Google Apps 帳戶才行)]
> [填入密碼]
> [Add new url(像是 down.hoamon.info, ssvn.hoamon.info 等)]
才行。
既然如此,難道我要一個網址就開一個 GAE spot 嗎? 如果我的各項個人化網站的資料是超過 500mb 的話,在不想花錢的情況下,的確是一個網站開一個 GAE spot ,但我的個人化網站的資料量都不大,這麼作太浪費了。
這次我想整合的網址是 down.hoamon.info, ssvn.hoamon.info ,它們兩個網址原本就只是在作靜態檔案的分享,一個是鬆散無結構化集成的檔案,另一個則是有作 subversion 管理的檔案。
因為在我其他已存在的文章、網頁以及我正使用的名片上,早就標明那些檔案的下載網址,像是: http://ssvn.hoamon.info/OpenTrunk/hoamon.pgp.asc 、 http://down.hoamon.info/resume070403.tex …等。所以我不能變更這些已存在的 url ,而是讓 GAE 能分辦那些 url 要求是要跑到原本 www.hoamon.info spot 的,那些 url 則是直接以靜態方式存取的。
我打算讓 http://down.hoamon.info/(.*) 的 url 會被 redirect 成 http://down.hoamon.info/_d/(.*); 而 http://ssvn.hoamon.info/(.*) 的 url 則被 redirect 成 http://ssvn.hoamon.info/_s/(.*) 。
這樣我就能在 app.yaml 設定如下:
...
...
...
- url: /_s
static_dir: ssvn_dir
- url: /_d
static_dir: down_dir
...
...
...
- url: /.*
script: index_views.py
那麼如何讓 down.hoamon.info 開頭的網址能 redirect 成 down.hoamon.info/_d 的呢? 我們就必須在 index_views.py 動手腳了。在 GAE 中,要讓 python 程式得取目前的 http request 是以什麼 url 作要求的,就是從這個變數 request.headers['HOST'] 下手,不過這個變數目前好像只存在於 webapp.RequestHandler 中,所以我處理的方式如下:
class Index(webapp.RequestHandler):
def get(self, args):
# 在這裡判斷使用者要看的是那一個網站,然後再作 redirect 的動作。
HTTP_HOST = self.request.headers['HOST']
if 'down.hoamon.info' == HTTP_HOST:
self.redirect('/_d/%s' % args)
elif 'ssvn.hoamon.info' == HTTP_HOST:
self.redirect('/_s/%s' % args)
# end
...
_DEBUG = True
application = webapp.WSGIApplication([
('/(.*)', Index),
], debug=_DEBUG)
def main():
run_wsgi_app(application)
因為我只會在 webapp.RequestHandler.request.headers['HOST'] 中抓到使用者要求網址,所以就會把 dispatch 邏輯寫在 view(MTV)/controller(MVC) 中,這樣的程式能完成工作但不算漂亮。
GAE spot 的程式完成後,記得還要把 down.hoamon.info, ssvn.hoamon.info CNAME 到 ghs.google.com *,這樣就成功合併了。
PS1 額外提醒! 這個動作是要到你的 domain name 服務商的設定介面處理。不過,你也得在 GAE 的 [admin 介面]
> [Versions]
> [Add Domain]
> [填入 hoamon.info(請不要照填 hoamon.info ,這是我的托管給 google apps 的網址,你的一定不是這個。且作這一步驟,你得先有 Google Apps 帳戶才行)]
> [填入密碼]
> [Add new url(像是 down.hoamon.info, ssvn.hoamon.info 等)]
才行。
2009年5月25日 星期一
把我的個人網站搬到 Google App Engine
自從上次運作 http://www.hoamon.info/ 的 Ubuntu 主機硬碟掛了後,就一直怗記著要把 Djange base 的個人網站改到 GAE 去。畢竟我還是比較相信 Google 的工程師在主機維護上的能力。
這個週未,終於花了點時間作移植。有點累。
與 Django 相比,到也不是比較難,而是 GAE 用了很多與原本 LAMP 不一樣的管理/程式概念。像是資料表方面,雖然 GAE 有提供 Data Viewer ,但這與傳統方式觀看資料表又不一樣,轉資料是我花最多時間的地方。
另外這一次比較重大的改變,則是我把原始資料格式從 html 改成 rST 了。如此一來,與我其他文件可以作更快速地轉換了,而這個 python-docutils 的函式庫與 GAE 相容問題也讓我花了不少時間。有機會,再向各位介紹了。我累了,要睡了。
這個週未,終於花了點時間作移植。有點累。
與 Django 相比,到也不是比較難,而是 GAE 用了很多與原本 LAMP 不一樣的管理/程式概念。像是資料表方面,雖然 GAE 有提供 Data Viewer ,但這與傳統方式觀看資料表又不一樣,轉資料是我花最多時間的地方。
另外這一次比較重大的改變,則是我把原始資料格式從 html 改成 rST 了。如此一來,與我其他文件可以作更快速地轉換了,而這個 python-docutils 的函式庫與 GAE 相容問題也讓我花了不少時間。有機會,再向各位介紹了。我累了,要睡了。
2008年6月15日 星期日
「實在」是太高興了:我拿到 Google App Engine 帳戶了
今天上 lanma 的「Python on Google App Engine」課程,才知道現在可以透過 SMS 手機認證的方式拿到帳戶。
方式很簡單,先上 http://appengine.google.com/ 去申請,它會要求你輸入手機(886+XXXXXXXXX)的號碼,只要你的手機沒用可攜的話(就是原本中華,但門號不變卻改成遠傳)那就可以收到一則驗證簡訊。再把簡訊內的驗證碼輸入即可。
方式很簡單,先上 http://appengine.google.com/ 去申請,它會要求你輸入手機(886+XXXXXXXXX)的號碼,只要你的手機沒用可攜的話(就是原本中華,但門號不變卻改成遠傳)那就可以收到一則驗證簡訊。再把簡訊內的驗證碼輸入即可。
訂閱:
文章 (Atom)