2011/09/26

Postgresql建立索引

有沒有建索引的查詢速度真的差很多,預設是使用binary-tree來實作index,時間複雜度是O(logN)。從N變成logN,是有指數級的差距!

建index的方法可以參考


以下舉幾個例子,假如我們的table叫account,email這個欄位很常用來當查詢條件,那我們會為email建立index:
postgres=> CREATE INDEX account_email_idx ON account (email);
postgres=> \d account;
Indexes:
    "account_pkey" PRIMARY KEY, btree (id)   # Primary key預設就會建立index了
    "account_email_idx" btree (email)

Composite index?
Composite indexes are used when two or more columns are best searched as a unit or if many queries reference only the columns specified in the index.
All the columns in a composite index must be in the same table.
我自己把它解釋成當一個query同時帶多個條件時,composite index可以加快查詢的速度。
postgres=> CREATE INDEX account_composite_idx ON account (name, email);
postgres=> \d account;
Indexes:
    "account_pkey" PRIMARY KEY, btree (id)
    "account_composite_idx" btree (name, email)


除了建索引,定期清理(VACUUM) database 也可以加快存取速度
postgres=> VACUUM VERBOSE ANALYZE;

2011/09/22

Implement tornado session in memcached

示範將tornado的session實作在memcached裡面,我是參考這個blog:
玩蛇记-给tornado加上session支持 - 亚历山大同志 - 博客园

Requirement
  • Tornado 2.0
  • python-libmemcached 0.4
    • Pyrex 0.9.4+
    • libmemcached 0.52

邏輯


流程

2011/09/21

Postgresql 小記

常用指令
# Start
su postgres -c "/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data"

# Stop
su postgres -c "/usr/local/pgsql/bin/pg_ctl stop -D /usr/local/pgsql/data"

# restart
su postgres -c "/usr/local/pgsql/bin/pg_ctl restart -D /usr/local/pgsql/data"

# Init postgres
sudo mkdir /usr/local/pgsql/data
chown postgres:postgres /usr/local/pgsql/data
su postgres -c "/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data"

# Create user
/usr/local/pgsql/bin/createuser -U postgres -P userA

# Drop user
/usr/local/pgsql/bin/dropuser -U postgres userA

# Create db
/usr/local/pgsql/bin/createdb -O userA -U postgres testdb

# Drop db
/usr/local/pgsql/bin/dropdb -U postgres testdb

# Dump db
/usr/local/pgsql/bin/pg_dump -U postgres testdb > dump.sql

# Restore db
/usr/local/pgsql/bin/psql -U postgres -d testdb < dump.sql

# Grant all privileges
/usr/local/pgsql/bin/psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE testdb TO userA;"

# Enter postgresql command line
/usr/local/pgsql/bin/psql -U postgres -d poesgres -h localhost -p 5432


基本設定
  • /usr/local/pgsql/data/postgres.conf
listen_addresses = '192.168.0.3'   # 設定listen IP

  • /usr/local/pgsql/data/pg_hba.conf
host    all             all             127.0.0.1/32              trust
host    all             all             192.168.0.0/16            trust
host    all             all             10.10.1.5/32              password


Log分析
推薦使用pgFouine - a PostgreSQL log analyzer,它可以分析出某段時間內,做了幾次query,處理時間最久的,次數最多的...可以看一下Sample reports長怎樣。


效能測試:
pgbench
使用 pgbench 进行数据库压力测试
pgbench -U postgres -i -s 50 postgres 
pgbench -U postgres -c 100 -t 100 -S postgres


Performance Tuning PostgreSQL

Python Decorator (裝飾)

參考資料

Example 1
在原始function的return值做裝飾
def D1(fn):
    def newFn():
        return "" + fn() + ""
    return newFn

@D1
def f1():
    return "a sentence"

print f1()


2011/09/20

Video Codec, Container

常聽到一些影音格式與專有名詞:avi、rmvb、mpg4、h.264...
有些是指播放格式,有些是編碼格式,什麼是codec,什麼是container,下列兩篇介紹得很清楚!

大綱:
Codec(編碼):是原始影音的一種資料表示法,它決定影音檔案之畫質、音質好壞、壓縮率。
Container(容器):則是將上述編碼資料打包,方便傳遞、播放。

並非所有的container都可以搭配所有的codec,必須依照特性來存放,請參考Comparison of container formats
Codec也可以單獨使用,不一定要放在container內。

2011/09/19

製作 iPhone/iPad 電子書

想要製作可以在iPhone/iPad上瀏覽的電子書嗎? Go ahead!

首先要釐清,是想做『iBook電子書』還是『電子書App』
  • iBook電子書是可以用iBook這個app來瀏覽的文件檔,透過iTunes就可以自己同步到iPhone/iPad裡面。
  • 而製作一個獨立的電子書App手續就麻煩多了。首先你必須跟Apple申請一個開發者帳號 (年費NT3000),再來製作自己的App(可能需要會寫程式),最後把app submit到apple store,待工作人員審核過了,就可以在apple store供大家下載。

如果你只是想打發時間,想把網路小說放到iPhone那就選擇第一項。如果是想營運收費,那兩樣都可以上架收費。


iBook電子書製作

App電子書製作

初學 Tornado web framework

最近需要架設一個線上平台,對於架設平台我實在沒什麼經驗,從前有開發過網站,會用asp.net、php自己刻東西,但時代不一樣了,為了講求快速,依附在framework上是有必要的。Tornado — 對我來說是個全新的開始,我不會python,對物件導向的程式語言也不熟,平常都在寫C語言居多,更別提用過web framework了...但我堅信我的底子跟熱情可以支撐我去學習這一切!

話說剛開始學習真的超不順,中文英文的教學都很少,官方的文件又寫的很簡略...但看著看著,突然有一天感覺就來了,就像任督二脈被打通般的,我看得懂了,我會使用了,程式寫這麼久了,我覺得對我幫助最大就是學會這種感覺。如果看懂Overview又學會使用Source code裡面的demo程式,對Tornado的掌握度就很高了!

API
Tornado真是個強大的東西,它陳列的API不多,但每一個都是在建立平台時很常見的需求:
  • OAuth第三方認證 - 使用facebook、google、twitter帳號來登入自己的網站,API都很精簡了
  • Python decorator tornado.web.authenticated - Sorry我不知道怎麼翻譯這個,簡單來說就是user尚未通過認證,存取到任何網頁都會被導回login頁面
  • Non-blocking, asynchronous http request - facebook graph API query、backend server query
  • Template - MVC架構開發,這是每個framewrok都必備的
  • Security cookie - 防止cookie被篡改
  • L10N, CSRF protect

IDE選擇

2011/09/14

Python 教學網站

基本語法教學 - 初學者用

推薦IDE - PyDev

如何在MacOS下安裝python套件?
參考官方網站 Python on the Macintosh

建議使用 Macports 套件管理程式來安裝:
# 搜尋套件
port list | grep python

# 安裝python主程式
sudo port install python26

# 安裝 easy_install
sudo port install py26-setuptools

#之後就可以利用easy_install去安裝更多python套件了

2011/09/06

Forward Proxy 的選擇 - Squid

Forward proxy 與 Reverse proxy 是什麼可以參考聯成電腦這篇的說明

用途方面簡單舉幾個例子

  • Forward proxy
    • 用戶套用Hinet的proxy,抓國外的東西會比較快,因為proxy上面已經cache一份。
    • 公司或宿舍網路禁止對外存取facebook或上msn,proxy上有強大的parser可以check/replace特定字眼。
  • Reverse proxy
    • 在多台web server前架一台proxy做分流可以大大提高capacity與安全性,推薦Nginx。
    • 搭配virtual host,可將不同domain name的request導向不同的server。



最近剛好有使用forward proxy的需求,也就是用戶透過proxy連到public網路,如果遇到連接對向很慢或不存在的時候,此時proxy的connection就會被占住,直到timeout為止。剛開始是使用apache,apache prefork或worker模式下,其connection的數量是有限的(再設定檔內指定),若遇到上述的狀況,整體服務狀況就會變得很差。

Proxy的選擇
  • Apache + module proxy: 很吃記憶體,polling的做法不合用
  • Tinyproxy: 較apache省記憶體,但運作方式也是一個thread一個connection,response time比apache還差
  • Lighttpd: 不支援forward proxy,底層為epoll
  • Nginx: 不支援forward proxy,底層為epoll
  • Squid: 支援forward proxy,底層採用epoll (最後的選擇)

Squid的filter真的很強大,過濾ip, port, mac都沒有問題。
效能方面,我讓他hang了20,000條connection,new request上去反應並沒有被影響。

設定方面可以參考

2011/09/04

實作 TableView Section 展開/收合

iPhone中的UITableViewController變化真的很多!
最近剛好需要實作展開/收合的功能,效果如圖所示:

我是參考Expanding/Collapsing TableView Sections的實作,然後在自己簡化。
一個展開/收合的單位為一個Section,Row0表示Parent,Row1~N表示Child,程式碼中都有註解。