2011年1月29日

檢查行動動置上網頁的運行體驗

據說safari 5有設定方式可模擬iphone/ipod

http://stackoverflow.com/questions/3882233/iphone-browser-simulator-for-windows

不過會問這個問題通常是因為網頁中使用了javascript,那麼可用的模擬器有人討論過了

http://stackoverflow.com/questions/464089/simulators-emulators-for-mobile-browser-testing

如果使用比較簡單的javascript而不用extjs/jquery的話,在行動裝置上可正常運行的機率會比較高些,以下幾個網站的範例滿值得參考的

http://www.webanddesigners.com/33-jquery-tutorials-to-create-navigation-menu

http://www.noupe.com/jquery/50-amazing-jquery-examples-part1.html

http://www.1stwebdesigner.com/css/38-jquery-and-css-drop-down-multi-level-menu-solutions/

不過到最後我還是沒有踹出來,所以…放棄了XD

2011年1月27日

使用 Google 應用服務引擎 ( GAE = Google App Engine ) 建立 Facebook 應用程式 (IX) 多國語言化 i18n

根據不少資料顯示,這不是一個簡單的工作。事實上是非常的麻煩,而且我並沒有成功,但是為了留下記錄,我還是寫下我所進行的步驟。一個可行的行動方案如下

http://blog.yjl.im/2009/02/using-django-i18n-in-google-app-engine.html

不過有一步不成功,是使用 make-messages.py 這步。不要緊,直接把 C:\Program Files\Google\google_appengine\lib\django\django 整個目錄複製到工作目錄下吧。這或許是個overkill,等有時間再回來看看是不是只需要其中某些檔案就好…當然之前按該連結所寫的settings.py就要放到所複製過來的django/conf目錄下

這還沒完,請到 http://sourceforge.net/projects/gettext/ 下載相關的檔 gettext-runtime-0.13.1.bin.woe32.zip , gettext-tools-0.13.1.bin.woe32.zip , libiconv-1.9.1.bin.woe32.zip ,解壓後把所有的bin目錄中的檔案放在工作目錄中

2011年1月22日

使用 Google 應用服務引擎 ( GAE = Google App Engine ) 建立 Facebook 應用程式 (VIII) 大量資料庫上傳

appcfg.py upload_data,相當於ms-sql的bulk insert,不過…相當麻煩

http://code.google.com/intl/zh-TW/appengine/docs/python/tools/uploadingdata.html

照著上面的文件說明,會踹一次就成功的,只能說是神人了…經過無數次試誤,歸納出以下步驟;以下所提到的"腳本目錄"就是app.yaml等原始碼所在的目錄

(本地端環境寫入)

1.如果先前沒有設定PYTHONPATH的話,要記得設定,不然它會找不到你的.py檔;PYTHON_LIB則是要處理windows和linux/unix系統間的不一致,尤其是路徑的表示法

set PYTHONPATH=...放model的目錄;為了方便起見,就用腳本目錄吧
set PYTHON_LIB="C:/Program Files/Google/google_appengine"

2."編輯您的 app.yaml,並在 handlers: 區段新增下列幾行程式碼:"。這句話對windows使用者而言是有點輕描淡寫了,如果上一步沒作好,會debug到天荒地老;script所在位置放絕對路徑是不work的!!在handlers:的下一行新增以下幾行

- url: /remote_api
  script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
  login: admin

3.為了方便起見,先進入腳本目錄,然後在本地端起動伺服器。沒起動的話,會在執行appcfg.py upload_data時得到無法建立連線之類的錯誤訊息。若要清空資料,加參數  --clear_datastore

python "C:\Program Files\Google\google_appengine\dev_appserver.py" --port=8080 .

4."建立載入器類別",這步大概照做

5."準備您的資料",這步大概照做,所撰寫的程式要放在前述的PYTHONPATH底下;為了方便起見,先進入腳本目錄,然後將新腳本放在此目錄下

6."將資料載入開發伺服器",執行下列指令,登入就打admin,密碼沒有,如app.yaml所指定;若出現10061錯誤,加上--num_threads=4;為了方便偵錯,把錯誤訊息重導到到error.txt的話,可以在下列指令最後再加上 >errors.txt 2>&1

python "C:\Program Files\Google\google_appengine\appcfg.py" upload_data --config_file=XXX.py --filename=YYY.csv --kind=ZZZ --url=http://localhost:8080/remote_api --num_threads=4 .

p.s.像ms sql analyzer那樣的工具 http://localhost:8080/_ah/admin/datastore

p.s2.跳出一堆error,似乎和utf-8有關...字串型態需設為 lambda x: unicode(x, 'utf-8') ,參考 http://code.google.com/p/googleappengine/issues/detail?id=157#c18 ;文字中的雙引號"也要改為兩個""作為escape

2011年1月18日

使用 Google 應用服務引擎 ( GAE = Google App Engine ) 建立 Facebook 應用程式 (VII) 總而言之…

這篇文章所用的流程是我所見過最快的

http://pythoughts.com/facebook-apps-with-google-app-engine

不過要每個環節都不出錯,才能一次ok,我認為還是需要相當的經驗

關於各版本的演進、優缺點等,可以參考以下這個網站

http://blog.wahahajk.com/search/label/Google%20App%20Engine?max-results=5

相當於ms sql的bulk insert,在一開始要倒資料時相當有用的

http://code.google.com/intl/zh-TW/appengine/docs/python/tools/uploadingdata.html

處理中文時有些地方要注意,同時可以將命令寫成批次檔

http://roy2006tw.blogspot.com/2010/10/google-app.html

有用過RoR的話,GAEO是一個類似的工具,利用scaffold來產生骨架

http://blog.kengao.tw/2008/12/project-google-app-engine_22.html

若您要開發伺服器在啟動之前刪除其資料存放區,請於啟動伺服器時,使用 --clear_datastore 選項:

dev_appserver.py --clear_datastore helloworld/

可參考原文 http://code.google.com/intl/zh-TW/appengine/docs/python/gettingstarted/usingdatastore.html

否則的話會花很久時間,刪一筆要一秒(!!),其中根據我在本機上的測試,all()不需要花時間,fetch()花了0.8秒,delete()花了0.2秒

http://efreedom.com/Question/1-3129391/Google-App-Engine-Devserver-Hideously-Slow

選擇性刪除時,請參考 http://stackoverflow.com/questions/4448123/do-a-mass-db-delete-on-app-engine-without-eating-cpu

真的要大量刪除時,要用cursor

http://stackoverflow.com/questions/3034327/google-app-engine-delete-until-count-0

q = Location.all(keys_only=True)
results = q.fetch(500)
while results:
  db.delete(results)
  q = Location.all(keys_only=True).with_cursor(q.cursor())
  results = q.fetch(500)

2011年1月16日

使用 Google 應用服務引擎 ( GAE = Google App Engine ) 建立 Facebook 應用程式 (VI) 我的第一個fb on gae程式--雲端執行

要上傳程式的話,首先要在 https://appengine.google.com/ 先申請一個app,並且把所申請的 id 填到app.yaml的 application 欄位。觀察了launcher的log,應該是在本地的應用程式目錄下達這樣的指令

python "C:\Program Files\Google\google_appengine\appcfg.py" --no_cookies --email=你的帳號@gmail.com --passin update .

這個--passin 參數的目的是可以由檔案抓密碼,這樣就不用再打一次…懶啊~~

http://www.mail-archive.com/google-appengine@googlegroups.com/msg29550.html

由訊息中會發現會發現一個警告(不是錯誤),還需要安裝一個ssl模組 (我咧…淦…什麼…現在才講),但不裝是不影響上傳的,而且在windows平台上裝這個很麻煩(http://pypi.python.org/pypi/ssl) ,中間會問你的密碼,輸入後過一會就ok了

上傳完後,到 https://appengine.google.com/ 看看,版本號遞增了,再去fb改對應之前指到本機的設定,到 https://appengine.google.com/settings 中所指定的位置,然後就可以看到跟剛才在本地端執行時一樣的結果

GAE上傳的詳情也可參考
http://code.google.com/intl/zh-TW/appengine/docs/python/gettingstarted/uploading.html

更fancy的facebook應用程式範例可以參考官方網站

http://developers.facebook.com/docs/samples/canvas

開發時的一些問題,如為何使用chrome在本地端運行時經常沒有回應,如何使用dict型態的資料欄位,在中文網頁中似乎只有這個地方找得到:

http://www.keakon.net/category/Google%20App%20Engine

使用 Google 應用服務引擎 ( GAE = Google App Engine ) 建立 Facebook 應用程式 (V) 我的第一個fb on gae程式--本地端執行

一般來說一開始都會先在本機上測試一下

請再次複習fb上有關canvas url的設定,將其中的CANVAS URL(以及SITE URL)改為GAE測試時的本機位置,例如  http://localhost:8081/

請服用:

1. http://clay0529.blogspot.com/2009/09/facebook-apps-developer-tutorial-1.html & http://clay0529.blogspot.com/2009/09/facebook-apps-developer-tutorial-2.html & optional http://clay0529.blogspot.com/2009/10/facebook-apps-developer-tutorial-gae.html



2. http://ithelp.ithome.com.tw/question/10052284



如果您用的是之前的HELLO WORLD,那麼還沒引入FACEBOOK代碼,一切都還單純。

當然,如果用的是GAE+FB,那就要把上述教學網頁中對應的PHP程式置換為PYTHON。

例如,如果你抓了 facebook-python-sdk 回來,可以試著執行它所附帶的 examples\appengine 範例,其中的 FACEBOOK_APP_ID = "..." & FACEBOOK_APP_SECRET = "..."請代換為申請FB應用程式所得到的值。把src目錄下的facebook.py複製到範例目錄中,執行

c:\facebook-python-sdk-322930c\examples\appengine>python "C:\Program Files\Google\google_appengine\dev_appserver.py" --port=8081 .

當然你可能會發現一些錯誤訊息,如 PIL沒有安裝之類的,那麼請參考

http://code.google.com/intl/zh-TW/appengine/docs/python/images/installingPIL.html

此外,在瀏覽器打 http://localhost:8081/ 是可以運行沒錯,但搬到FB上卻不見了。這是因為FB使用的是post,而範例只有實作了get;解決的辦法就是…對很聰明,就把get的程式碼複製變成post就好了

基本上就是這樣

使用 Google 應用服務引擎 ( GAE = Google App Engine ) 建立 Facebook 應用程式 (IV) facebook/python-sdk 安裝

之前說到去 https://github.com/facebook/python-sdk/ 抓了facebook-python-sdk以後,這個module還是有點不給力啊…安裝的動作要先作一下,還好就像perl一樣,有作者寫好的腳本,請運行

python.exe setup.py install

當然如果你像我一樣沒有設預設路徑給python,那就還要打出它的位置,比如

c:\Python25\python.exe setup.py install

更詳盡的解說可以參考 http://docs.python.org/install/index.html

不過根據下面這串討論,還是把要import的程式放進專案中最保險

http://groups.google.com/group/google-appengine-python/browse_thread/thread/a3f1644015b09a6b

放進來以後就像這樣


Example structure: 
my-app/
   app.yaml
   ...
   libs/
      facebook/
          facebook.py
      other-lib/
          .... 

2011年1月15日

使用 Google 應用服務引擎 ( GAE = Google App Engine ) 建立 Facebook 應用程式 (III) Facebook Python SDK

如何從臉書知道使用者的資訊,甚至記得使用者的資訊呢?這裏面一定要有一些資訊的交流吧…



那要和GAE整合的話呢?


根據小道消息指出,fb是用php寫的,所以參考一下php的寫法


剩下的,大概就是常態的web application開發工作了。祝好運!!

2011年1月9日

使用 Google 應用服務引擎 ( GAE = Google App Engine ) 建立 Facebook 應用程式 (II) GAE初探

GAE安裝完成後,來個hello world吧

http://code.google.com/intl/zh-TW/appengine/docs/python/gettingstarted/helloworld.html

最後一步要"測試應用程式",執行dev_appserver.py時,很奇怪的沒有成功

但是使用"Google App Engine Launcher"的話,感覺更順手耶,參考以下連結

http://give.pixnet.net/blog/post/30024215

http://www.scribd.com/doc/35546742/%E9%9B%B2%E7%AB%AF%E9%81%8B%E7%AE%97-Google-App-Engine-GAE-%E7%A8%8B%E5%BC%8F%E9%96%8B%E7%99%BC%E5%85%A5%E9%96%80

當然執行後可以看看log,然後會發現,官網上執行的指令是有問題的;log內容是:

Running command: "['C:\\Python25\\pythonw.exe', 'C:\\Program Files\\Google\\google_appengine\\dev_appserver.py', '--admin_console_server=', '--port=8080', 'C:\\helloworld']"

所以執行的指令應該要像

C:\helloworld>python "C:\Program Files\Google\google_appengine\dev_appserver.py" --port=8080 .

或是

python "C:\Program Files\Google\google_appengine\dev_appserver.py" --port=8080 C:\helloworld

下回試試把facebook的應用程式指來本機或GAE看看

to be continued...