Chrome Extension Basic

介紹

官方文件

API

基本外掛

一開始要做一個簡單的外掛,建立一個按鈕在 Chrome 旁邊

要做一個按鈕會使用到 chrome.browserAction,如下圖所示

panel

當然還有其他類型的按鈕,例如pageAction,下圖橘色 RSS 按鈕

panel

不過為什麼不命名為browserButton這就不清楚了

再來看一下 API 頁面的介紹,基本上 API 介紹不外乎下面幾個重點

1
2
3
4
5
描述功能 : 就是描述功能
Manifest : 如何寫(裡面出現 optional 代表可寫可不寫)
小提示 : 告訴你可以用在什麼情境或是要注意的一些事情
範例 : 提供 Google 寫的範例原始碼
API : 此元件可用的 API,例如 browserAction 可以用 setTitle 這個方法

資料結構(樹)

參考網站

演算法筆記

演算法動畫

Swift 演算法

樹的定義

樹是1對多的結構,沒有節點的樹稱為空樹

1.存在唯一的根節點(root)

2.其餘節點可成為另一棵樹或稱子樹,注意子樹互不相交

節點分類

一個節點的子樹數量稱為

度為 0 表示此節點是葉子

階級

階級是從root開始算,根為一階並往下加

最大階度也稱為樹的深度或高度

樹的抽象資料型別

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
樹 (Tree)

Data
樹中節點有相同資料型態及階級關係

Operation
InitTree(*T) : 初始化
DestroyTree(*T) : 銷毀樹
CreateTree(*T,def) : 根據 def 定義樹
ClearTree(*T) : 清空 Tree
TreeEmpty(T) : 檢查 Tree 是否為空
TreeDepth(T) : 檢查 Tree 深度
Root(T) : 回傳 Tree 根節點
Value(T,cur_e) : 回傳此節點的值
Assign(T,cur_e,val): 將節點值改變
Parent(T,cur_e) : 回傳節點雙親

二元樹

1.每個節點最多兩個子樹,所以沒有大於2度的節點

2.左子樹和右子樹是有順序的

3.即使只有一個子樹也要區分左右

特殊二元樹

斜樹:所有節點只有左子樹或右子樹

完滿二元樹(Full binary):所有葉子都在同一階,高度 h 要有 2^h-1 個 Node

完整二元樹(Complete binary):也就是高度 h 但 Node < 2^h-1 個 Node 的樹

實作二元樹

3 種實作二元樹的方法

1
2
3
陣列表示法(如果是斜樹會浪費空間)
結構陣列表示法(如果是斜樹會浪費空間)
鏈結表示法

走訪二元樹

走訪二元樹的順序很重要,每個 Node 只拜訪一次

主要分為下面 4 種走法,都用遞迴寫法

1
2
3
4
前序(PreOrder)
中序(InOrder)
後序(PostOrder)
階序

資料結構(線性串列)

參考網站

演算法筆記

演算法動畫

Swift 演算法

線性串列抽象資料型別

線性串列是一種資料結構

包含順序儲存(陣列)或是鏈結串列都屬於線性串列

以下是線性串列的基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
線性串列 (LinearList)

Data
線性串列資料物件集合 = {a1,a2,a3...an}
每個元素型態皆相同

Operation
InitList(*L) : 初始化、建立空的線性表
ListEmpty(L) : 檢查 L 是否為空
ClearList : 清空 List
GetElem(L,i,*e) : 取得 L 中第 i 個傳給 e
LocateElem(L,e) : 搜尋 L 中和 e 相同的元素位置
ListInsert(*L,i,e) : 在 i 位置插入 e
ListDelete(*L,i,*e): 刪除第 i 位置的元素
ListLength(L) : 傳回 L 元素個數

Linux(移植 Ethtool)

參考網址

參考

下載安裝 Ethtool

下載網址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 解壓縮
$tar zxvf ethtool-4.8.tar.gz
$cd ethtool-4.8

# 看有哪些指令可以使用
$./configure -help

# 看此 SourceCode 的版本
$./configure -version

# 環境設定、編譯
$./configure CC=CrossCompilerPath --host=x86 --prefix=Path
$make
$make install

Ethtool 指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 看 ethX 基本設定
# ./ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: Symmetric
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: off
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes

# 看 ethX 基本訊息
#./ethtool -i eth0
driver: igb // Module 驅動,Intel® 82575/6,82580,I350,I210/211
version: 5.0.6
firmware-version: 1.8, 0x80000bec
expansion-rom-version:
bus-info: 0000:00:14.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

# 看 ethX Rx/Tx 封包資訊
# ./ethtool -S eth0
NIC statistics:
rx_packets: 1638
tx_packets: 1458
rx_bytes: 812443
tx_bytes: 103860
rx_broadcast: 210
tx_broadcast: 36
rx_multicast: 24
tx_multicast: 18
multicast: 24
collisions: 0
rx_crc_errors: 0
rx_no_buffer_count: 0
rx_missed_errors: 0
tx_aborted_errors: 0
tx_carrier_errors: 0
tx_window_errors: 0

# 看 Mac Address
#./ethtool -P eth0
Permanent address: 00:a0:c9:00:00:00

The Linux Programming Interface〈檔案 I/O〉

系統呼叫

大多的 Process 可以使用以下 3 種標準file descriptor

1
2
3
0 標準輸入 stdin
1 標準輸出 stdout
2 標準錯誤 stderr

shell 一開始會將這三個一直開啟

在程式中你可以直接使用 0、1、2 表示

或是include <unistd.h> 並使用

1
2
3
STDIN_FILENO
STDOUT_FILENO
STDERR_FILENO

The Linux Programming Interface〈系統概念〉

系統呼叫

系統呼叫流程,以使用 execve() 來說

1
2
3
4
5
6
7
int main()
{

char *argv[] = {"ls","-al","/etc/passwd",(char *)0};
char *envp[] = {"PATH=/bin",0};
execve("/bin/ls",argv,envp);
return 0;
}

execve 是 syscall 編號 11

編號定義位於kernel\linux-3.6.5\arch\x86\include\generated\asm\unistd_32/64.h

不同版本 Kernel 放的位置可能有點差別,另外 32/64 定義編號也會不一樣

1
2
3
4
5
6
7
8
9
10
# 32 位元編號定義
#define __NR_link 9
#define __NR_unlink 10
#define __NR_execve 11

# 64 位元編號定義
#define __NR_fork 57
#define __NR_vfork 58
#define __NR_execve 59
#define __NR_exit 60

程式設計師的自我修養〈靜態連結〉

簡介

前面目的檔章節介紹 ELF 檔案格式

此章節說明如果有兩個目的檔要如何連結

這裡使用 a.c 和 b.c 兩個檔案當範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# a.c
extern int shared;

int main()
{
int a = 100;
swap(&a, &shared);
return 0;
}

# b.c
int shared = 1;

void swap(int *a, int *b)
{
*a ^= *b ^= *a ^= *b;
}

readelf -s a.o
Symbol table '.symtab' contains 11 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS a.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 0 SECTION LOCAL DEFAULT 6
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 5
8: 0000000000000000 44 FUNC GLOBAL DEFAULT 1 main
9: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND shared
10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND swap

$ readelf -s b.o

Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS b.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 5
6: 0000000000000000 0 SECTION LOCAL DEFAULT 6
7: 0000000000000000 0 SECTION LOCAL DEFAULT 4
8: 0000000000000000 4 OBJECT GLOBAL DEFAULT 2 shared(全域符號)
9: 0000000000000000 74 FUNC GLOBAL DEFAULT 1 swap (全域符號)

How to program C〈指標〉

基本介紹

指標宣告

1
2
3
4
5
6
// countPtr 型態為 int*
// 表示指向 int 的指標
int *countPtr;

// 以下宣告只有 a 是指標 b 不是
int *a,b;

指標表示如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
count addr = 0060FF08
countPtr addr = 00000000
*/
int count = 7;
int *countPtr = NULL;

// countPtr addr = 0060FF08
countPtr = &count;

/*
值 0060FF08 7
名稱 countPtr count
位址 0060FF0C 0060FF08
*/