2012年11月11日 星期日

[Lua] Global Variable


全域變數不用宣告,存取尚未有的全域變數會得到 nil (存取未初始化的變數皆會得到 nil)。
一般不需要特地刪除全域變數,但指定為 nil 就是刪除。如果想要變數的生命有個範圍, 應該使用區域變數

[Lua] local variable

在 Lua 全域變數不需要宣告,但可以宣告區域變數 (local variable),例如:
local i=1
效用到區塊結束自動消失,區塊可能是一個 control structure、一個函數、或一個 chunk。

變數使用 local 宣告是較好的,避免充斥不必要的全域變數,存取也較快。未指定初始值時是 nil

local foo=foo 可以在區塊內加速 foo 存取,修改但最後保留原值。

在互動模式下使用時要注意,除非不是完整的指令,不然每輸入一行,就是一個 chunk,下一行 local 宣告就失效了。可用 do-end 區塊延續 local 宣告。

參考:
  1. Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006

[Lua] multiple assignment


assignment (指定) 就是「變數=值」。而 multiple assignment 就是一次可以多個值指定給多個變數,多個變數跟多個值用「,」隔開。如果變數數目較多,多出來的部份指定為 nil:如果值的數目較多,多出來的部份忽略。
  • evaluate 所有值,然後才指定給變數 => 可用來做交換 (swap)
    • 例如 x 跟 y 交換:x, y = y, x
  • function 可以回傳多個值,需要 multiple assignment 才能接收多個值。

[Lua] nil

nil
  • 無或空的意思
  • 未初始化的變數會得到 nil
  • 變數指定為 nil 就是刪除
  • 在邏輯判斷上,nil 是 false

2012年11月9日 星期五

[OpenWrt] AR71xx Flash Partitions

之前提到 OpenWrt 至少要有 4 MiB Flash,例如 TL-WR703N 就用 4 MiB Flash,而 TL-WR1043ND 用 8 MiB,它們的 Flash 利用是怎樣規劃的呢?這裡是以 TP-Link 的路由器做說明:(有兩個數字的欄位,分別為 4 MiB Flash 跟 8 MiB Flash 的情形)

partitionoffsetsizesize (KiB)
u-boot
(mtd0)
0x00x20000128
firmware
(mtd5)
kernel
(mtd1)
0x200000x3D0000
0x7D0000
3904
8000
rootfs

(mtd2)

[squashfs]
/rom

rootfs_data
(mtd3)
/overlay
art
(mtd4)
0x3F0000
0x7F0000
0x1000064
  • u-boot 固定 128 KiB,其中位址 0x1FC00 為 MAC Address、0x1FE00 為 PIN
  • art 固定佔用最後的 64 KiB
  • u-boot 跟 art 之間的區域就是 firmware,其 image 由 OpenWrt 的工具程式 mktplinkfw 產生,共由 header、kernel、rootfs 三個部份組成。
    • header 固定為 512 (0x200) bytes,紀錄許多關於韌體資訊的欄位,mtd 分割併入 kernel。
    • kernel 使用剩下的就是 rootfs 空間。kernel 可使用 gzip 或 lzma 壓縮,後者使用的空間較小,讓 rootfs 有更多空間,尤其是使用 4MiB Flash 的時候。
      • 可能是 u-boot 不支援 lzma 壓縮的關係,lzma 壓縮的 kernel 其實會多一層 lzma-loader 載入,然後才能載入真正的 kernel,但整體來說使用的空間較小。例如我剛編譯的 kernel (vmlinux) 是 2,817,980 bytes,gzip 壓縮後是 1,282,951 bytes,lzma 壓縮後是 928,491 bytes。lzma-loader 4,630 bytes,但實際佔用 7,680 bytes 空間,加上 lzma kernel 為 93671,比 gzip 少了 338 KiB。
    • rootfs 使用 squashfs 唯讀檔案系統,使用剩下的空間又自動分出為 rootfs_data 分割作為可讀寫 overlay。
參考:
  1. http://wiki.openwrt.org/doc/techref/flash.layout

[Lua] boolean

boolean 是 Lua 八種基本資料型態之一,包括 false 跟 true。判斷時,false 跟 nil 為 false:其它皆為 true,數字 0 跟空字串 "" 也是 true

[Lua] string

Lua 字串 (Lua 八種基本資料型態之一)
  • 可包含任何字元,包括 \000,結尾沒有 \000。
  • 內容是不能改變的,改變需要另建新字串
  • single or double quoted
  • escape sequence
    • \a:bell
    • \b:backspace
    • \f:form feed
    • \n:換行
    • \r:carriage return
    • \t:水平跳位
    • \v:垂直跳位
    • \\:「\」
    • \":「"」
    • \':「'」
    • \數字:最多三位十進位數字,如果後面不是數字,數字開頭的 0 可省略
  • double square bracket,類似註解,可用成對的「[[」跟「]]」或「[=[」跟「]=]」(依此類推,兩邊等號數目要相等),不解釋裡面的 escape sequence,例如
    page=[[
    <html>
    <head>
    <title>An HTML Page</title>
    <head>
    <body>
    Hello World
    </body>
    </html>
    ]]

    write(page)
  • 數字運算時自動轉換成數字,明確轉換用函數 tonumber
  • 「..」字串 concatenation operator,如果前面接數字,要有空格,不然會視為小數點。明確轉為字串用函數 tostring
  • length operator:字串前面加「#」
參考:
  1. Programming in Lua (second edition) by Roberto Ierusalimschy, Lua.org, March 2006

SIP header Via

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