2013年11月27日 星期三

Embeddedd Web Server

需求
  • Embedded System 控制界面
  • 登入
  • 防止技術洩漏

沒有檔案系統
有檔案系統
參考:OpenWrt WebUI

Ubuntu 瘦身

sudo apt-get remove landscape-client-ui-install thunderbird tracker ubuntuone-client
註:上述這些,Lubuntu 13.10 都沒有安裝
sudo apt-get purge ibus-table

移除已不需要的套件以及清除套件快取檔。
sudo apt-get autoremove --purge
sudo apt-get clean

參考:
  1. Ubuntu 進階優化和調校
  2. Ubuntu 12.04 & 12.10 調校備忘 (by Jamyy)
  3. [教學] Ubuntu 12.04、12.10的調校 [論壇 - Ubuntu 文件資源]
  4. Linux 安裝與使用

2013年11月25日 星期一

regular expression

正規表示式、字串樣本、字串比對

正規表示式是一種進階的字串比對,用「符號」描述字串的樣式,說明某個位置可以是哪些字元、符合的次數等。只要了解這些特殊「符號」,英文稱 metacharacter,可翻作「字元符」,就可以了解正規表示式。正規表示式在許多地方都可以見到,例如 grepsed、vi、JavaScript、git grep、IMS PSI 等。

字元描述

大部分字元,包括英文字母及數字,代表的就是它自己。其它的是有特殊意義的符號,可描述字元、位置、次數等。
  • .:任何字元。
  • \:跳脫字元,跳脫下個字元原本的解釋,原本是 metacharacter,就不解釋為 metacharacter。原本不是 metacharacter,改解釋為 metacharacter。
  • \d:數字。
  • \D:非數字,和 \d 相反。
  • \s:
  • \S:
  • []: bracket 表示式,[] 包起來,內含比對單一字元符合的列表。但如果內容以 ^ 開頭,則為不包含的列表。
    • 可用「-」表示範圍。例如「a-d」相當於「abcd」(在有些 locale 的字典順序不同,會變成「aBbCcDd」)。
    • 列表中也可以包含特定事先定義的類別,包括 [:alnum:], [:alpha:], [:blank:], [:cntrl:], [:digit:], [:graph:],[:lower:], [:print:], [:punct:], [:space:], [:upper:], 和 [:xdigit:]。注意,這裡的 [] 是類別名稱的一部分,[[:alnum:]] 代表數字及英文字母。
    • 大多 metacharacter 在 [] 裡失去其原本的特殊意義。要解除 ] 特殊意義,可放在列表第一個,^ 就不要放在第一個,- 放在最後。
  • \w:底線、數字或英文字母,相當於 [_[:alnum:]]。
  • \W:和 \w 相反,相當於 [^_[:alnum:]]。

位置描述

代表位置
  • ^:行開頭
  • $:行結尾
  • \< 及 \>
  • \b
  • \B

次數描述

說明重複的次數,沒有的話就是一次。
  • { }:重複次數。{2} 表重複兩次,{2,5} 表重複 2 至 5 次,{2,} 表兩次以上
  • *:0 次以上,相當於 {0,}。
  • +:1 次以上,相當於 {1,}。
  • ?:0 次或 1 次,相當於 {0,1}。

Alternation

|

subexpression

()

返回參考

\n:n 是一位數字,代表前面第 n 個 subexpression 符合的子字串。

BRE 和 ERE

一開始的正規表示式只支援 [、]、.、^、$、*,稱為 BRE (Basic Regular Expressions)。後來 POSIX 的 BRE 新增字元符來擴充功能,但為了相容,這些字元符前面需要加反斜線跳脫。而 POSIX ERE 則相反。
ERE:chapter 9 in IEEE 1003.1-2004 Part 1

BREPOSIX BRE
ERE
基本字元符支援支援支援
跳脫基本字元符反斜線反斜線反斜線
擴充字元符一般字元反斜線跳脫支援
跳脫擴充字元符支援反斜線

PCRE (Perl-compatible Regular Expressions)

  • 凡是標點符號, 加上倒斜線, 一定沒有特殊意義。
  • 常用的 [...] 定義了簡寫:
    • \d:[0-9], "任何一個數字"
    • \D:[^0-9], "任何一個非數字"
    • \w:[a-zA-Z0-9_], "任何一個文數字",不同 locale 有所不同。
    • \W:[^a-zA-Z0-9_], "任何一個非文數字"
    • \s:[ \t\n], "任何一個空白類字元"
    • \S:[^ \t\n], "任何一個非空白類字元"
  • ...

參考

  1. https://www.cyut.edu.tw/~ckhung/b/re/
  2. http://blog.roodo.com/rocksaying/archives/2670695.html
  3. Shell Script 文章

hex string to binary


echo -ne '\x5a'
echo -n 5a | perl -pe 's/([0-9a-fA-F]{2})/chr hex $1/gie'
echo 5a | perl -ne 's/([0-9a-fA-F]{2})/print chr hex $1/gie'
perl -lne 'print pack "H*", $_'
echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
echo -n 5a | xxd -r -p

$ a=5a
$ printf "\x${a}"


參考來源:
  1. linux shell scripting: hex string to bytes
  2. Shell Script 文章

sed

sed (stream editor) 是一個 stream 編輯軟體,直接對檔案一行一行處理。不像一般編輯軟體將檔案載入 buffer 後進行處理。sed 支援正規表示式及流程控制,可視為一種小型指令檔語言。

指令格式
  • sed [選項] [-e] '編輯命令' [輸入檔]
  • sed [選項] -e '編輯命令1' -e '編輯命令2' [輸入檔]
  • sed [選項] -f 命令檔 [輸入檔]
編輯命令放在選項 -e 之後,如果只有一個編輯命令可省略 -e。編輯命令也可以放在選項 -f 指定的命令檔裡。其它常用選項:
  • -n:不自動列印。預設除非刪除,不然每行都會印出。加了 -n 選項,
  • -i:直接修改檔案內容
編輯命令格式:
  • [位址[,位址]]動作

位址

用來決定哪些行套用動作,不然每行都套用。有些動作不能有位址;有些可以有一個,指定符合的那些行;有些可以有兩個用「,」隔開,標示行的範圍。位址格式如下:

  • 數字:代表行數
  • 數字~step數字開始每 step 行。在 GNU 數字可以為 0。
  • /正規表示式/\c正規表示式c:比對符合的行,c 是任何字元。
  • $:最後一行
  • 整組位址後加「!」代表否定
GNU 額外支援的位址:
  • 0,位址位址正規表示式的比對,讓第 1 行可作為結束。
  • 位址,+N位址到其之後 N 行。
  • 位址,~N位址到其之後行號為 N 倍數的行。

動作

不能有位址的動作
  • #comment:整行為註解。
  • : label:供動作 bt 跳躍的 label。
  • }:{ } 命令區塊的結束。
沒位址或單一位址的動作
  • =:印出行號。
  • a[字串]:(append) 後面附加行放字串。新增多行,行尾用 \ 後換行。
  • i[字串]:(insert) 插入新行,類似 a,但是新增在前面。
  • q[結束碼]:
  • Q[結束碼]:
  • r檔名:後面附加檔案裡的內容。
  • R檔名:
接受範圍的動作:
  • {:命令區塊開始。
  • b[label]:(branch) 跳到 label 或命令檔最後。
  • c[字串]:(change) 整行取代
  • d:(delete) 整行刪除
  • D: 
  • l:類似 p
  • l[width]:
  • n
  • N:合併下一行。例如 sed 'N;s/\n/ /' 合併下行,並把換行取代成空白
  • p:列印,通常搭配選項 -n 使用
  • P
  • s/正規表示式/替代文字/[取代選項]:(substitute) 取代,比對正規表示式符合的話用替代文字取代。
    • 「/」可以用其它符號代替,例如「,」。
    • 替代文字」可以包含的特殊符號
      • &:整個比對符合的部份
      • \1 到 \9:比對的群組
      • \L:改為小寫
      • \l:首字改為小寫
      • \U:改為大寫
      • \u:首字改為大寫
    • 取代選項
      • 未指定只取代一行中第一個符合
      • g:global,一行中全部的符合都取代
      • 數字:一行中第幾個符合才取代
      • w file:寫到檔案
    • 範例
      • s/^/#/:每行開頭插入 #。
  • t[label]:(test) 執行 s 如果成功則跳到 label 或命令檔最後。
  • T[label]:同 t,GNU 擴展。
  • w
  • W
  • y/source/dest/:

使用保留空間的動作

保留空間 (hold space) 是一個另外的儲存空間,用來記憶內容。這些動作都接受位址範圍。
  • g:取代為保留空間內容
  • G:後面附加保留空間內容
  • h:覆蓋保留空間
  • H:附加到保留空間
  • x:跟保留空間內容互相交換

範例:pattern/hold space的處理

一系列編輯命令用「;」隔開。 

範例

  • sed 's/\(NAME=\).*/\1abc/g' config.file:將設定檔 config.file 中的 NAME= 設為 abc
  • sed -ne '/MHz/ { /disabled\|passive\|radar/d; s/.*\[//; s/\].*//; p; q }')
  • sed ':a;/0$/{N;s/\n//;ba}':迴圈執行,如果目前行以 '0' 結束,則合併下一行,並移除換行
  • Shell 變數字串處理
  • 目錄檔案字串替換
  • 多行處理:http://www.study-area.org/cyril/scripts/scripts/node57.html
  • 跳躍:http://www.study-area.org/cyril/scripts/scripts/node58.html
  • 多檔處理:http://www.study-area.org/cyril/scripts/scripts/node59.html

參考來源

延伸閱讀:
http://www.tldp.org/LDP/abs/html/

參考:Shell Script 文章

awk

以欄位為處理單位
指令格式:awk '條件類型1{動作1} 條件類型2{動作2} ...' filename
動作有 print 等
變數
  • $0 代表「整列資料」,$1 代表其中第一欄,$2 代表第二欄,...
  • NF 代表目前行有多少欄位
  • NR 代表目前是第幾行
  • FS 代表目前欄位的分隔字元,預設是空白或 Tab
一篇 awk 文章筆記
取檔案大小
ls -l $filename | awk '{print $5}'
印出第 1 行及最後一行
awk 'NR==1; END{print}' testing.txt
應用:
  • OpenWrt 的 ipcalc.sh:用 awk 作 IP 位址相關計算,包括 broadcast 位址、network 位址、prefix、起始位址、及結束位址。

參考:
  1. http://dywang.csie.cyut.edu.tw/dywang/linuxProgram/node37.html
Shell Script 文章

bash ARITHMETIC EVALUATION

bash 的算術運算用在內建指令 letdeclare、複合指令 (( ))、和算術擴展,使用固定寬度的整數,不檢查溢位,除以 0 會補抓為錯誤。

下列是運算子列表,以相同優先序為群組,越往下優先權越低 (優先序 和 C 語言一樣?)。括號裡的算式會先算。
id++ id--post-increment and post-decrement
++id --idpre-increment and pre-decrement
- +unary minus and plus
! ~logical and bitwise negation
**exponentiation
* / %multiplication, division, remainder
+ -addition, subtraction
<< >>left and right bitwise shifts
<= >= < >comparison
== !=equality and inequality
&bitwise AND
^bitwise exclusive OR
|bitwise OR
&&logical AND
||logical OR
expr?expr:exprconditional operator
= *= /= %= += -= <<= >>= &= ^= |=assignment
expr1 , expr2comma

參考:
  1. osl3 Shell 設計入門: 10.算術運算 (另外還有 expr、$[]、let 三種,其中 expr 可攜性較好)
  2. Shell Script 文章
  3. bash man-page ARITHMETIC EVALUATION 

bash 判斷式

bash 判斷式 (Conditional Expression) 用在內建指令 test 和 [、以及複合指令 [[ 來測試檔案屬性、進行字串或算術比較。[ 可以視為傳統 test 指令一樣的指令行,但最後要有引數 ]。由於每一項是引數,特殊字元要跳脫,但符合 POSIX 可攜性較好。[[ 算是 [ 的進階版,對應以 ]] 結束,不進行 Word splitting 和 pathname expansion,另外還有 Pattern Matching 功能。

真假值判斷可針對字串、整數、及檔案三大類,並且可以邏輯結合起來。

字串比較

[ str1 = str2 ]
[ str1 == str2 ]
字串相等 POSIX 相容 test 指令要用「=」。

[ str1 != str2 ] 字串不相等
[ str1 \> str2 ] 字串大於 「\」是 shell 的跳脫字元,消除「>」「<」輸出入轉向之意。
[ str1 \< str2 ] 字串小於
[ -z str ] 空字串,字串長度為 0
[ str ]
[ -n "str" ]
非空字串,字串長度大於 0 兩者結果有些不一樣,似乎 -n 字串前後要加 " 才會對
下列都是判斷空字串:
[ "$var" = "" ]
[ ! "$var" ]
[ -z "$var" ]
[ "X${var}" = "X" ]

排序按照 lexicographical,[[ 指令用照 locale 排序,test 指令用 ASCII 順序。

當 == (或 =) 或 != 用在 [[ 指令,右邊是 pattern 進行 Pattern Matching,如同啟用選項 extglob。如果啟用選項 nocasematch,比對不分大小寫。pattern 任何部份可以 quoted 來強迫直接字串比對。

整數比較

[ n1 -eq n2 ] 相等
[ n1 -ne n2 ] 不相等
[ n1 -gt n2 ] 大於
[ n1 -ge n2 ] 大於等於
[ n1 -lt n2 ] 小於
[ n1 -le n2 ] 小於等於
若要用「<」、「>」、「<=」、「>=」來比較數字,則判斷式需擺在 (( )) 中,如:(( "982" > "24" ))

檔案測試

判斷檔案是否存在,或測試檔案的屬性,如類型或權限等。
[ -a file ] 檔案存在 (和 -e 有何不同?)
[ -b file ] 存在為 block 裝置
[ -c file ] 存在為 character 裝置
[ -d file ] 存在為目錄
[ -e file ] 檔名存在
[ -f file ] 存在為一般檔案
[ -g file ] 檔案存在且 set-group-id
[ -h file ] 檔案為 symbolic link (和 -S 有何不同?)
[ -k file ] 存在且有設 sticky bit
[ -p file ] 存在為 named pipe (FIFO)
[ -r file ]存在為可讀
[ -s file ] 存在為非空檔案
[ -t fd ]file descriptor fd is open and refers to a terminal
[ -u file ] 存在且 set-user-id
[ -w file ] 存在為可寫
[ -x file ] 存在為可執行
[ -G file ] 存在為 effective group id 擁有
[ -L file ] 存在為 symbolic link
[ -N file ] 存在,且上次讀取後有更改
[ -O file ] 存在為擁有者
[ -S file ] 存在為 socket
[ file1 -ef file2 ] 兩者是否為同一個檔案 (同一個 inode)
[ file1 -nt file2 ] 較新,或 file1 存在 file2 不存在
[ file1 -ot file2 ] 較舊,或 file1 不存在 file2 存在
除非特指定,檔案是 symbolic link 應用在 link 的 target,而不是 link 本身。
如果檔案是 /dev/fd/n,檢查 file descriptor n。如果是 /dev/stdin、/dev/stdout、或 /dev/stderr,則分別檢查 file descriptor 0、1、或 2。

其它

-o optname:shell 選項 optname 已啟用。
-v varname:shell 變數 varname 已設 (已指定值)。
-R varname:shell 變數 varname 已設且是 name reference.

藉由「-a」(and, 且)、「-o」(or, 或)、「!」(非) 邏輯運算,可結合好幾個真假值判斷:

[ -r filename1 -a -x filename ] ==> 若 filename1 可讀且可執行

[ -r filename1 -o -x filename ] ==> 若 filename1 可讀或可執行

[ ! -r filename1 ] ==> 若 filename1 不是可讀

[[ 不進行 Word splitting 和 pathname expansion。進行 tilde expansion、parameter and variable expansion、arithmetic expansion、command  substitution、process  substitution、和 quote removal。Conditional operators such as -f must be unquoted to be recognized as primaries.

當 == (或 =) 或 != 用在 [[ 指令,右邊是 pattern 進行 Pattern Matching,如同啟用選項 extglob。如果啟用選項 nocasematch,比對不分大小寫。pattern 任何部份可以 quoted 來強迫直接字串比對。

另外還有額外 binary operator「=~」使用 extended  regular  expression (regex()),如果  regular  expression syntactically 錯誤回傳 2。Substrings  matched  by parenthesized subexpressions within the regular expression 存在 BASH_REMATCH 陣列,其中 index 0 是整個符合的部份,index n 是第 n 個parenthesized subexpression 符合的部份。

用下列優先權,表示式可以結合:
( expression ):優先進行。
! expression:True if expression is false.
expression1 && expression2:expression1 false 回傳 false,否則看 expression2 是否 true。
expression1 || expression2:expression1 true 回傳 true,否則看 expression2 是否 true。

if-than-elsetest
case

參考:
  1. 善用判斷式 [鳥哥的 Linux 私房菜]
  2. 真假值判斷 [Shell 設計入門 by 臥龍小三] mirror
  3. Shell Script 文章
  4. man bash 的  CONDITIONAL EXPRESSIONS 段落
  5. http://mywiki.wooledge.org/BashFAQ/031
  6. https://stackoverflow.com/questions/3427872/whats-the-difference-between-and-in-bash

export

指令格式:export [-fn] [name[=word]]
將 name export 為環境變數,給接下來指令使用

-f:export function
-n:在子程序時清除

參考:Shell Script 文章

JSON

JSON (JavaScript Object Notation) 是採用 JavaScript 物件寫法的資料交換格式,可用 JavaScript eval() 函數或其它程式語言讀入。

  • 一個物件以大括號 { } 包起來,包含一系列以「,」分開的「名稱:」對。
    • 名稱以「:」分開,名稱是 "字串",可以是 "字串"、數字、true、false、陣列、或是物件、null。
    • 陣列用中括號 [ ] 包起來,內容是一系列以「,」分開的
  • RFC 4627 -- The application/json Media Type for JavaScript Object Notation (JSON)
    • 回傳 JSON 時, 特別是有中文, 記得送 header
  • 安全問題:eval() 能編譯並執行任意的 JavaScript 代碼,不可靠的資料來源可能產生安全問題。建議使用 JSON.parse(),較舊的瀏覽器可用 JavaScript Library https://github.com/douglascrockford/JSON-js
  • 與 XML 比較:XML 是完整的標記語言,判讀需要較多功,但有很好的延展性,是 JSON 所缺乏的。JSON 不是完整的標記語言,但比 XML 小巧,瀏覽器內建快速解析支援,適用於網路資料傳輸。
  • JSON 壓縮
  • 雖然 JSON 是可閱讀的文字檔,但有時需要美化才好閱讀

2013年11月22日 星期五

Gargoyle HTTP Server

Gargoyle 基於 OpenWrt,除了採用簡易的 WebGUI 設定外,亦提供 QoS, bandwidth monitor 等進階功能。

Gargoyle 有自己的網頁伺服器,改良自 mini_httpd
source reference: httpd_gargoyle.c
主程式呼叫 handle_request()
  1. 從 socket 讀取 HTTP header
    • 每次最多讀 10000 bytes,直到有兩個換行
    • ssl or not
  2. parse request line
    • method, url, protocol
    • method: GET, HEAD, POST
    • url: with '?' for query
  3. parse all other headers,包括 Authorization:、Content-Length:等
  4. url: decode, remove ../, virtual host
    • 檔案不存在處理
    • 目錄:如有 defaultPageFile 或 index 檔,則依照檔案方式處理;不然則 list directory
    • 檔案:不能是禁止取用的檔案,如果符合 CGI 檔格式 (由設定檔 cgipat 參數或指令行 -c 參數設定) 則執行它,不然直接傳送檔案
    • 執行 CGI 檔
      • 必須是 GET 或 POST
      • 建立環境變數 envp
      • 建立執行參數 argp
      • stdin, stdout, stderr 導到 socket,中間可能插入另一個 process
      • execve(CGI 檔, argp, envp)
相關文章:OpenWrt WebUI

2013年11月21日 星期四

Shell Script

shell 是電腦文字操作界面,可以互動地 (interactive) 提示讓使用者從鍵盤輸入指令和顯示結果。

也可以非互動使用,可能直接執行另一個程式要求的指令,沒有輸入指令個過程,或沒人可以看到輸出 (例如寫到 log 檔)。

執行 shell 可以是登入動作的一部分 (login shell),通常會順便設定使用者需要的環境。 不是登入動作執行的 shell 就是 non-login shell。

多數 shell 可將多個指令寫在檔案裡面成為指令搞來執行,並提供額外程式結構而可擴展為程式語言。

大部份 Unix/Linux 系統有多個 shell 可選擇,如 bash、csh、ksh、sh、tcsh、zsh 等,有不同的選項和功能。

說明:
  • Shell:可以是輸入文字的命令列界面 (Command Line Interface, CLI),也可以是圖形使用者界面 (Graphical User Interface, GUI)。CLI 是個互動式的指令語言,也可以作為作業系統的命令檔語言用來控制電腦如何執行,稱為 Shell Script。
  • 指令語言直譯器 (command language interpreter):是指令直譯器,也是程式語言。作為指令直譯器,提供各式指令。作為程式語言,這些指令可以組合起來,建立包含指令的檔案成為一個指令,客製化用戶環境來自動化完成日常工作。
基本上,shell 就是執行指令的巨集處理器,擴展 text 及符號來建立較大的表示式。

shell 可以同步地或非同步地執行指令。同步的話,shell 等候指令完成才讀取下個指令。非同步的話,現行指令跟 shell 再去執行下個指令持續並行進行。轉向架構允許精確控制指令的輸出入。再則,shell 可設定指令執行環境的內容。

shell 提供內建指令實作一些外部程式不方便處理的功能,例如 cd、break、continue、及 exec 直接處置 shell 自己,無法在外部程式實作。history、getopts、kill、或 pwd 等內建指令可以在外部實作,但使用內建指令較方便。

雖然 shell 執行指令是重要的基本功能,大部分複雜的地方在於內建程式語言功能,像許多高階語言,shell 也提供變數、流程控制架構、quoting、及函數。

shell 特別為互動使用提供許多功能,包括 job control、指令行編輯、command history 及 aliases。

IO 導向

Shell 變數字串處理
正規表示式
外部命令
expr
應用
參考:
延伸閱讀

2013年11月18日 星期一

使用 Lua 的應用程式

使用 Lua 的應用程式
  • lua -- Lua interpreter
  • luac -- Lua compiler
  • 許多遊戲,例如 WoW、Angry Bird
  • Web Server
    • LightTPD supports the FastCGI, SCGI, and CGI interfaces to external programs。Understand and harness Lua/FastCGI
    • uHTTPd
    • haserl
    • lighttpd
    • Apache
  • OpenWrt device configuration, iwinfo
  • Security: scripting vulnerability scanners (nmap, Wireshark, Snort), iptables
  • Scripting and template language for Wikipedia
  • Embedded software: printers (Olivetti, Océ), routers (Cisco), telephones (FreeSwitch, Asterisk) and smartphones (several, including Huawei), smart tvs (Samsung), Logitech keyboards, Lego Mindstorms...
  • Adobe Photoshop Lightroom
  • VLC, Tex, vim, nginx...
參考:
  1. http://www.dcc.ufrj.br/~fabiom/lua/00Introduction.pdf
  2. 本站 Lua 相關文章

Lua 課程

http://www.dcc.ufrj.br/~fabiom/lua/

參考:
  1. 本站 Lua 相關文章

Lua C API 概述

Lua 實際上是指 C 函式庫 liblua,必須寄居在某個應用程式下才能使用,所以是一個嵌入式語言 (embedded language)。而 lua 這個獨立 (stand-alone) 應用程式,只是一個 Lua 的小外殼,少於 500 行程式碼,提供一個使用者界面方便使用 Lua,真正執行 Lua 程式碼的不是外殼,而是 Lua。Lua 嵌入式語言的角色 ,使得它成為應用程式的擴展語言 (extension language),讓應用程式得以使用 Lua 的設施 (facilities),來擴展應用程式的功能。

另外,Lua 也是一個可擴展的語言 (extensible language),可在 Lua 環境下用其它語言 (例如 C) 來擴展 Lua 所沒有的新功能。

就 Lua 的擴展語言及可擴展語言兩個角色,皆可使用 C 語言。Lua 可作為 C 語言的擴展語言,C 實作為應用程式,使用 liblua 提供 Lua 環境來擴充 Lua 語言功能。反過來,C 也可以擴展 Lua 語言,提供 Lua 沒有的功能。這兩者使用相同的 API 跟 Lua 溝通,稱為 C API,包括一些函數:讀寫 Lua 全域變數,呼叫 Lua 函數,運行 Lua 程式碼,登記 C 函數好讓能被 Lua 呼叫,等等。

跟 Lua 是完全不同的是,C API 延續 C 嚴謹的特性。在寫 C 語言程式時,必須注意類型 (type) 檢查,錯誤處理,memory-allocation 錯誤等。大多數 API 中的函數不檢查參數的正確性,在呼叫函數之前,必須確保參數是對的。否則,可能出現「segmentation fault」或類似的激烈結果,而不是委婉的告訴你錯誤訊息。此外,API 強調靈活性和簡易性,而不是易用,常見的工作可能要呼叫好幾個 API 函數,但讓你完全控制所有細節,比如錯誤處理,緩​​衝區大小等等。

Lua 和 C 之間通信中的重要組成部分是虛擬堆疊。幾乎所有的 API 都對這個堆疊裡的值操作。所有從 Lua 到 C 及從 C 到 Lua 的資料交換都是經過這個堆疊。此外,可以使用堆疊來存放中間結果。堆疊有助於解決 Lua 和 C 之間的兩個不匹配:一是 Lua 使用垃圾收集 (garbage collection),而 C 需要明確的釋出記憶體;二是來自 Lua 使用動態類型 (dynamic typing),而 C 使用靜態類型 (static typing)。

正如標題所說,本章是一個概述,不用急著去理解所提到的所有細節。稍後會補上那些細節。然而,不要忘了,可以在 Lua 參考手冊找到特定功能的更多細節。此外,可以在 Lua 的分佈 (distribution) 本身找到幾個使用 API 例子。獨立的 Lua 直譯器 (lua.c) 提供應用程式的例子,而標準庫 (lmathlib.c,lstrlib.c 等) 提供 Lua 的函式庫的例子。

參考:
  1. 本文翻譯 Programming in Lua, 1st ed.§24 – An Overview of the C API,並加以修改整理。
  2. 本站 Lua 相關文章

2013年11月17日 星期日

OpenWrt WebUI

OpenWrt 的 WebUI 主要有三種:LuCI、X-Wrt Webif、及 Gargoyle。

LuCI
  • Web Server 預設用 uhttpd
  • 使用 Lua 命令檔語言
X-Wrt Webif
  • Web Server 用 busybox httpd
  • shell + awk + haserl 命令檔語言
Gargoyle:基於 OpenWrt 的發行版本,有較易用的 GUI 介面及其它特別的功能,例如:可以對特定 IP 限制頻寬、主動式 QoS

haserl 是一個命令檔語言,本身編譯後約只有 20k,可在 HTML 檔嵌入 shell scripts 作為伺服器端命令檔,產生最終的 HTML 檔案。haserl 程式碼:
  • 本身是執行檔,首行是 #!/usr/bin/haserl
  • 其它內容是 HTML 格式,需要動態產生的部份用 <? ?> 包起來,執行 shell script 產生
參考:
  1. http://wiki.openwrt.org/doc/howto/webinterface.overview
  2. Web Server Comparisons -- 一些網頁伺服器比較,其中 thttpd 似乎不錯。而 gargoyle_httpd 是基於用 fork 的 mini_httpd,效能可能較差。
延伸閱讀:十大易用性原則

2013年11月16日 星期六

Lua 文章

Lua 是個輕小的指令檔語言 (Scripting Language),由於巴西在 1977 ~ 1992 年對電腦軟硬體進行嚴格的貿易管制,買不到只好自己開發,Pontifical Catholic 大學的大型實驗室 Tecgraf 在前身 DEL、SOL 發展後而誕生。特性
  • 容易和 C/C++ 間互相呼叫,擴充性極高
  • ...
本站 Lua 相關文章規劃:(參考自 Programming in Lua)
    Part I · The Language
  1. Getting Started (Hello World)
  2. Types and Values
    • 2.1 Nil
    • 2.2 Booleans
    • 2.3 Numbers
    • 2.4 Strings
    • 2.5 Tables
    • 2.6 Functions
    • 2.7 Userdata and Threads
  3. Expressions
    • 3.1 Arithmetic Operators
    • 3.2 Relational Operators
    • 3.3 Logical Operators
    • 3.4 Concatenation
    • 3.5 Precedence
    • 3.6 Table Constructors
  4. Statements
    • 4.1 Assignment (多值指定)
    • 4.2 Local Variables and Blocks
    • 4.3 Control Structures
      • 4.3.1 if then else
      • 4.3.2 while
      • 4.3.3 repeat
      • 4.3.4 Numeric for
      • 4.3.5 Generic for
    • 4.4 break and return
  5. Functions
    • 5.1 Multiple Results
    • 5.2 Variable Number of Arguments
    • 5.3 Named Arguments
  6. More about Functions
    • 6.1 Closures
    • 6.2 Non-Global Functions
    • 6.3 Proper Tail Calls
  7. Iterators and the Generic for
    • 7.1 Iterators and Closures
    • 7.2 The Semantics of the Generic for
    • 7.3 Stateless Iterators
    • 7.4 Iterators with Complex State
    • 7.5 True Iterators
  8. Compilation, Execution, and Errors
    • 8.1 The require Function
    • 8.2 C Code
    • 8.3 Errors
    • 8.4 Error Handling and Exceptions
    • 8.5 Error Messages and Tracebacks
  9. Coroutines
    • 9.1 Coroutine Basics
    • 9.2 Pipes and Filters
    • 9.3 Coroutines as Iterators
    • 9.4 Non-Preemptive Multithreading
  10. Complete Examples
    • 10.1 Data Description
    • 10.2 Markov Chain Algorithm
  11. Part II · Tables and Objects
  12. Data Structures
    • 11.1 Arrays
    • 11.2 Matrices and Multi-Dimensional Arrays
    • 11.3 Linked Lists
    • 11.4 Queues and Double Queues
    • 11.5 Sets and Bags
    • 11.6 String Buffers
    • 11.7 Graphs
  13. Data Files and Persistence
    • 12.1 Data Files
    • 12.2  Serialization
      • 12.2.1 Saving Tables without Cycles
      • 12.2.2 Saving Tables with Cycles
  14. Metatables and Metamethods
    • 13.1 Arithmetic Metamethods
    • 13.2 Relational Metamethods
    • 13.3 Library-Defined Metamethods
    • 13.4 Table-Access Metamethods
      • 13.4.1 The __index Metamethod
      • 13.4.2 The __newindex Metamethod
      • 13.4.3 Tables with Default Values
      • 13.4.4 Tracking Table Accesses
      • 13.4.5 Read-Only Tables
  15. The Environment
    • 14.1 Accessing Global Variables with Dynamic Names
    • 14.2 Declaring Global Variables
    • 14.3 Non-Global Environments
  16. Packages
    • 15.1 The require Function
    • 15.2 The Basic Approach for Writing Modules
    • 15.2 Privacy
    • 15.3 Packages and Files
    • 15.4 Using the Global Table
    • 15.5 Other Facilities
    • Using Environments
    • The module Function
    • Submodules and Packages
  17. Object-Oriented Programming
    • 16.1 Classes
    • 16.2 Inheritance
    • 16.3 Multiple Inheritance
    • 16.4 Privacy
    • 16.5 The Single-Method Approach
  18. Weak Tables
    • 17.1 Memoize Functions
    • 17.2 Object Attributes
    • 17.3 Revisiting Tables with Default Values
  19. Part III · The Standard Libraries
  20. The Mathematical Library
  21. The Table Library
    • 19.1 – Array Size
    • 19.2 – Insert and Remove
    • 19.3 – Sort
    • Concatenation
  22. The String Library
    • Basic String Functions
    • 20.1 Pattern-Matching Functions
    • 20.2 Patterns
    • 20.3 Captures
    • Replacements
    • 20.4 Tricks of the Trade
  23. The I/O Library
    • 21.1 The Simple I/O Model
    • 21.2 The Complete I/O Model
      • 21.2.1 A Small Performance Trick
      • 21.2.2 Binary Files
    • 21.3 Other Operations on Files
  24. The Operating System Library
    • 22.1 Date and Time
    • 22.2 Other System Calls
  25. The Debug Library
    • 23.1 Introspective Facilities
      • 23.1.1 Accessing Local Variables
      • 23.1.2 Accessing Upvalues
    • 23.2 Hooks
    • 23.3 Profiles
  26. Part IV · The C API
  27. An Overview of the C API
    • 24.1 A First Example
    • 24.2 The Stack
      • 24.2.1 Pushing Elements
      • 24.2.2 Querying Elements
      • 24.2.3 Other Stack Operations
    • 24.3 Error Handling with the C API
      • 24.3.1 Error Handling in Application Code
      • 24.3.2 Error Handling in Library Code
  28. Extending your Application
    • The Basics
    • 25.1 Table Manipulation
    • 25.2 Calling Lua Functions
    • 25.3 A Generic Call Function
  29. Calling C from Lua
    • 26.1 C Functions
    • 26.2 C Libraries
  30. Techniques for Writing C Functions
    • 27.1 Array Manipulation
    • 27.2 String Manipulation
    • 27.3 Storing State in C Functions
      • 27.3.1 The Registry
      • 27.3.2 References
      • 27.3.3 Upvalues
  31. User-Defined Types in C
    • 28.1 Userdata
    • 28.2 Metatables
    • 28.3 Object-Oriented Access
    • 28.4 Array Access
    • 28.5 Light Userdata
  32. Managing Resources
    • 29.1 A Directory Iterator
    • 29.2 An XML Parser
  33. Threads and States
    • 30.1 Multiple Threads
    • 30.2 Lua States
  34. Memory Management
    • 31.1 The Allocation Function
    • 31.2 The Garbage Collector

其它

romfs

romfs 是一個非常精簡、唯讀、block-based 的檔案系統,沒壓縮,所有檔案 root 擁有。

genromfs

特性

  • 只保留作為一個檔案系統的最小需求:
    • No modification dates
    • No unix permissions

用途

每 個 Linux 系統都至少需要配合一個檔案系統來執行,而大多其他檔案系統含有許多功能,不適合在某些資源較吃緊的情況下使用,這時改用 romfs 就很完美。例如:可以把壓縮過的 Linux kernel 放在 romfs 裡,給認得 romfs 的 bootloader 解壓縮放到 RAM 中執行。

延伸閱讀

  1. http://romfs.sourceforge.net/
  2. Kernel /Documentation/filesystems

2013年11月1日 星期五

ATtiny


ATtinypinIOinstsregistersFlashSRAMEEPROMPeripheralHardware
ATtiny4/9645416x8512/1024320PWMhttp://hackaday.com/tag/attiny9/
ATtiny5/10PWM, ADChttp://hackaday.com/tag/attiny10/
ATtiny13
ATinty13A
8612032x81K6464PWM, ADChttp://hackaday.com/tag/attiny13/
ATtiny25
ATtiny45
ATtiny85
2/4/8K128/256/512PWM, ADC, USIi2c-tiny-usb
Digispark
ATtiny24
ATtiny44
ATtiny84
1412PWM, ADC, USI, Temperaturehttp://hackaday.com/tag/attiny24/
http://hackaday.com/tag/attiny44/
http://hackaday.com/tag/attiny84/
ATtiny2011216x82K1280PWM, ADC, SPI, TWIPWM
ATtiny2313201812032x82K128128PWM, ADC, USI, USARTUSBtinyISP


SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...