Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.

March 02 2010

tzangms
14:56

PiCloud

PiCloud 這個真的好屌, 感覺很好玩的樣子! 來試著把 stickeraction 的 queue 丟上去跑, 應該很適合 :D

February 28 2010

tzangms
16:22

stickeraction 全新改版

其實新版的 stickeraction 上線了一個禮拜左右了, 除了版面整個改掉之外, 也從 php + codeigniter 換成 python + django, 換成用最大的好處就是馬上就多了後台可以用 ( 笑 ) 看起來像是下面這樣。

另外這次也加了多國語系, 目前有繁體中文、簡體中文以及英文 ( 我想也不會有其他的語系了 XD ), 會依照瀏覽器的語系自動切換, 或者可以從網頁的 footer 來切換語系。

這是我的第二個 django project, 由於第一個是公司的網站, 所以不太能亂搞, 弄個一個自己的以後, 想要衝 trunk 就衝, 完全沒再怕的 XD 至少目前知道 django 1.2 rc 1 用 1.1.1 的設定直接衝上去是沒有問題的 XD

其實沒有管 stickeraction 已經好一陣子了, 都靠 monit 在幫我重開 lighttpd, 可是 php fastcgi 仍舊一直變殭屍一直到把記憶體吃光 Orz

機器仍舊是一台 Linode 540MB 的 VPS, deploy 方式是用 apache2 + mod_wsgi 然後一樣是用 virtualenv + pip 來跑。

剛上線的時候比較慘的是, 目前 stickeraction 的 request 差不多是 30 reqs/sec, 晚上會到 40+ reqs/sec, 所以 Apache 的 KeepAlive 沒有關掉, 一上線就被打掛了, 害我一度以為 apache + python 撐不住, 想說程式白寫的了, 趕快開了 server status 來看才知道是怎麼一回事。

目前看來跑起來都很順, 只是 cpu 較先前吃多了點, 不知道是哪個環節, 因為 lighttpd 換成了 apache, php 換成了 python, 而大部分的 mysql table 也都從 MyISAM 換成了 Innodb, 之後在來試一些東西。

February 17 2010

tzangms
17:43

stickeraction reborn soon

StickerAction reborn ... soon ...

除了把 stickeractionphp + codeigniter 整個換成 python + django 之外, UI 也整個翻新了, 希望能夠趕快弄好上線, 我就不想管了 (攤)

弄 html + css 真的是比寫 code 還要困難, 而且花時間 ~”~

February 07 2010

tzangms
16:53

在 app engine 上用 urlfetch 解短網址

昨天在寫一個程式, 功能是在把 twitter 上帶有 mp3 連結的訊息, 轉成 podcast 好讓我可以用 iTunes 訂閱, 自動下載 XD 推特那一段就直接用了 twitter search 產生的 json, 然後 mp3 的連結都是 tinyurl 產生的短網址, 直覺我就透過了 longurl 的 api 來回復短網址。

誰知道 longurl api 常 request 失敗, 也許可能是因為連續的 request 造成的。後來就突然想到了, 反正 header 都會帶有轉址的原網址吧, 所以就用 urlfetch 單純只抓 header, 然後 parse header 抓出來正常的網址就好啦~ 誰知道看了一下 urlfetch 的文件有居然 final_url 這個 method, 噗, 結果解短網址就變得超簡單。

result = urlfetch.fetch(tinyurl, method=urlfetch.HEAD)
if result.status_code == 200:
    url = result.final_url
tzangms
11:54

App Engine 405 Method Not Allowed

不太清楚為何webapp 為何沒有 implement HEAD method, 所以一開始在 MyAudioCast 的 DashBoard 就常看到一些錯誤, 多是一些 web crawler, 但卻都是 405 Method Not Allowed 的錯誤訊息, 用 curl -I 來測也是得到相同的回應, 本來不以為意, 後來為了要讓 MyAudioCast 上面的 Podcast 可以 submit 到 iTunes store, 卻也得到 405 的錯誤訊息, 無法 submit, 才覺得這事情有點大條 XD

google 之後找到一篇寫到說, 用 app engine 開發的網站無法 digg, 就是因為 405 這個問題, 因為要新增網址到 digg 的時候 digg 會用 HEAD method 來確認網頁是存在的, 所以說先前 Dashboard 上看到的 web crawler 也會先用 HEAD 來檢查網頁是否存在, 這麼一來只要是 HEAD method 都回 405 Method Not Allowed 的話, 那機器人不就都不來了嗎?

不過這問題其實很好解決, 幸好這次在開發的時候有先寫一個 RequestHandler 來繼承 webapp.RequestHandler 所以直接在 RequestHandler 增加一個 head method 就可以解決這個了。

def head(self, *args):
    pass

最簡單的就是這樣 XD 不過不知道是否改為執行 get method 然後把 content 去掉只留 header 這樣會不會比較好 :p

January 20 2010

tzangms
03:02

Dynamic Translation Apps for Django

其實大部分跟介面相關的文字都直接寫在 config 裡面, 然後用 gettext 處理多國語系的部份, 不過免不了還是有些東西需要放在資料庫也要多國語系, 所以先前用了 django transmeta, 只是沒很好用就是了。可能是因為 zh-TW, zh-CN 的關係吧 囧rz

有類似需求的話, 可以參考一下下面這篇
Dynamic Translation Apps for Django

January 10 2010

tzangms
04:27

Beginning CouchDB

上上週週末讀完了這本書, 真的是很 Beginning level, 還滿好讀的, 所以一下子就讀完了, 大概 300 多頁。 可能是 CouchDB 設計的真的很方便, 內建了 Futon 這個 web 介面可以用來管理資料庫, 從視覺上的確比較容易了解整個資料的架構。

第四章, 示範了用 curl 來對 CouchDB 操作的 CRUD, 超上手! 感覺真的很方便, 所有的動作都透過 curl 就可以達成。

第五章介紹使用 Futon 這個介面, 整個感到 Amazing, 怎麼這麼方便呀! 其實書中圖滿多的, 所以頁數也佔掉很多, 但就還滿容易看的, 因為一下子就翻了一頁, 感覺很有成就感 XD

第七章是 CouchDB 的 Views, 第八章則是 Map/Reduce, 這兩章就是 CouchDB 的重點了, 好像 Map/Reduce 也沒那麼難懂 (狀態顯示為第一次讀 Map/Reduce ) XD 或者這真的是 beginnng level o_O

最後還有提到 CouchApp 以及 Couchdbkit ( python ) 跟 CouchRest ( ruby ), CouchApp 還滿值得看一下的耶, 而 couchdbkit 就提供了一個 ORM like 的 Document 定義方式, 也有提供 django 用的 module, 用法就跟 django 的 ORM 類似, 甚至還有提供類似 ModelForm 的 form 喔!

不過 couchdb 不像 mongodb 有 collection, database 下就直接是 document, 而書中也沒有提到一些使用上的 scenario, 目前還不知道可以用在哪比較好。

其實對 mongodb 比較有興趣 :p

January 06 2010

tzangms
16:49

libcloud – cloud service manage api

剛才在消化 RSS 的時候看到的, 沒想到有這個東西。 libcloud 對一些 cloud service 管理的 api 提供了一個統一的介面 ( python library ), 支援一些較知名的廠商像是 ec2, slicehost, linode, rackspace, gogrid 等。

可以做以下動作:

  • list
  • reboot
  • create
  • destroy
  • images
  • sizes

過一陣子應該有時間可以來玩一下, 試試看 linode, slicehost 或 ec2 之類的, 感覺滿好玩的 XD

tzangms
15:10

Django 1.2 alpha 1 release

其實滿令人興奮的, 看來三月就 django 1.2 就會 official release 了。

這個 release 最令人興奮的就是 multiple database 了, 不過其實比較令我高興的則是 if 這個 template tag, 原本的 if template 限制真的太多了, 超惱人的 XD anyway, 其他細節看看 release notes 吧~

December 23 2009

tzangms
15:55

django multidb support

昨天 django multidb 出現在 trunk 了, 一出來就很多人衝去看 changeset, 可是因為這個 changeset 太大, 然後 trac 吃太多 CPU, 整個 djangoproject.com 就爆了 XD 所以後來這個 changeset 的 request 就直接被導到這個說明頁

不過其實 django 在 githubbitbucket 上 mirror 的同一個 changeset 也都因為太大, 改而顯示: This changeset can not be displayed, as it is too large (bitbucket) 跟 Sorry, this commit is taking too long to generate. (github)

咦, 重點好像偏了, 總之先看看 multidb 的文件吧, 有需要在衝 trunk XD 真是令人興奮的消息 :)

December 05 2009

tzangms
08:29

Setting up a python CI server with Hudson

Setting up a python CI server with Hudson 這篇文章還滿值得一看的。 當中的 CI 指的是 Continuous Integration, 也可以看看這篇中文的介紹

上禮拜把 hudson 弄起來, 自動 poll mercurial repo 來跑 pylint, 感覺真不賴, 結果找出了超多的 unused import, unused variables, 其實還真的滿有助益的, 不過 … 為了讓跑出來的數字好看一些, 這一個禮拜一直在努力的修 code, 讓 violations 的數字減少, 超辛苦的, 說真的, 沒事不要 import * 或是用 locals() …

November 06 2009

tzangms
18:24

django admin actions

django admin actionsdjango 1.1 開始, django admin 開始多了一個 actions 的功能, 預設就提供了刪除的動作, 方便許多, 不過其實要新增自定的功能也很容易。

例如這張圖上面的”不再列表顯示”就是我另外加上的功能選單, 可以一次勾選多個要處理項目進行處理。 如果對 customize django admin 有經驗的話, 那麼自定功能對你來說就更簡單了, 基本上新增 action 的方法, 就是自定一個 ModelAdmin 的 method, 像是下面這樣, 就可以了 :D

class SongAdmin(admin.ModelAdmin):
    actions = ('not_list_in_public',)

    def not_list_in_public(self, request, queryset):
        quertset.update(list_public=False)
    not_list_in_public.short_description = '不再列表顯示'

這裡唯一得注意的一點就是, 這裡處理的對象是 queryset 喔~ 所以是複數滴, 記得考慮所有處理的東西都會是一個以上。 另外, 要存取 many to many 的東西, 像是 Site 的話, 直接像下面這樣處理就可以了。

for item in queryset:
    item.add(mysite)
Older posts are this way If this message doesn't go away, click anywhere on the page to continue loading posts.
Could not load more posts
Maybe Soup is currently being updated? I'll try again automatically in a few seconds...
Just a second, loading more posts...
You've reached the end.