Coroutine, Generator 那是什麼?

在談到 coroutine 之前,先來看一下緣起好了 異步 在現在的程式語言中,一直都有想做到異步、平行的需求,以減少 CPU 停下來等 IO 的時間。 目前有的解決方案,如 javascript 是直接對於會遇到 io 的程式碼直接跳過不執行,等到程式有空去執行 IO 的部分才會去處理。 例如: var fs = require( »

rsync 是如何比較檔案差異的?

rsync 是 unix 上常常被用來同步兩臺主機資料的指令。而 rsync 令人稱道同步能力,不僅僅是把檔案抓下來到本機,而是厲害到可以只下載一個檔案中的差異部分,而非整份檔案抓下來。 如果自己想自製一個能夠比較兩份文件差異的程式,稍微想一下設計,大約還能以行爲單位來設計,找出差異。 但是如果檔案並非純文字,而是像照片這般的二進位檔案,可能一整份檔案都沒有任何換行符號,一比較差異就是讓伺服器把整份檔案重新抓下來了。 面對通用檔案的差異比較,其設計思路就會朝向將檔案切成一塊一塊的區塊來進行差異比較。但終究需要面對以下問題: 不可能將每個區塊的內容下載下來讓客戶端進行比較,這樣等同下載整份檔案 如果只是檔頭加了一點內容,切割區塊有機會造成每個區塊內容就不同,也等同要下載整份檔案 »

annotation 的二三事

第一次看這隻小老鼠 在 java 裡面常常會看見下面這樣的用法 @Override void method() { } 上面有個小老鼠的 @Override 便是 annotation 。 這個 @Override 的作用是開發者繼承某個 class 之後,想要覆寫父類別的時候加上這個 annotation 可以讓編譯器知道你想覆寫,因此編譯器會檢查父類別是否有相同的 method ,以免你原本想要覆寫父類別的 method 結果卻手殘打錯字沒有真的覆寫到而發生意外。 因此 annotation »

Scheme 中的 quasiquote, unquote, unquote-splicing

先談談 Scheme 中的 Quote 每次我向人介紹 Scheme 的時候,我總是喜歡跟人說 Scheme 語法只有一個: (函數名稱 參數1 參數2 參數n...) 在 scheme 如果不是數字或是文字,則會被當成 symbol ,而 symbol 簡言就是被當成某個內容的名稱,像是函數的命名、變數的命名都被稱為 symbol。 只要遇到 »

一個二進位方法判斷是否為 2 的次方數

今天看了一個問題,是叫你寫個程式判斷一個數字 n 是否為 2 的次方。 起初一個很簡單的概念就是用个迴圈,從 1 開始不斷的乘 2 ,如果這個數字跟叫你丟進來測試的數字 n 相同,那就是 2 的次方了。 大概長是下面這個樣子: int det_is_power_by_2(unsigned n) »