On twitter

@Lydia618 相差不遠了 (茶)

follow me on twitter

Posts Tagged ‘python’

關於 Python sorting 0

又要來寫偏離題的文了, 上禮拜花了一點時間把 Learning Ruby 這本書 K 完, 想說 Rails3 快出來了, 到時候可以來玩一下, 不過主要的目的就是想說, 認識寫 python 的人實在是超少, 做 web 的又更少, 認識寫 Rails 的人倒還比較多, 所以想說公司有東西外包的話, 用 Rails 寫的話, 到還可以處理, 所以就想說研究一下。 總之不太想碰 PHP … XD

Anyway, 我真的是超弱的, python 都還不熟就想學 ruby, mysql 也不熟, 應該是先把自己手邊在用的東西先學好才是。

夠離題了吧!? (咦)

其實是今天被 sorting 這件事困擾了一下, 因為做 web 所以排序的工作都是交給 SQL 去做, 偏偏碰到了一個不適合放進 SQL 的東西, 然後又得排序, 幸好找到了下面這一篇 Sorting Mini-HOW TO, 不然真是完全沒經驗。

要排序的資料是一個放 dict 的 list, 而得用 dict 裡的一個時間欄位做排序, 資料像是這樣

unsorted_list = [
    {'name': foo, 'created': datetime.datetime(2011, 1, 1, ... )},
    {'name': foo, 'created': datetime.datetime(2010, 12, 1, ... )},
    ....
]

沒想到這樣就可以排出來了

sorted_list = sorted(unsorted_list, key=lambda item: item['created'])
sorted_list.reverse() # 如果要新的時間在前的話, reverse 一下

神阿! 在給我多一點時間吧!!

September 2nd, 2010 Programming Tags: ,

推友幫我畫的一張”畫像” 0

這張是推友 @kikathetomato 前幾天幫我畫的一張, 看到整個超感動的 (淚) 除了衣服跟吉他就跟第一張專輯的宣傳照一樣之外, 背後還有 python 的兩隻蛇, 你說這酷不酷!? 超酷阿!!!!

August 21st, 2010 Life Tags: ,

Stashboard 0

Stashboard, 類似 Google 的 Apps Status Dashboard 及 Amazon 的 AWS Service Health Dashboard 的 Status page。

UI 看起來很不賴, 用 Python 在 Google App Engine 上面跑。 所以只需要下載 source code 回來改一下 app-id 就可以 deploy 上 GAE, 只需要不到一分鐘就可以架起來了。 而且有 REST API 喔!

不過我本來以為有自動監測這種功能說 XD

July 24th, 2010 Programming, Web Tags: , ,

簡易的 app engine 全文檢索 0

之前在弄 app engine 的全文檢索, 在官方文件都沒找到, 不過小 x 大大指點小弟我說有 SearchableModel 可以用, 才去翻了一下 app engine sdk 的 svn 找到 search 的這個 module, 只是實際試用一下, 這個功能沒支援中文, 它似乎只會把空格切開, 所以對於中文來說, 基本上就是無法使用, 用下面這個訊息舉例:

前幾天在弄 app engine 的全文檢索

這句的全文檢索資料會存成下面這樣的一個 List

['前幾天在弄', 'app', 'engine', '的全文檢索']

除了 “app” 跟 “engine” 可以搜尋到之外, 就只能用 “前幾天在弄” 跟 “的全文檢索” 這幾個詞可以搜尋到這則訊息, 所以只好捨棄了 SearchableModel 自己來做, 不過因為不熟 app engine, 所以沒有跟 model 做一個很好的整合, 嗯, 是根本沒有 XD 總之就是記錄一下自己的作法, 跟碰到效能的問題。

由於 app engine 的 model 可以直接用 list 來 filter 出結果, 像是:

keywords = ['少女', '時代']
Message.all().filter('keywords IN', keywords)

所以在建立 Message model 時, 就定個叫 keywords 的 StringListProperty, 把我們切好的字都存進去, 之後便可以透過上面的方法來搜尋。

而切字的作法是基本上跟 SearchableModel 的做法一樣, 先用空白切, 這樣就可以切開有正常空格的英文字, 但是得仍常會看到英文跟中文黏在一起的狀況, 像是:

測試twitter備份功能

相上面這種狀況這也得另外處理, 然後把中文相鄰的兩個字, 一組一組切開, 像是:

['測試', 'twitter', '備份', '份功', '功能']

其實原本我是切一個字跟兩個字, 不過因為 StringListProperty 在存入大量的 List 的時候, 會吃掉許多效能, 在 app engine dashboard 會一直看到紅字, 透過 appstats 就一直看到是在寫入 keywords 得部分吃掉最多 cpu time, 所以後來就只切兩個字, 減少 List 的長度。

反正基本上不允許搜尋一個字的就是了, 不過都只切成兩個字的話, 使用者搜尋的時候就不能打三個字或四個字來進行搜尋, 這時候就得把搜尋的字串也切一下, 例如上面這一句的狀況, 使用者可能會輸入 “備份功能”, 這時候用同一個切字功能切成下面這樣就完全 match 了 XD

['備份', '份功', '功能']

總之就變成使用者一定得輸入兩個字以上才能進行搜尋。 anyway 這樣一來就可以做個簡易的全文檢索了 ~ 當然 keywords 得給個 index 囉。

May 24th, 2010 Programming Tags: ,

在 app engine 使用 pytz 0

今天才意識到 timezone 的處理是有那麼一點麻煩, 存放、顯示要怎麼做之類的, 之前都沒處理過這類的問題, 不過也只能先解決問題, 之後有空在來深入研究 timezone。

這兩三天在用 appenginetwitter/plurk 備份的東西, 而 twitter 跟 plurk api 吐的訊息時間分別是 UTC +0000 跟 GMT, 不過剛剛網路上查了一下, 基本上、簡單來說 UTC = GMT, hmm 細節之後再來研究。所以說 twitter 或 plurk 的推訊時間都是用 UTF +0000, 不過這兩個的處理方式比較起來, twitter 簡單多了。

twitter api 的每則推訊都會有 user 的資料, 而 user 的資料當中 utc_offset 直接帶秒數, 例如我在台灣就是 28800 秒, 也就是 8 個小時, 所以就可以用以下的程式碼來把推訊的時間修正為準確, 符合 user 當地的時間

from datetime import datetime, timedelta

fmt = '%a %b %d %H:%M:%S +0000 %Y'
created_at = datetime.strptime(message['created_at'], fmt)
utc_offset = int(message['user']['utc_offset'])
local_time = created_at + timedelta(seconds=utc_offset)

twitter 時間處理滿簡單的, 直接用回傳資料的 utc_offset 然後用 timedelta 處理即可, 即使 utc_offset 是負值也沒問題。 相對之下 Plurk 那邊可以讀到是 timezone, 如: “Asia/Taipei” 這組字串, 顯然麻煩了些。

網路上找了一下, 似乎用 pytz 就可以很方便處理。 以下為 透過 pytz 用來為 plurk 處理本地時間的方式。

from datetime import datetime
from pytz import timezone

fmt = '%a, %d %b %Y %H:%M:%S GMT'
created_at = datetime.strptime(message['posted'], fmt)
user_timezone = timezone("Asia/Taipei")
local_time = created_at + user_timezone.utcoffset(created_at)

使用 pytz 真的滿方便就可以處理掉 timezone 的 time offset 問題, 不過問題來了, pytz 的 zoneinfo 就有 600 個檔案了, 然而 app engine 好像上限是 1000 個檔案, 整個吃掉一半以上。 不過似乎有 zipimport 的方式可以把檔案先壓縮在丟上去, 所以 google 幾個方式之後, 最後找到這個方式最簡單, 不過文件沒寫太清楚, 所以在這邊記錄一下。

ok, 結果討人厭的事情又來了, pytz 現在放在 launchpad 阿 … 誰裝 bazar 阿 XD 不過幸好在 pypi 可以直接抓檔案。

首先就是抓 tz_helper 跟 pytz 回來, 然後把 pytz 解開後, 找到 zoneinfo 然後把它 zip 起來, 接著就可以把 zoneinfo 目錄刪了, 最後把這三個檔案放在 app 的根目錄就好了, 像是

/app.yaml
/index.yaml
/main.py
...
/tz_helper.py
/pytz
/zoneinfo.zip

之後使用的時候直接 import tz_helper 的 timezone 來用即可。

其實現在 SNS 的時間大多都直接採用 3 hours ago 之類的方式來顯示時間, 我想最主要的原因就是, 這樣可以很容易因應世界各地使用者不同時區的問題, 而不是直接顯示這個日期。 誰知道我今天兩個方式都要有, 分別像是下面兩張圖的方式呈現, 所以就得處理 time offset 的問題。 總不能我在 5 月 5 號早上七點的推訊仍舊被記到 5 月 4 號。 而存放成台灣時間, 結果用 UTC +0000 去做 minutes ago, 顯示出來都是 0 minutes ago。

日期

times ago

May 5th, 2010 Programming, Web Tags: , , ,
Partners of Oceanic / 人生海海

jiwosca