發表文章

目前顯示的是 九月, 2010的文章

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.control import start_map, 上面幾個變數, 就是在mapreduce.yaml裡的設定, 改成用程式來傳.

最 加一個cron.yaml, 內容是...
cron:
- description: daily summary job
  url: /tasks/summary
  schedule: every day 06:00
  timezone: Asia/Taipei

這樣每天早上…

CSS之Selector

以為把W3C School CSS看完, 而且考試考了95分, 就可以直接上寫幹活了. 結果才寫幾行就卡住又要查資料了. 問題在我的HTML長的像


<ul>
 <li></li>
 <li></li>
</ul>


我不想把所有li的屬性都改掉, 但我又不知道要怎麼用CSS selector去選id是userinfo裡的ul tag裡的li tag. 只好查資料囉. 最好的來源自然是w3.org囉.
Grouping
h1 {xxxxx}
h2 {xxxxx}
h3 {xxxxx}
跟h1, h2, h3 {xxxxx}是一樣的. 逗號隔開代表同時指定這幾種tag的style. Universal selector
*, 代表任何一種在document tree裡的element. Type selectors
這種最基本了, 任何一個HTML定義的基本tag.
h1 {xxxx} Descendant selectors
跟Grouping語法很像, 只是不用逗號, 改用空格.
h1 {color: red}
em {color: red}
h1 em {color: blue}





This is h1 here is em this is h1 again
會顯示成This is h1here is emthis is h1 againDescendant selectors
div * p代表div裡, 不管多深的p tag. Child selectors
body > p {line-height: 1.3}
代表body裡的第一層p child. 跟Descendant selectors很像, 差別是用>只會選到它的第一層直接child.Adjacent sibling selectors
這個一定很少用, 所以大多文章都沒有介紹到.
h1 + h2 {margin-top: -5mm}
代表選h1之後的第一個h2 tag.
h1.opener + h2 {margin-top: -5mm}
代表class是opener的h1 tag下的第一個h2 tag.Attribute selectors
[att], 所有有這個att的tag
[att = val], 所有att值是…

Meta-xx, 大都會失敗...

遇到一個問題, 自己沒有能力解決, 或是不想投資時間/人力來解決, 就得求助於外力. 而外力有很多來源, 自己又沒有能力做判斷哪一種最好的時候. 最簡單的做法就是統統都接受, 統統都採納. 這, 通常會失敗.

python怎麼sort dictionary?

為了做一個統計的圖表, 我對python的list操作又熟悉了一點.

這是要用server蒐集到的一堆資料, 做幾張圓餅圖. 那些資料會被統計為"A發生n次, B發生m次, C發生i次, D發生j次", 以此類堆. 可能有數十到數百種, 每個的發生次數不一, 從個位數到幾千幾萬都有可能.