GAEO 預設有幾種繞徑方式,官方文件如是說:
/ 代表呼叫 {'controller':'welcome', 'action':'index'}
/foo/bar 代表呼叫 {'controller':'foo', 'action': 'bar'}
/foo 代表呼叫 {'controller':'foo', 'action':'index'}
如果你也是用 gaeogen.py 產生出基本架構的話,那就還有:
/foo/bar/blah 代表呼叫 {'controller':'foo', 'action': 'bar', 'id': 'blah'}
官方文件中的範例跟使用 gaeogen.py 產生出的架構相同,但沒有說要怎麼取得 Controller 、 Action 和 ID ,在下對於 Python 不熟,所以又是試了一段時間才成功。
Controller 應該不用再次介紹,用 gaeogen.py 產生出來便是。Action 是指 Controller 中的 function 名稱,舉例來說, index 就是一個 Action 。
class MyController(BaseController):
def index(self): # 我就是 Action 啦!
pass
接下來的問題是要怎麼取得 ID ,我 trace 原始碼 trace 了很久(因為我是新手嘛!),才知道原來用 self.params.get('id') 便能取得。此外也可以用 self.params['id'] ,但這個方法在沒有 ID 時會發生錯誤。以下給一份完整的範例,此範例的用途是將Yahoo!奇摩字典的 Auto-completion 轉換為 Firefox 可用的 OpenSearch Suggestions 格式。
import cgi
from gaeo.controller import BaseController
from google.appengine.api import urlfetch
class YdictController(BaseController):
def index(self):
pass
def lookup(self):
p = cgi.escape(self.params['id']) if 'id' in self.params else ''
try:
result = urlfetch.fetch('http://ws.dict.tpe.yahoo.com/suggest_data.php?of=js&p=' + p, method="GET")
if result.status_code == 200 and result.content.startswith('fxsearch([') and result.content.endswith('])'):
suggestions = result.content[9:-1]
self.render(text=suggestions)
except:
pass
成果:http://bcse.appspot.com/ydict/lookup/sugges
等我試出來後,突然想到了什麼,便去查 RoR 的文件…… 果不其然,這取用方法跟 RoR 好像啊~ 看來在 GAEO 缺乏文件的現在,或許也能先參考 RoR 的文件…… XD
雖然放假了,我還是滿常來 Lab 的,這兩天的主要內容是研究 Google App Engine ,進度從安裝、「Hello World!」、以 Google Account 作身分認證,一直到使用 Datastore API ,然後上 PTT 發現有人把功能很完整的 Ikariam 物資交易平台做好了,讓我又失去了我的題目1 XD
雖然如此,但作一下最近的筆記。
安裝 Python 、 Google App Engine 及 GAEO
- 下載 Google App Engine SDK 及 Python 2.5。
- 以上兩個都是照著指示按「下一步」就能裝好。
- 下載 GAEO,然後解壓縮到任何你喜歡的地方。
- 在我的電腦上按右鍵→內容→進階→環境變數。然後在 PATH 的最後加上
;C:\Python25;D:\Documents\htdocs\gaeo\bin ←此為範例,請根據你將 Python 、 GAEO 安裝在哪裡而修改。至於 Google App Engine SDK 則會自動幫你加上,不用我們動手。
建立一個新的專案
- 在你喜歡的資料夾中,以命令提示字元執行
gaeo.py project_name ,GAEO 就會幫你建立好 project_name 資料夾以及基本的程式與資料夾結構。
- 然後在
project_name 資料夾中,以命令提示字元執行 dev_appserver.py --port=8080 . 2,這樣就能將程式執行起來,你可以在 http://127.0.0.1:8080/ 看到結果,看見 “It works!!” 就表示成功了。這個畫面的程式位於 project_name/application/controller/welcome.py ,而 template 位於 project_name/application/templates/welcome 資料夾中。
建立新的 Controller
- 在
project_name 資料夾中,以命令提示字元執行 gaeogen.py controller Say 這樣會在 project_name/application/controller 中建立一個 say.py ,其中就是新的 Controller ,名為 SayController ;此外也會建立一個 project_name/application/templates/say 資料夾,內容是空的,留待未來使用。
上傳到 Google App Engine
- 這邊我實在得說 Google 包裝得很好,只要在
project_name 資料夾中,以命令提示字元執行 appcfg.py update .3 ,程式便會傳上去,並且會自動編版號。
其他
- 以 Google Account 作身分認證同樣很簡單,基本上照著 Google 的教學文件作就沒錯了,只不過在本機端測試時它不需要真的登入,只會出現一個看起來怪怪的登入畫面,這並不是你作錯了。
- 有時候程式發生問題時,會噴 Error 404 而不給錯誤訊息,我目前還不知道 Python 有什麼簡單的 debug 方式…
- 目前 GAEO 的
gaeogen.py 只能用來生成 Controller ,所以我不知道 Model 應該放在哪裡…
- 在編輯工具方面我試了 Eclipse 及 UliPad , Eclipse 看得出來是一個功能非常強大的 IDE ,
但我不知道怎麼將它和 GAEO 整合在一起4;而 UliPad 有些功能不符合我的習慣,它的 Auto-completion 則是基於「本檔案中曾使用過的函式」,對我來說沒什麼幫助,最後還是用回 EmEditor。
簡介
此 Plugin 讓你在 blog 上顯示你的 Jaiku 最新動態。
安裝
- 解壓縮檔案。
- 將 jaiku 資料夾放到 /user/plugins 資料夾中,然後到 Habari 管理介面中啟用它。
將下面這行貼到你的 Theme 中。
<?php if ( Plugins::is_loaded('Jaiku') ) $theme->jaiku(); ?>
設定 / 自訂
啟用後,請按下 Configure 來設定此 Plugin ,有這些項目需要輸入:
- Jaiku username – 你在 Jaiku 的使用者名稱/帳號。
- Presences to show – 設定要顯示幾個 presences 。
- Cache expiry in seconds – 設定暫存檔保存多久,單位是秒。
如果你要修改 HTML 呈現的結果,可以將 jaiku.php 複製到你的 Theme 資料夾中並修改這個檔案。
下載
更新紀錄
- 0.3.1 (2008-07-25) – 處理要求逾時及非預期的回應(通常發生於 Jaiku 伺服器錯誤時)。
- 0.3 (2008-06-10) – 可設定要顯示幾個 presences 。
- 0.2.1 (2008-06-09) – 檢驗使用者輸入的資料是否正確。
- 0.2 (2008-06-04) – 更新為新的 FormUI 的寫法。
- 0.1.1 (2008-06-04) – 移除一些不必要的程式碼。
- 0.1 (2008-05-29) – 初次釋出。
Introduction
This plugin show your latest presences on your blog.
Installation
- Extract the file.
- Put the folder ‘jaiku’ to /user/plugins and activate it.
Copy and paste the following line to your theme.
<?php if ( Plugins::is_loaded('Jaiku') ) $theme->jaiku(); ?>
Configuration & Customization
After activated it, click Configure button to setup the plugin.
- Jaiku username – Place your Jaiku username here.
- Presences to show – Number of presences to show.
- Cache expiry in seconds – Number of second after the call that the cache will expire.
You can copy ‘jaiku.php’ to your theme directory and modify the HTML output.
Download
Changelog
- 0.3.1 (2008-07-25) – Better handling request timeout or unexpected response.
- 0.3 (2008-06-10) – Now you can show multiple presences.
- 0.2.1 (2008-06-09) – Validate user inputs.
- 0.2 (2008-06-04) – Updated to work with the new FormUI.
- 0.1.1 (2008-06-04) – Remove some unnecessary functions.
- 0.1 (2008-05-29) – Initial release.
Image Expander 的靈感來自於 gslin 的 Wretch Album Expander 。
最近實在愈來愈懶,所以寫了這個 script 來讓我少點幾次滑鼠 :p 它的功能是將縮圖替換為原圖,判斷方法為:
- 超連結的目標位址為 .jpg、 .jpeg、.png 或 .gif 結尾。
- 超連結的內容只有一張圖片,沒有其他物件或文字。
- 經由
onload() 確認圖片存在。
用 HTML 來表示的話,就是像以下架構的縮圖,才會被替換為原圖。
<a href="原圖網址"><img src="縮圖網址" /></a>
這個 script 相當容易導致網頁版面被破壞,建議在有需要時才啟動它,平常關掉比較好~
Download
SVN Repository: DeMorgan
Preface
De Morgan 是本 blog 自二月起使用的新 theme ,並不是我厭倦了前一個 theme ,而是因為當時發生了一個讓我很沮喪的事件。
De Morgan 這個標題來自數學家 Augustus De Morgan ,但是老實說它跟棣莫根定理一點關係也沒有,設計靈感主要是來自 De Morgen 這份比利時報紙,我一開始把這份報紙的名稱記成 De Morgan ,所以將錯就錯,便把 theme 也命名為 De Morgan 了 XD
Introduction
De Morgan 的最大特色是首頁與內頁的頁首不同,而且單篇文章頁面的 <h1> 是該篇文章的標題,而不是網站名稱,這樣語意比較適切,也對 SEO 比較好。
嗯… 除此之外好像沒有其他重點 orz
Chyrp 是一個輕量的內容管理系統。身為一個內容管理系統, Chyrp 核心中並未包含「迴響」、「文章分類」這些屬於 Blog 該有的基本功能,但只要安裝上「迴響」及「標籤」的外掛(在 Chyrp 中稱之為「Modules 外掛模組」), Chyrp 又能搖身一變,成為一個標準的 Blog 系統。在「Extensions 附加元件」加持下, Chyrp 能夠用來建構各式各樣的內容導向網站。
在 WordPress 愈來愈肥胖的現在, Chyrp 將是追求精簡的使用者們的新選擇 :)
初次接觸 Chyrp 的使用者,應該會搞不懂什麼是 Feathers ,「羽毛?」。「Feathers 內容範本」是 Chyrp 中相當重要的一個要素, Feathers 代表的是「內容的類型」,例如文字、影片、檔案下載等,又或者是讀後心得、聊天紀錄、活動時程,都可以當作不同的內容類型,就像是提供了一個範本,使用者只需照著欄位輸入, Chyrp 便能依照所指定的類型,產生出合適的格式。
Chyrp 的 Modules, Feathers 和 Themes 分別都使用自己的語系檔,雖然在 WordPress 中也能見到這種情況,但 Chyrp 幾乎是讓它成為「基本功能」,甚至連預設樣板都有自己的語系檔。這種作法雖然也有它的好處,但如果像 WordPress 那樣提供一些預設字串,我想當未來樣板多到氾濫時將會有所幫助。
目前 Chyrp 的基本需求是 PHP 4 ,但根據討論區的投票,未來將會提高到 PHP 5 ,我本來還為了這個版本問題而稍微偏好 Habari 的… XD 不過就穩定性而言,目前轉移到 Chyrp 也還不是時候, Chyrp 只要在安裝時重新整理幾下,馬上就會蹦出一大堆錯誤訊息… 囧rz 相較之下, Habari 則穩定許多。