2013/05/21

解開 fd_set size limitation

寫 socket programming 時會用 select 搭配 fd_set 來偵測 file descriptor 是否可讀寫
但 Linux 系統預設的 fd_set size 只有 1024,若同時間處理的 fd 超過 1024 就會出問題


修改下面這兩個檔案,重新 build application 時就會引用到新的 define 值

/usr/include/bits/typesizes.h:
#define    __FD_SETSIZE        1024

/usr/include/linux/posix_types.h:
#define    __FD_SETSIZE        1024

2013/04/25

初次玩 Backbone.js: 多種 Template 的實作方式

假設我想設計一個公司資料,model 為單一員工資料,包含 id 與 name。collection 為部門資料,由多個員工所組成。而 view 用來顯示部門資料之用。
// Models
company.models.Employee = Backbone.Model.extend({
    defaults: {
        id: undefined,
        name: undefined
    }
});

// Collections
company.collections.Department = Backbone.Collection.extend({
    model: company.models.Employee
});

// Views
company.views.EmployeeList = Backbone.View.extend({
    el: "#container",
 
    render: function() {
        ...
    }
});

// Create base data
var c = new company.collections.Department(
        [{id:1, name: "Star Willard"},
         {id:2, name: "Rhona Eggleston"},
         {id:3, name: "Cassi Chowdhury"},
         {id:4, name: "Leigh Nilson"},
         {id:5, name: "Niesha Auger"}
        ]);

// Create view
var v = new company.views.EmployeeList({collection: c});
v.render();


以下就來探討 render function 該怎麼把 collection 套用到 template 並呈現在 UI 上

2013/04/23

WebSocket on Tornado

Tornado 一直是我愛用的 python web framework,這幾年工作上一直在寫 event-drivent socket programming,所以被它 non-blocking 的特性給深深吸引,如果每件 block 的工作都能用 asynchronous 的方式來解決,那程式執行的效率一定超好!


延續『WebSocket 雙向即時通訊 - 初探』,今天就以 Tornado 來寫個簡單的 WebSocket 範例。當 client 連到 server 後,會傳送 hello ,而 server 回應一樣的訊息,傳送到第五次,server 就把 client 斷掉。

Server (ws_server.py)
import tornado.ioloop
import tornado.web
from tornado import websocket


class WSHandler(websocket.WebSocketHandler):
    count = 0
    def open(self):
        print "Client connected"

    def on_message(self, msg):
        print "[%d] Got message [%s] from client" % (self.count, msg)
        if self.count == 4:
            self.close()
            return
        # Write back message
        self.write_message("[%d] Echo: %s" % (self.count, msg))
        self.count += 1

    def on_close(self):
        print "Client disconnected"


application = tornado.web.Application([
    (r"/", WSHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()



Client (ws_client.py)
from tornado.websocket import websocket_connect
from tornado.ioloop import IOLoop


class ws_client():
    conn = None # This is WebSocketClientConnection
    def __init__(self):
        websocket_connect('ws://localhost:8888/', callback=self.conn_cb)
        
    def conn_cb(self, future):
        self.conn = future.result()
        self.conn.write_message("hello")
        self.conn.read_message(self.read_cb)
        
    def read_cb(self, future):
        msg = future.result()
        if msg is None:
            print "Server disconnected"
            IOLoop.instance().stop()
        else:
            print msg
            self.conn.write_message("hello")
            self.conn.read_message(self.read_cb)

if __name__ == '__main__':
    ws_client()
    IOLoop.instance().start()

2013/04/21

人生 就該有限度的冒險

一件事六成把握就去做吧
要相信自己的應變能力
最差的時候 你還有求生存的自我保護機制

一件事不要尋求全部人的認同
如果想迎合全部的人
那肯定會失去初衷 失去原始的自我

追求完美的境界 永無止境
有時候 留一成餘地給別人
反而可以創造更多機會

沒有什麼是絕對的
要說可以做到十成
我想只有你堅定的信心

人生 就該有限度的冒險

2013/04/18

對於今日電視新聞的看法

新聞有毒,勇敢戒斷你會更快樂
                                --- Inside 硬塞的網路趨勢觀察


這半年沒看過幾次電視新聞 但不因而跟社會脫節
網路 書籍 所帶來的更多 不管是 及時性 時事 知識
選擇性也更廣 不只有藍台 綠台

網路新聞雖然也是記者寫的 但有更多評判的機會
很容易可以看到正反兩面

通常新聞報導都是不好的居多 而且越糟糕的的報越久
畢竟 這件事情只是一小部份 社會上還是有很多好的地方
很容易過度恐慌 造成大家對社會的觀感不好

像之前三餐都配人頭案 很倒胃口
每天看這些 心情會好才怪

畫面的呈現蔚為一種趨勢
記者還要充當演員 還原現場演一次
不如看寶傑的關鍵時刻娛樂性更甚
人對於畫面的理解較好
相對 思考 評斷能力也降低了
照單全收 很好洗腦


究竟 新聞的目的在於?
原始概念應該接近
客觀的呈現當下的情況 由收看的人思考而後斷
媒體只是扮演傳遞的角色

furthermore
讓社會進步 而不是圖利政黨財團
監督社會 揚善伐惡 但評斷的人 素質待加強
畢竟 結論是直接深植到大眾

播放的內容該跟大眾利益有關
腥羶色 奇人異事 是新聞 但我相信有更重要的東西可以報
世界觀 整體趨勢 試著把層次拉的更高


2013/04/17

來去基隆走走吧

愛上了平日逛街、平日旅遊的感覺,除了人比較少之外,可以和正在工作的人形成一種對比,心情特別不一樣 :P

今天請假在家休息,下午一個衝動就想去基隆走走,從汐止過去還蠻快的,沿新台五路走20分鐘就到了。基隆的路真不是普通亂的,除了很多單行道,還有一些路彎彎曲曲的,感覺很容易就逆向,尤其在港邊,差點誤闖貨運專用道。

查了一下比較 popular 的景點有
  • 基隆廟口夜市
  • 和平島公園
  • 白米甕砲台
  • 外木山漁港

港邊
 


和平島公園
 


走著走著 沙灘上突然浮現一些文字...


  


發現外星生物與外星地表
 

夕陽餘暉
 


天黑前趕快前往白米甕砲台
原來這邊的炮台早撤了 不過這是個制高點 瞭望港邊還不錯
如果晚上來 港邊燈火應該更漂亮
 

核彈基地?


基隆廟口 奠濟宮
 

來到廟口當然別忘了伴手禮呀
李鵠餅店的綠豆椪
連珍的芋泥球~超好吃

2013/04/13

WebSocket 雙向即時通訊 - 初探

Web 已經走向 Application 的概念,其中即時性(real-time)這個特點扮演很重要的角色

早期 Web service 要做到即時通訊不外乎兩種
  • Polling
    每n秒問一次 server,n 越小即時性越好,但相對 server loading 就越大
  • Long polling
    需要 Server support,延遲 response,確切來說是需要的時候再 response


但這兩種方式都需要額外的 overhead
  • HTTP 協定限制,一個 request 配一個 response,然後結束 connection,每次重新連線都需要 tcp 3-way handshake
  • Request 只能從 client 主動發出,若要做到 server push,client 得先建立一條連線讓 server 需要時 send back
  • 每次連線都要帶上 HTTP header,對頻寬也是一種浪費
  • Connection 斷掉再建立有個空窗期


而 WebSocket 正是改善這些缺點
  • 全雙工通訊(full-duplex communication),連線一旦建立,server/client 隨時都可以發送資料給對方
  • 除了第一次 handshake 外,過程中傳送資料的 header 很小
  • 避免對同一個網站建立多條 connection


WebSocket 的 implementation


WebSocket 對各種瀏覽器版本的支援度


WebSocket Protocol/Packet 分析


其實在 HTTP 1.0 與 1.1 也有 persistent connection 的實作
  • HTTP 1.0 persistent connection:又稱 HTTP keep-alive 或 HTTP connection reuse,可以在同個 connection 下發送多次 request/response 
  • HTTP 1.1 提出了 pipelining:允許一次發送多個 request 給 server,但 server response 時也必需按照順序
但這機制卻沒有被廣泛的應用?是因為早期的 web server 存在 C10K problem 嗎?還是 server 支援度的問題?加上 proxy 與 browser 有限制 client 到 web server 的 current connection 只能建立兩條,避免浪費 server 資源

詳細可以參考 HTTP 連線管理 | ihower { blogging }