原创 日期、時間與UTC

傳統日期的侷限 人類在對時間的測定上存在一個進化的過程,最早通過觀察天體的自轉與公轉來確定時間,比如地球自轉一週爲一天,月球公轉一週爲一月,地球公轉一週爲一年。 我們先考慮天和年,他們之間就像數學一樣存在一個粗糙的進制方案——365.25天

原创 洗牌程序

前兩天微博上有人討論洗牌程序,沒細看內容但感覺似乎有點意思,今天自己嘗試一下。 所謂洗牌程序就是把一個序列的元素位置打亂,這在 Python 裏有一個標準函數:random.shuffle。在開始動手之前我們先簡化描述一下需求: 洗牌後的每

原创 SICP 遞歸的種類與變換

遞歸本質上就是一串延遲操作的計算。根據被延遲操作的結構區別,可以分爲線性遞歸和樹形遞歸;線性遞歸又有一種特例形式叫做尾遞歸;線性遞歸和循環是等價的;線性遞歸比起樹形遞歸又具有好的多的空間效率,因此樹形遞歸到線性遞歸的轉換也是一個知識點。 線

原创 Jupyter Notebook 跨域連接 Kernel 的方法

通常一個新的 Notebook 在打開的時候,會自動連接當前服務器,創建一個 Session 和一個 Kernel 進程。該 Session 綁定在該 nb(notebook 簡稱,下同) 的路徑上,因此你要你的 server 不停,無論刷

原创 計算機系統要素 C4

存儲 D、A、M Hack 機器包含兩個16位寄存器——D 和 A,分別是 Data 和 Address 的縮寫。他們本質上是一樣的,用途的不同是分配出來的。 如當訪問 M 這個符號的時候,總是以 A 寄存器的值作爲地址去操作內存。即 M

原创 Go Tour

基礎 包 package 是 go 程序的組成單元。 所有程序都以名爲 main 的包爲入口。 包的名字定義在文件起始處。 變量 標準變量聲明和賦值爲 var x int x = 1 同時聲明多個同類型變量 var x, y int

原创 Prometheus2.0 的查詢 DSL

Prometheus 的查詢有一套專用語言,叫做 PromQL。其表達式可能是受了 golang 的影響,非常的緊湊和符號化。這使得其易於書寫但難以理解(對不熟悉這種 DSL 的人來說)。因而有了這篇文章。 以下內容基於官方文檔(2.0)編

原创 AES Padding

AES 作爲塊加密算法(block cipher),要求被加密數據具有固定的大小,比如16 字節。那麼對於一段任意大小的明文,對最後一個塊補全到 16 字節就是一個必要的過程。以及在解密時將 padding 字節刪除。 那麼這裏的關鍵問題便

原创 Datagram 考據

Wikipedia 對 Datagram 的解釋是: packet-switched 網絡的基本傳輸單元,是對 data 和 telegram 這兩個單詞的組合,最早出現在 1970 年代的 CYCLADES 項目中。 而 telegra

原创 SICP recursive process 和 recursive procedure 的區別

SICP 1.2.1 有一段話: In contrasting iteration and recursion, we must be careful not to confuse the notion of a recursive pr

原创 計算機系統要素 C1-C3

前三章內容是電路層面的各種門的構建,整體學習曲線較平緩,遇到的較難之處有: 從 NAND 到基本邏輯門(與或非)的構建 這部分因爲並不直觀,所以思考起來有點誤打誤撞的意思,但消耗一定時間後總是能解出來。 當做出基本門之後,剩下的東西就都很直

原创 docker

跟着公司用了一段時間的 docker,一直感覺不明不白的。今天抽了點空從頭梳理了一遍,過程記錄如下。 概念 使用 docker 基礎的概念有三個:鏡像、容器 和 倉庫。 鏡像功能上和我們裝系統時使用的 ghost 鏡像類似,可以看成一個系統

原创 如何寫一個 JSON Parser

之前在網上看到某公司新招實習生的第一次作業是寫 JSON Parser,好像之後還要寫 Scheme 的 Parser,就自己也想試試。因爲並不是工作任務,所以也沒去查任何資料,準備自己憋。 但畢竟非科班,也完全沒接觸過語言或編譯的內容,一

原创 asyncio 的使用姿勢

前段時間使用 asyncio 寫了一個小程序,摸索出一些使用上的注意事項,記錄如下。 本質 有人把 asyncio 這類東西叫做使用同步語法的異步程序,即說明它仍然是異步程序的本質,只不過在語法層面進行了優化,避免陷入回調地獄。取代回調的是

原创 計算機系統要素 C5

本章值得一提的是組織計算機的結構。Hack 的指令和數據是分開存儲的,因此它的 CPU 有兩個 input: IN inM[16], // M value input (M = contents of RAM[A])