Monthly Archives: March 2021

GNU readline cheatsheet

在 Linux環境中,command line如bash或是interpreter如python常常有支援readline的keymap,以下整理常用的快速鍵,其他可參考以下連結 https://en.wikipedia.org/wiki/GNU_Readline 移動游標 Ctrl + f : move forward 1 character → Ctrl + b : move backward 1 character ← Alt + f : move forward 1 word Alt + b : move backward 1 word Ctrl … Continue reading

Posted in System Administration | Leave a comment

WebSocket node.js ws 註解整理 – 1

這裡 註解 整理在Node.js中,WebSocket client/server常用的實現 ws 套件的程式碼 https://github.com/websockets/ws 關於WebSocket protocol,可參考另一篇文章的整理 index.js 所有的implementation在lib資料夾,大約3600行,算是一個輕量的實現,可先從index.js export的WebSocket開始追起,這也是一般js WebSocket client使用的class,WebSocket client API在實現上也是參考 browser使用的API,所以https://developer.mozilla.org/en-US/docs/Web/API/WebSocket 也要一併參考 以下逐行整理註解lib/websocket.js lib/websocket.js 上面可以看到支援的兩個version 8、13 8主要是對應https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-08 開始的版本到 -12 ,13主要是對應 https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-13 開始的版本,不過實際上支援的程度或相容性仍要看實作細節 繼承 EventEmitter,可參考 Nodejs Events整理的說明 constructor的部分: 接下來從constructor內的initAsClient往下追 以下設置http req,透過http.get function,可參考: https://nodejs.org/docs/latest-v12.x/api/http.html#http_http_request_options_callback 上面的error event … Continue reading

Posted in nodejs | Leave a comment

Nodejs Events 整理

Nodejs Events module是一個很重要的元件,主要原因是在asynchronous programming,Node.js在Javascript的語言層面提供了如callback、Promise、async/await等機制,這些機制都是類似於request-response的概念,也就是先發起一個function call,等待function call回應,可以對於notification類型,特別是event driver programming,就必須使用callback方式。在browser的DOM規範中,也有定義類似的介面EventTarget https://dom.spec.whatwg.org/#interface-eventtarget 主要就是定義註冊管理使用callback function的介面 event driven programming的特色就是將event透過handler/listener function來處理,並且event的時間點不確定,所以handler/listener callback function的角色是被動的,有什麼event過來就處理什麼event,event可以是新的資料,譬如說網路socket接收到的內容,也可能是狀態的改變,譬如說XMLHttpRequest的progress event。 在瀏覽器的javascript,因為UI有各種IO原始事件(滑鼠、鍵盤),進而在瀏覽器產生對應出衍生的UI事件。在Nodejs更多的IO操作也是透過event傳達狀態改變,例如’open’, ‘ready’等。或是如Readable stream的’data’ 在Node.js中,按照習慣,會發出event的object繼承於EventEmitter,透過.on(eventName, eventHandler/Listener) 來接收event,並且eventName建議是以camel case的方式命名,只是Nodejs大部分的event不需要用到第二個字,所以常見的都只是小寫event name 這裡節錄一段官方文件的範例,透過extends EventEmitter方式,使物件具有收發event的能力,emit透過 function argument,傳遞eventName之外的其他資訊。 .on呼叫的callback不應該是async function,並且callback被呼叫的順序是按照註冊的順序被 synchronously呼叫,另外也有一個.once 的API,主要用於handler/listener只一次性處理event,可參考另一篇文的說明 在Node.js中,錯誤處理有兩類,一種是js exception機制,synchronous function call內部透過throw,可以將錯誤傳遞出來,另外一種是callback中帶err argument,但這些都是function call流程很明確的時候。event … Continue reading

Posted in nodejs | 1 Comment

WebSocket protocol整理

WebSocket作為在HTTP下一個很重要的雙向通信延伸的protocol,HTTP 1.0/1.1的設計是half-duplex,也就是同一個時間只會有單向傳輸(request->response),雖然HTTP 1.1有支援http pipelining,但本質上他還是單向傳輸的的架構(第二個request不用等到第一個response收到就可以發出,但是response order還是根據request),並且這項功能在大部分的client/server實作不完整 WebSocket出現於2009年左右(並於Chrome 4開始實作支援),在此之前要在Web上透過HTTP protocol進行雙向通信,需要用一些技巧模擬出來 因為HTTP 通信是half-duplex,從web browser client的角度,browser可以知道什麼時候要send資料,隨時可以由browser發起http request,而recv則是由server傳來的資料,但是在http request-response的架構下,因為不知道server什麼時候有資料,最簡單的做法就是要定期去polling,這個在早期的聊天室系統都是這樣處理,每隔幾秒鐘就發一次http request更新最新的內容,但是這樣做有個缺點 – 不即時 即時性的問題在後來發展出hidden iframe以及long polling兩種做法,以兩種做法解決問題主要是因為browser的限制(browser只支援單純的http request-response),雖然在HTTP協定中其實有定義可以做雙向通信的,像是HTTP/1.1 CONNECT(主要用在tunnel proxy情境),或是HTTP/1.1 Upgrade header,但是tunnel或是upgrade完的通信方式要由app決定。 hidden iframe的做法算是巧妙地利用browser load javascript的行為,他透過inline iframe建立起一個隱藏的iframe,在iframe裡面load一個特別的網頁,那個網頁會一直傳<script>,將要server通知的內容即時透過<script>結合javascript,在裡面嵌code和data,因為browser收到script會立即執行,並且按順序執行,透過巧妙地安排script內容,將訊息傳出來給parent page,因為網頁還沒load完,連線就會一直持續 long polling則是透過http XMLHttpRequest方式,連上server後,在沒有新的event data情況下,server就掛起連線,等有資料再response,當client收完資料後連線結束,再馬上發起新的long polling request,這個好處是可以即時的收到event data,缺點是XMLHttpRequest browser有一些限制(例如cross origin等問題),以及每次HTTP … Continue reading

Posted in Network | 1 Comment