發表文章

目前顯示的是有「Google」標籤的文章

Python gflags

Google有一個叫 python-gflags 的project, 可以很方便地幫助讀取參數. 使用方法如下. 安裝方法 sudo easy_install --upgrade python-gflags 參數種類 string: 將參數解讀為字串 bool/boolean: 值可以是0/1, false/true, f/t float: 將參數解釋為floating point number. 有兩個optional參數, 可以指定上下限 integer: 將參數解釋為integer. 有兩個optional參數, 可以指定上下限 enum: 如果輸入參數在預先設好的這個list裡, 為合法輸入, 否則會發出exception. list: 以逗號隔開的一組輸入字串 spaceseplist: 以space隔開的一組輸入字串 multistring: 還看不太懂怎麼用. multi_int: 還看不太懂怎麼用. 使用方法 import gflags FLAGS = gflags.FLAGS # string, 參數意義為"參數名", 預設值, 說明 gflags.DEFINE_string('client_id', None, 'Client Id for authentication.') gflags.DEFINE_string('client_secret', None, 'Client secret for authentication.') gflags.DEFINE_integer('age', None, 'your age in years', lower_bound=0) gflags.DEFINE_boolean('debug', False, 'produces debugging output') gflags.DEFINE_enum('gender', 'male', ['male', 'female'], 'your gender') # 設為required ...

Google url shortener

Google提供了goo.gl這個服務, 可以將網址縮短 http://www.google.com/ -> http://goo.gl/fbsS 程式的用法是 縮網址 $ curl https://www.googleapis.com/urlshortener/v1/url -H 'Content-Type: application/json' -d '{"longUrl": " http://www.google.com/ "}' {  "kind": "urlshortener#url",  "id": " http://goo.gl/fbsS ",  "longUrl": "http://www.google.com/" } 恢復短網址 $ curl 'https://www.googleapis.com/urlshortener/v1/url?shortUrl= http://goo.gl/fbsS ' {  "kind": "urlshortener#url",  "id": "http://goo.gl/fbsS",  "longUrl": " http://www.google.com/ ",  "status": "OK" } 看統計資料 $ curl 'https://www.googleapis.com/urlshortener/v1/url?shortUrl=http://goo.gl/fbsS&projection=FULL' {  "kind": "urlshortener#url",  "id": "http://goo.gl/fbsS",  "longUrl": ...

Entity group

慢慢對 App engine 的 data model 有感覺了, 之前還習慣用SQL的時候, 總覺得要抓什麼都得用query, 所以在 App engine 裡也不自覺地動不動就用下面這三種方法來抓data, 即使只要抓一筆資料回來.

app engine datastore benchmark

用 app engine 最難以適應的應該就是 data store 了, 它是基於big table做出來的一種分散式的資料庫. 因為是分散式, 號稱非常scalable. 不過也因為是分散式, 很多在relational database很直覺的功能都不能用. app engine 還有每個request只能執行30秒的限制, 所以一些database更新的行為要分段做, 更增加寫程式的困難度. 寫的時候除了更小心一點, 我還想知道app engine到底寫data store有多慢. (或多快?)

用cron來觸發mapreduce job

GAE + mapreduce雖然好用, 但是老要用它那個簡單的介面來觸發一個job. 不能自動化的每天自動起來做些統計的事, 感覺挺蠢的. 一直在找要怎麼加, 才能在cron.yaml裡觸發. 終於被我試出來了. 首先, 先指定一個url給特定的handler. 最簡單就是在app.yaml把所有link都導到main.py. app.yaml - url: .*   script: main.py 然後在main.py裡加一段 def main():     application = webapp.WSGIApplication(...         ('/tasks/summary', SummaryHandler)],         debug=True)     util.run_wsgi_app(application) 重點就是這個SummaryHandler. class SummaryHandler(webapp.RequestHandler):     def get(self):         name = 'count'         handler_spec = 'main.process'         reader_spec = 'mapreduce.input_readers.DatastoreInputReader'         reader_parameters = {'entity_kind': 'main.Client'}         start_map(name, handler_spec, reader_spec, reader_parameters) 當然啦, 前面要from mapreduce.con...

一定要自己踢過一次鐵板才能學會 (二)

圖片
經過一夜的蒐集資料, 看了 Google I/O 的影片, 覺得用 MapReduce 就是正解啦. 用法很簡單 Step 1 Download最新的 MapReduce , 在local自己的appengine程式的地方執行. svn checkout http : //appengine-mapreduce.googlecode.com/svn/trunk/python/src/mapreduce Step 2 修改app.yaml, 固定都是加上下列這段code. - url: /mapreduce(/.*)? script: mapreduce/main.py login: admin Step 3 新增一個mapreduce.yaml檔 mapreduce: - name: Count the number of entities mapper: input_reader: mapreduce.input_readers.DatastoreInputReader handler: jobs.process params: - name: entity_kind default: main.Report 第一個name, 就是之後會顯示在mapreduce的網頁介面上的job name. input_reader, 目前有四種reader可以選, 詳情可見 這裡 . 主要是從DataStore裡抓, 或是從BlobStore裡抓, 或是從zip檔裡抓資料. handler, 指定之後會被MapReduce call的function. 這裡有點tricky, 文件寫得不是很清楚, 查了MapReduce的source才知道要填什麼. 簡單的說它可以吃三四種格式, 會試著用不同的方法去找到對應的python檔, class定義跟function定義. 最簡單的方法就是"file.function". 像這裡就是有一個叫jobs.py的檔, 裡面有一個process(). 之後MapReduce就會一直重覆地呼叫這個function. param, 這裡可以指定一些參數, 最重要的是entity_kind這個欄位, 這裡指定了預設值是main.py裡定義的R...

一定要自己踢過一次鐵板才能學會 (一)

在公司的一個appengine程式, 終於蒐集了一小筆資料(不到一千筆), 現在想對這些資料做些統計, 再用Google Chart API顯示出來. 可以預期等到這個程式正式上線, 資料是幾十幾百萬來計算的時候, 這個統計方法一定會有問題, 不過我還沒什麼想法, 現在一開始是這麼做的.

買GMail空間了...

圖片
GMail終於要爆了, 剩下不到50MB囉. 於是乎決定花個一年五塊美金加大空間. 買了之後變這樣. 剩20G了 要注意喔, 買這個需要一個工作天的時間才生效, 不能等到信箱真的爆了才申請, 否則就會有一段時間收不到信了...

App Engine心得

現在試著用 App Engine + Closure Library 寫一個小程式 (暫時放棄 django 了, 花了一段時間比較到底用 helper 好還是用 patch 好. 兩邊都有擁護者. 等我熟一點後再來自已判斷吧) 所以又到記流水帳的時候了,把一些我在寫的過程中搞不清楚, 要查資料的點記錄下來, 希望之後可以查資料的頻率低一點.

Closure Template

Google還真的很多好玩的東西, 在 Closure Library 之後, 又研究了一下 Closure Template . 用法跟之前玩PHP的差不多, 最大的差別是, 這個template寫好之後, 居然是要用一個Java程式去compile成Java script, 再直接給Java script程式呼叫. 應該是為了不要有太多執行時期的字串比對跟替換, 所以採用這種方法. 用法很簡單呀, 先寫一個副檔名為.soy的文字檔, 它將是template的source. 在它的第一行, 必需寫成 {namespace xxx.yyy} 其中xxx.yyy就是以下整個template的namespace. 搭配上之後定義的template, 在Java script裡就可以直接用xxx.yyy.zzz()這種方式來呼叫. /** * Says hello to the world. */ {template .helloWorld} Hello world! {/template} 這是最簡單的一個template了, 它定義了.helloWorld這個template. 在Java script裡就用xxx.yyy.helloWorld();來呼叫, 就會傳回Hello world!這串字. document.write(xxx.yyy.helloWorld());

Closure Library tutorial心得

教學網頁: http://code.google.com/intl/en/closure/library/docs/tutorial.html 心得: document.getElementById('div id'); function定義後面要加; goog.dom.createDom(tag, attr, childptr); Java Script prototype!! 難懂的一個概念. 現在大概的理解是用Function new出來的object, 如果要他們有一個跨object的method, 要加prototype字樣來指定. (這句是什麼鬼啊? 自己都看不懂.) goog.dom.appendChild(parent, child); goog.ui.Zippy(title, content);

Closure Tools的用法

Closure Tools包含了三個部份 A JavaScript optimizer A comprehensive JavaScript library An easy templating system for both Java & JavaScript 它的官方網站在:  Closure Tools Google I/O 2010的介紹影片: Closure Library 使用方法 在你的project目錄下, 打" svn checkout  http ://closure-library.googlecode.com/svn/trunk/ closure-library-read-only " 會透過svn到Google code的server上抓回它最新的source. 放在closure-library-read-only目錄下. 寫一個簡單的java script檔, 例如hello.js goog.require('goog.dom'); function sayHi() { var newHeader = goog.dom.createDom('h1', {'style': 'background-color:#EEE'}, 'Hello world!'); goog.dom.appendChild(document.body, newHeader); } 再寫一個簡單的HTML檔, 例如hello.html <html> <head> <script src="closure-library/closure/goog/base.js"></script> <script src="hello.js"></script> </head> <body onload="sayHi()"> </body> </html> 結果再用browser去開hello.html就可以啦. 這是最簡單的方法, 但效率會比較差. 因為Bro...

App engine

一直對App engine有興趣, 也寫了一些小小不成樣的程式自己玩. 在Google I/O的時候Google說他們內部用的 CloudCourse open source了! 就想花點時間來看看別人怎麼用Appengine來寫程式. 在 CloudCourse 網站上把它的source code抓回來, 發現裡面用了 app-engine-patch 這個東西, 讓 django 可以用appengine的database. 再把這個 app-engine-patch 抓回來玩玩, CloudCourse 是用1.1版的, 再到它的網站上去看看它的文件. 才又發現它已經停止support了, 要大家改用 Django-nonrel 這個project. 另外, CloudCourse 還用到了 Closure Library . 唉, 真是學海無涯呀...

Browser extensions...

記錄一下我用哪些Browser extensions吧... 不然電腦那麼多, 哪些好用都記不得... Chrome ScribeFire InvisibleHand Google Tasks Awesome Screenshot AutoPager Chrome Firefox Firebug Closure Inspector Video DownloadHelper User Agent Switcher

GMail要爆了...

圖片
來了快兩年的部門, 這裡寄信如流水. cc來cc去. 不必要的夾檔跟收信人一堆. 差不多半年, 我的GMail就要爆了... 酷吧, 我想看到這個訊息的人應該不多吧? 我整理了幾次, 試著把有大夾檔的信砍一砍. 不過對於7.xG的信來說, 一次砍個幾十幾百MB好像沒什麼用, 所以我最後決定等到真的爆掉的那一天, 我就要花錢買容量了...

我第一個Android程式上架了...

上星期逛到一個網站, aNobii , 好像已經出現很久了, 我現在才發現. 它是個藏書網站, 我一發現就愛不釋手, 想把自己所有的書都放上去. 無奈它加書的方式, 是要把ISBN打進去. 一個ISBN有10或13碼兩種, 無論哪種, 我都打很慢. 看著書櫃上的書, 似乎要把它全部打上去要很久. 然後我就想到Android上不是有個Barcode Scanner的程式嗎? 它可以把各種條碼的值掃出來. 那我最近又在玩Android, 何不寫個程式, 用手機先把條碼一個一個掃出來, 存在database裡, 掃完後再一次用GMail寄出來. 然後再到PC上用browser copy & paste, 把書加進去呢? 於是乎就在前兩天, 我的第一個Android程式 aNobii Scanner 在Android Market上架了. 目前已經有兩百多個人在用它了, 評價3.3顆星... :p PS. 之所以要用GMail這種迂迴的方式, 實在是因為aNobii這個網站本身提供的API, 只能讓外面的程式來Query, 而不能由外面來塞書的ISBN號碼進來. 所以只要分成兩段, 前半段手機處理, 後半段還是要用手工去Copy & Paste. 不過還好的是aNobii有提供multiple add的功能, 所以copy & paste只要做一次就好. 還算不是太麻煩.

G1初體驗

就在十分鐘前, 我在Q公司總部玩到了G1, 也就是第一隻Android phone. 這支Phone比我想像的要大一點, 就外觀來說就像照片上看到的一樣, 沒什麼特別的. 除了在展開鍵盤時, 它不是平行地把LCD往右平移一個螢幕的寬度. 而是像汽車雨刷動的方式一樣, 有一個弧度滑開, 它的支點不是兩個軌道, 是上方有一個支點, 下面只有一個軸提供滑出螢幕的動力. 總而言之, 轉開的手感不錯, 但是不太能一隻手操作, 手機很容易掉. 組裝方面可能有問題, 我拿到這隻的時候, 上面的保護膜都還沒撕掉. 不過在鍵盤上就有一個像一個按鍵一樣大的不規則刮傷. 因為那個位置不尋常, 猜想是出廠的時候就已經有的. 在G1上試用內建的軟體, 試著用鍵盤輸入一些字, 發現一個很令我困擾的地方. 它的鍵盤上字的顏色跟按鍵的顏色非常像似, 加上字不會發光. 在光線不足的地方完全看不到該按哪個鍵. G1雖然有內鍵G sensor, 但是它似乎不是用G sensor來判斷是否畫面要顯示直的或橫的. 而是根據鍵盤有沒有拉開. 這就有一個問題, 在鍵盤收起來, 畫面是直的情況下, 我不知道要怎麼打字! 我以為會有Virtual keyboard, 但找了幾分鐘還是弄不出來. G1有內建IM軟體, 支援AIM, GTalk, Live Messenger跟Yahoo protocol. 我試用過Live Messenger, 可以顯示中文, 不過有些字是簡體字. 可以收送IM message沒問題. G1沒有Multi-touch, 應該是用電阻式的touch screen, 操作起來要比iPhone"用力"一點. G1某些操作跟iPhone類似, 比如說contact list也是長長一條, 可以用手指在畫面任何地方點下去拖這個list. 也可以快速地往下拖, 然後甩出去, list就會像有慣性一樣往下捲. 不過畫面會卡卡的, 速度不均勻, 忽快忽慢, 不像iPhone那麼順暢. 它的Street view整合的真的不錯, 跟內建的eCompass/G sensor結合, 真的可以站在定點, 然後拿著G1上下左右移動, 畫面也就跟著變. 操作起來的感覺挺好玩的. Barcode reader也很有趣, 用相機照barcode, 會立刻辨識出...

Google Phone跟iPhone的比較!?

圖片
T-Mobile 率先發表要出Google Phone G1 了. 看了看 engadget 裡的介紹, 之前文爺也要我比較Android跟iPhone, 一年後再來看對不對, 那我就寫一下我的感覺, 再看看我猜的跟之後市場的評價一不一樣囉. 首先, 我本身並沒有iPhone, 但是我有一台iPod Touch 16G, firmware一路更新到現在最新的2.1版, 大致看到些這幾個月以來Apple在firmware上的進步. 另外前幾個月我也有試著研究iPod Touch上的開發環境, 看看要怎麼樣在上面寫程式, 所以對iPhone的硬體能力能做到什麼樣的效果也有一些了解, 下面我就拿出來比較一下. 1. 開發環境 Apple的開發環境從Mac Pro, iMac, MacBook到iPhone, iPod Touch(以下只提iPhone了, 在上面寫程式除了電話功能外, 兩者完全一樣)都是用同一套, Xcode . 而給iPhone的開發環境除了Xcode之外, 完整的模擬器也有, 而且安裝相當簡單, 同時也可以連接一台真的iPhone, 然後透過iPhone來操作模擬器裡的程式(這是因為iPhone有很多操作像是multi-touch跟accelerometers無法在電腦上用滑鼠來模擬). 在開發的過程中要抓screenshot也十分容易. 而Android的開發環境呢? 日前才出了SDK 1.0, 裡面有的開發環境還是跟傳統embedded system開發方式沒差多少. 最多就是給了一個 eclipse 的plugin, 協助build code跟debug, 其中的整合度跟Xcode仍有不小的差距. 而且刻UI還缺乏像Xcode裡的Interface builder這樣的工具, 可以直接用拖拉的方式來排系統預設的UI元件及拉event handler. 相關的開發文件呢? Android也是像大多數的open source project一樣, 有mailing list, forum, 線上文件等等. 但Apple不只有這些, 還有一系列的教學影片, 更有甚者, iPhone本身就等於一個教學平台, 可以一口氣把全部影片抓到iPhone裡, 然後在路上慢慢看. 難度從introduction到實際開發的例子都有. 我自己就是在紐約時每天坐地鐵的...