原创 C語義的預處理 - 宏定義中 # 和 ## 的意義及用法

宏定義基本語法 C 語言中,所有預定義的宏,都會在預處理階段進行替換。宏定義的語法爲: #define 宏名 字符串 簡單宏定義 下面的示例中,預處理後,所有出現 MAX 的位置都會被替換爲 100: #include <std

原创 Golang 實現 RPC

go RPC 包文檔 通過 go 自帶的 net/rpc 包可以很容易實現 RPC。go 官方文檔對 RPC 服務端方法的要求如下: 方法是導出的 方法有兩個參數,都是導出類型或內建類型 方法的第二個參數是指針 方法只有一個er

原创 Protobuf 在 Ubuntu18 下的安裝和使用

Protocol Buffer 是 Google 搞的 RPC 服務的中間層數據協議。其實 RPC 服務之間可以用各種數據格式,例如 JSON、XML 等。但考慮編解碼效率和傳輸效率的話,Protobuf 性能更好。 此外,Pro

原创 Golang 配置代理

通過 go get 命令下載各種依賴時,經常需要訪問 github/google 等網站。配置好代理後,可以快速穩定的訪問。 常用的 go 代理 goproxy https://goproxy.io/zh/ 阿里雲 https:

原创 golang 二維 slice 的奇怪 bug

對二維 slice 操作時,對長度 16 的 slice 的第 8 次操作時,影響了第 16 個 slice 的最後一個元素。。 package main import "fmt" // import "sort" // imp

原创 操作系統實踐-預備知識-FAT12文件系統

參考資料:http://www.disc.ua.es/~gil/FAT12Description.pdf 軟盤 軟盤的文件組織格式一般爲 FAT12,組織單位由大到小分爲: 分區:例如 C 盤、D 盤 簇:文件以簇爲單位分配存儲

原创 操作系統實踐-BIOS

基本概念:https://wiki.osdev.org/BIOS 所有中斷列表:http://www.ctyme.com/intr/int.htm IBM PC 介紹:http://classiccomputers.info/d

原创 【二叉樹】O(1)空間複雜度的Morris遍歷

對於二叉樹的遍歷,常規的遞歸或迭代都需要用到棧,不管是函數調用棧還是手動創建的棧。因此空間複雜度都是 O(n)。 如果要省掉棧的開銷,將空間複雜度降低到 O(1),則需要藉助二叉樹中的葉子節點來保存臨時信息。只要當前節點 cur

原创 【算法與數據結構】字符串模式匹配

語義 在一個很長的字符串 T 中,查找是否存在子字符串 P。例如搜索引擎收錄的大量網站數據,當用戶輸入關鍵字後,就會在這些數據中進行匹配,並返回合適的網站。 語義:假定字符串長度爲 j,則所有字符串都在 [0, j) 這樣的集合中

原创 【Linux 網絡編程】socket 實現服務器和客戶端

IP 地址可以標識網絡中的主機,協議類型(TCP或UDP)加端口號可以表示主機上的進程。 基本原理 文件類型 Linux 中有七種類型的文件,這些文件類型可以使用一些基本的函數,例如 read、write: 普通文件 目錄 鏈接

原创 【Linux 網絡編程】多進程、多線程服務器併發模型

服務器在執行 accept 等待客戶端連接時,會阻塞。客戶端連接成功後 accept 函數返回,執行後面的代碼。 如果想要服務器同時爲多個客戶端服務,有以下幾種方式: 多進程:每來一個客戶端,就開一個進程與其通訊。 多線程:跟多

原创 C 語言中使用多字節字符,通過 UTF-8 支持中文

C 語言默認的 char 類型是單字節字符,僅支持 ASCII 碼。但是 ISO C90 標準開始,定義了 wchar_t 類型用於支持多字節字符(頭文件 wchar.h)。 這一版標準中還定義了本地化和國際化相關的頭文件 loc

原创 【算法與數據結構】優先級隊列 - 用二叉堆求數據流中的第K大的元素

數據流中的第K大的元素,總數據個數不足K個元素時返回-1。 #include <stdio.h> #include <stdlib.h> typedef struct { int* data; int count

原创 HashTable 示例 - 找出數組中和爲指定值的兩個數

數組 [2, 4, 6, 8],和爲 8,則返回 [0, 2] 數組 [2, 3, 3],和爲 6,則返回 [1, 2] #include <stdio.h> #include <stdlib.h> typedef unsign

原创 【算法與數據結構】鏈表逆序、相鄰兩元素逆序、探測環路

鏈表常見操作有: 鏈表逆序 鏈表每相鄰兩個元素逆序,例如 1, 2, 3, 4 => 2, 1, 4, 3 探測是否構成環路 #include <stdio.h> #include <stdlib.h> typedef st