URL Routing in GAEO


0 Comments

GAEO 預設有幾種繞徑方式,官方文件如是說:

  1. / 代表呼叫 {'controller':'welcome', 'action':'index'}
  2. /foo/bar 代表呼叫 {'controller':'foo', 'action': 'bar'}
  3. /foo 代表呼叫 {'controller':'foo', 'action':'index'}

如果你也是用 gaeogen.py 產生出基本架構的話,那就還有:

  1. /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


Writing Model on GAEO


0 Comments

大概只有像我這樣的 Python 超新手才會有這個問題 XD

在 GAEO 中建立 Model 的流程如下:

  1. application 資料夾中新增一個 model 資料夾
  2. model 資料夾中新增兩個檔案 __init__.pymy_model.py
  3. __init__.py 保持空白就可以,在 my_model.py 中則可以寫你要的 Model,舉例如下:

    from google.appengine.ext import db
    from gaeo.model import BaseModel
    # 本範例中沒用到 BaseModel 新增的功能,所以也可刪去這行
    
    class User(BaseModel): # 如果不用 BaseModel,就必須改為繼承 db.Model
      user = db.UserProperty(required=True)
      nickname = db.StringProperty(required=True)
      email = db.EmailProperty(required=True)
    
  4. 接下來重點來了!在 my_controller.py 中要怎麼引用這個 Model 呢?

    from model import my_model
    

順便筆記一下遍歷的方法

users = my_model.User.all()
# 我覺得既然用了 DataStore (BigTable),就不要再用 GQL 作查詢
# 實際上這種寫法也比較容易閱讀
for user in users:
  print user.nickname

My First Step toward Google App Engine / Python


0 Comments

雖然放假了,我還是滿常來 Lab 的,這兩天的主要內容是研究 Google App Engine ,進度從安裝、「Hello World!」、以 Google Account 作身分認證,一直到使用 Datastore API ,然後上 PTT 發現有人把功能很完整的 Ikariam 物資交易平台做好了,讓我又失去了我的題目1 XD

雖然如此,但作一下最近的筆記。

安裝 Python 、 Google App Engine 及 GAEO

  1. 下載 Google App Engine SDKPython 2.5
  2. 以上兩個都是照著指示按「下一步」就能裝好。
  3. 下載 GAEO,然後解壓縮到任何你喜歡的地方。
  4. 在我的電腦上按右鍵→內容→進階→環境變數。然後在 PATH 的最後加上 ;C:\Python25;D:\Documents\htdocs\gaeo\bin ←此為範例,請根據你將 Python 、 GAEO 安裝在哪裡而修改。至於 Google App Engine SDK 則會自動幫你加上,不用我們動手。

建立一個新的專案

  1. 在你喜歡的資料夾中,以命令提示字元執行 gaeo.py project_name ,GAEO 就會幫你建立好 project_name 資料夾以及基本的程式與資料夾結構。
  2. 然後在 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

  1. project_name 資料夾中,以命令提示字元執行 gaeogen.py controller Say 這樣會在 project_name/application/controller 中建立一個 say.py ,其中就是新的 Controller ,名為 SayController ;此外也會建立一個 project_name/application/templates/say 資料夾,內容是空的,留待未來使用。

上傳到 Google App Engine

  1. 這邊我實在得說 Google 包裝得很好,只要在 project_name 資料夾中,以命令提示字元執行 appcfg.py update .3 ,程式便會傳上去,並且會自動編版號。

其他

  1. 以 Google Account 作身分認證同樣很簡單,基本上照著 Google 的教學文件作就沒錯了,只不過在本機端測試時它不需要真的登入,只會出現一個看起來怪怪的登入畫面,這並不是你作錯了。
  2. 有時候程式發生問題時,會噴 Error 404 而不給錯誤訊息,我目前還不知道 Python 有什麼簡單的 debug 方式…
  3. 目前 GAEO 的 gaeogen.py 只能用來生成 Controller ,所以我不知道 Model 應該放在哪裡…
  4. 在編輯工具方面我試了 Eclipse 及 UliPad , Eclipse 看得出來是一個功能非常強大的 IDE ,但我不知道怎麼將它和 GAEO 整合在一起4;而 UliPad 有些功能不符合我的習慣,它的 Auto-completion 則是基於「本檔案中曾使用過的函式」,對我來說沒什麼幫助,最後還是用回 EmEditor。

  1. 我本來是想做一個類似拍賣的網站來練習,不過主要目的其實還是想玩 GAE 

  2. 我將這段儲存為 run.bat ,這樣執行比較方便。 

  3. 我將這段儲存為 update.bat ,這樣執行比較方便。 

  4. gaeo.py --eclipse project_name 就可以囉! 


Image Expander 0.3.2


0 Comments

請到原文安裝新版。

原來要用 JavaScript 檢驗圖片是否存在,根本不需用到 XHR ,用 image 物件本身的 onload/onerror 事件就可以了。所以我將 Image Expander 的 XHR 拿掉,程式碼變得簡單許多,還解決了 Cross-Domain 問題,讓我們一起來贊美舊時代吧! XD


Jaiku Plugin for Habari


0 Comments

簡介

此 Plugin 讓你在 blog 上顯示你的 Jaiku 最新動態。

安裝

  1. 解壓縮檔案。
  2. 將 jaiku 資料夾放到 /user/plugins 資料夾中,然後到 Habari 管理介面中啟用它。
  3. 將下面這行貼到你的 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 資料夾中並修改這個檔案。

下載

如果你的 Habari 版本為 r1946 以上,請使用 0.2 版,否則請使用 0.1.1 版。

Jaiku 0.1.1 Habari r1943 以下適用
Jaiku 0.3 Habari r1946 以上適用

更新紀錄

  • 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

  1. Extract the file.
  2. Put the folder ‘jaiku’ to /user/plugins and activate it.
  3. 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

Only use version 0.2 if you are using Habari r1946 or higher.

Jaiku 0.1.1 for Habari r1943 or lower
Jaiku 0.3 for Habari r1946 or higher

Changelog

  • 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


4 Comments

Image Expander 的靈感來自於  gslin 的 Wretch Album Expander

最近實在愈來愈懶,所以寫了這個 script 來讓我少點幾次滑鼠 :p 它的功能是將縮圖替換為原圖,判斷方法為:

  1. 超連結的目標位址為 .jpg、 .jpeg、.png 或 .gif 結尾。
  2. 超連結的內容只有一張圖片,沒有其他物件或文字。
  3. 經由 onload() 確認圖片存在。

用 HTML 來表示的話,就是像以下架構的縮圖,才會被替換為原圖。

<a href="原圖網址"><img src="縮圖網址" /></a>

這個 script 相當容易導致網頁版面被破壞,建議在有需要時才啟動它,平常關掉比較好~


微軟免費釋出 Meiryo 及微軟雅黑字型


2 Comments

這並不是一篇新聞,只是我剛才發現一個滿有趣的地方…… 在下載 Meiryo 的頁面,若將語言改為「日本語 (NEC)」,就可以跳過 WGA 驗證直接下載 :)

至於微軟雅黑則在此:Simplified Chinese ClearType fonts for Windows XP

Update: 韓文的 Malgun Gothic 也釋出了。

Update: 繁體中文的微軟正黑體也釋出了。

 1 2 3 … 62 Next →