深度分析 Puffin OS Phone—搶攻第三世界的智慧手機
- January 29, 2020
- Liu, An-Chi 劉安齊

現代人不聯誼了,以前抽鑰匙如今改抽卡,我與現任女友是在交友軟體上認識的,說說去年夏天以來的故事。
命運非常奇妙,當你越認為這個人和你的人生沒關係,你們彼此的牽絆就越強烈。一開始,我從來沒想過這女生會變成我女友。
Continue readingCommon Gateway Interface, CGI 讓伺服器(Server)將路由(Route)轉給轉外部程式(CGI 程式),使外部程式可以直接和客戶端(通常為瀏覽器) 互動。在 WEB 剛興起的時候,主要還是處於靜態伺服階段,單純傳送檔案或文字資訊而已。如果想要有表單之類的互動,也就是動態網站的話,就要靠呼叫外部程式來幫忙。隨著網路科技的發達,CGI 至今仁廣泛使用,像是 PHP 搭配 Apache。不過同時也有其他架構興起,例如以 Python、NodeJS、PHP、Java 等語言為基礎的網頁框架,像是 Flask 或 Express,抑或著實現前後端分離的 RESTful API 架構。
Continue reading不管使用本地端 Unix、Windows 或是連線到伺服器,我們都會打開終端機(Terminal),而連線等入進去的起使畫面會是 Shell,然後開發者可以輸入指令來跑程式。某方面來說,當我們在講「使用終端機」就等同「使用 Shell」,即便他們原本代表意思其實不一樣。關於 Shell 的詳細介紹可以參考「C Sehll」英文維基。
Continue readingPaper: Not So Fast: Analyzing the Performance of WebAssembly vs. Native Code
Author: Abhinav Jangda, Bobby Powers, Emery D. Berger, and Arjun Guha, University of Massachusetts Amherst
Source: USENIX ATC 2019
作者們先前開發了 BROWSIX,可以讓 Unix 程式直接轉成 JavaScript 並跑在瀏覽器。BROWSIX 基本上就是把程式碼轉成 JavaScript 並且用 Browser API 來模擬 Unix System Call。此篇作者更進一步,開發 BROWSIX-WASM(fork 自 Emscripten)將程式碼轉成 WebAssembly,一來解決原本 JavaScript 效能不佳問題,同時也能可以拿來和 Native Code 在 SPEC CPU suite of Benchmark 上做效能比較。實驗結果 WebAssembly 在現代瀏覽器(Chrome & Firefox)上慢 Native Code 大約 50%,並深入探討為什麼會這樣。
整體來說我覺得是很有趣的一篇論文,整理了重點並加入一些我個人的見解。
Continue reading我正在念交大資工所,我決定要走資工是一個漫長的過程,這篇故事想從最早開始講起,描述過往我對資工的興趣如何慢慢建立。每個人的故事都是獨一無二,但我的故事希望可以給別人一些靈感和借鏡。
Continue reading紅黑樹是一種特別的資料結構,他具有跟 AVL Tree 一樣可以自動平衡的功能。
一個紅黑樹具有一下特性:
NIL
且為黑遵循這樣的規則,可以確保在增加和刪除節點時,保持著樹的平衡狀態。紅黑數保證當 node 數量是 n
時,他的高度最多不會超過 2log(n+1)
。
在現實生活中,常常用來實作 set 和 dictionary,C++ 中的 std::set
和 std::map
背後正是紅黑樹。
Unix 中 processes 之間溝通有很多種,本篇介紹 signal 的簡易使用。可以先閱讀 Beej 的介紹。顧名思義,signal 就是程序發送和接受訊號,例如我們在使用 Shell 的時候,之所以 Ctrl-C
可以中斷程式執行,就是因為 Shell 捕捉到 Ctrl-C
發送的 SIGINT
訊號,知道有一個 interrupt signal,所以將程式中斷。
發送 signal 可以用 sigaction()
或 signal()
,不過建議使用 sigaction
因為比較新,詳細差別可以看 Stack Overflow 這篇 「What is the difference between sigaction and signal?」。
如果想觸發 signal,可以用 kill()
或 sigqueue()
,差別在於後者僅限 Linux,但後者可以藉由傳送 siginfo
加一些資訊在 signal 中。此外一些 system call 本身也會觸發 signal,例如如果嘗試 send()
到不存在的 socket
,就會觸發 SIGPIPE
。
當我們有很多 processes 時,並想用實現 shared memory 處理共用資料時,就可以使用 shared memory,來實作。建立 shared memory 可以使用 mmap
或是 System V shmget
,但根據 Stack Overflow 「How to use shared memory with Linux in C」回答,shmget
已經有點過時,mmap
則比較新和彈性。
Shared memory 讓我們可以建立一塊共用的記憶體空間,mmap
會回傳一塊記憶體空間的指標,型別是 void *
,如果我們想要放資料進去,可以用 memcpy
將物件、字串或任何東西拷貝進去。我們也可以直接將 void *
轉型成物件指標,這樣就建立 shared object,不同 process 可以直接對 process 存取物件。