發表文章

Data store encoding issue

唔, 為了省空間, 想把一些放在 app engine data store 裡的文字, 用 zlib 壓縮起來放到 blob 裡. 在壓的過程中發現一些exception. 找了一些方法, 現在大致可以運作了... 原本 import zlib compressed = zlib.compress(log)  # 這行就會發生exception 現在改成 compressed = zlib.compress(log.encode('utf-8'))  # 這樣就可以了 但是在unzip的時候, 也要decode回來. zlib.decompress(compress).decode('utf-8') 這樣內容才會對喔...

Python 的簡短寫法

在 python 裡有時候我需要取得一個str的長度. len(a). 但是a有時候可能是None. 所以我就要 length = 0 if a:     length = len(a) 這樣子要三行吶. 後來得知可以這樣寫 length = len(a) if a else 0 cool!

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有多慢. (或多快?)

在Mac裡也可以用git的autocomplete

在用ubuntu的時候, 下git command都可以按tab來自動補後面的參數. 甚至連branch或tag name都會自動幫忙找出來. 十分方便. 但是在MacOS下就沒那麼方便了, 雖然它的console環境一切都好, 但是就這個讓我覺得不是太方便. 忍耐了好一陣子, 終於決定一定要找出來為什麼. Link 比想像中簡單, download一個script, 固定在.bash_profile裡去source它. 就OK了!

解了一個怪BUG

圖片
昨天解了一個很奇怪的BUG, 這個BUG若沒有各方的經驗, 在昨天那個moment, 水到渠成, 我想應該是誰也解不了.

用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...