2013年7月21日 星期日

Asterisk channel indications for transferee

撥通後,被轉接 (Blind transfer 或 Attended transfer),從 channel .indicate 收到的 indicatations
  1. RINGING (3):遠端振鈴,該聽到 ringback tone
  2. -1:遠端接通,該停止 ringback tone
  3. SRCUPDATE (20)
  4. 數個 SRCUPDATE 加上 HOLD (16):遠端進行 Attended transfer,該聽到 Music on hold
  5. UNHOLD (17)、RINGING (3):遠端振鈴,持續 Music on hold 或變為 ringback tone
  6. SRCCHANGE (26)、CONNECTED_LINE (22):轉接完成,停止 Music on hold 或 ringback tone
  7. SRCUPDATE (20)

2013年7月16日 星期二

一篇 awk 文章筆記

如何在 Linux 與 GnuCash 上使用 Awk 進行文字搜尋與排序

筆記:awk
  • 處理文字檔案的命令檔語言
  • 將檔案中的每一行視為個別的記錄,一行中的每一個項目則是個別的欄位。
  • 對每一行都會套用一個「樣式{動作}」,如果符合樣式,就執行指定的動作。如果沒有樣式,表示對每一行都執行該項動作;如果沒有動作,表示要顯示符合樣式的行。
  • 經典的方式是以 /etc/passwd 來作說明,列出 UID 與用戶名稱
    • $ awk -F":" '{ print $3 " " $1 }' /etc/passwd 
    • -F 用來定義欄位分隔字元,預設是 tab 或空白
    • $0 代表整行,$3 是第三個欄位 UID,$1 是第一個欄位用戶名稱
  • 搜尋文字,顯示區塊 (grep 難以作到)
    • 語法:awk '/開始樣式/,/結束樣式/'
    • 從完整 lspci 輸出中找出特定設備
      • $ lspci -v | awk '/VGA/,/^$/'
      • /^$/ 會找出文字區塊間的空白行
  • 截取不重複記錄並儲存在新的檔案中 
    • $ awk '!x[$0]++' filewithdupes > newfile
  • 要對正規表示式有不錯的理解,作者推薦 Mastering Regular Expressions 這本書

2013年7月14日 星期日

2013年7月13日 星期六

FIVN Asterisk Management GUI

FIVN 的 Asterisk GUI 可以查看 Asterisk 設定、狀態、紀錄檔,也可以編輯 Asterisk 設定檔,適合用在資源有限、並提供 CGI 的網頁伺服器。提供 non-commercial 使用,commercial 用途則需詢問原作者。

整個 GUI 相當精簡,只有下列檔案:
  • asterisk.html:Asterisk GUI 網頁,實際上只是用來載入下列 js 檔及 css 檔,產生網頁內容。
  • asterisk.js, main.js:產生網頁的 JavaScript,並透過 AJAX 去網頁伺服器取得需要的資料或執行動作。
  • settings.js:網頁顯示設定
  • style.css, loading.gif
  • asterisk.sh:在網頁伺服器端負責執行動作的 shell script,包括取得資料、儲存檔案等。
  • readme.txt:說明檔

在網頁伺服器資源有限的環境,就要利用瀏覽器端較充足的記憶體及運算能力,使用 JavaScript 產生網頁,用 AJAX 去網頁伺服器只取得必要的資料或執行必要的動作。網頁伺服器需要支援 CGI 以便呼叫 asterisk.sh,處理 AJAX 的 HTTP POST 請求,會有 action 參數指示要執行什麼動作,而可能需要其它額外參數,包括 command (Asterisk 指令)、file (Asterisk 設定檔檔名)、content (檔案內容)。

雖然只是個精簡的 GUI,Asterisk 的設定需要透過直接編輯 Asterisk 設定檔完成,但可作為不錯的參考。

關於 CGI (Common Gateway Interface):
  • CGI 是網頁伺服器呼叫外部程式的界面,有點像是副程式。網頁伺服器判斷瀏覽器要請求的網址是 CGI 程式時,就會將請求的參數存在環境變數後去呼叫 CGI 程式,並將請求的內容透過標準輸入傳給 CGI 程式。網頁伺服器會將 CGI 程式執行結束的回傳資料 (標準輸出) 傳給瀏覽器。
  • 網頁伺服器需要靠 CGI 程式產生動態資料 (未必是 HTML 網頁,例如給 JavaScript 的資料為未必是 HTML 格式),不然只能取到靜態資料。
  • CGI 程式可以用任何支援的程式語言撰寫,只要能接收輸入並回傳結果。
  • 可能會有安全問題。
  • 一個 CGI 介紹及範例:http://ind.ntou.edu.tw/~dada/cgi/

2013年7月12日 星期五

Digispark

Digispark 是基於 Attiny85 微控器的 USB 發展板,類似 Arduino,但較便宜、較小、較省電,可使用 Arduino IDE。使用軟體 USB,主機需要安裝 Digispark USB driver,而不是使用一般的 USB to serial 驅動程式。8 KB flash 中 bootloader 佔 2KB,另外有 512B RAM、512B EEPROM。

電源可來自 USB 或外接 5V,或者外接 7~35V 透過板上的 regulator 轉換。Attiny85 只有 8 根接腳,除了 5V 跟 GND 外,有 6 I/O 接腳:
  • 2 for USB 燒錄程式用,之後可作為 I/O
  • I²C and SPI (via USI)
  • PWM on 3 pins
  • ADC on 4 pins
相關文章

2013年7月9日 星期二

lua interpreter

指令 lua 是 Lua 直譯器 (interpreter),可執行文字檔或 bytecode 格式的 Lua 命令檔,也可以用在互動模式。

指令格式:

lua 首先會執行環境變數 LUA_INIT 的內容,LUA_INIT 也可以是「@filename」格式,會去執行 filename 的內容。

script 是 Lua 命令檔,整個指令行每個欄位會變成執行 script 時,名為「arg」的全域表格,其中
  • arg[0]:是 script
  • arg[1] 開始分別是每一個 args,每個 args 如果有空格或其它 shell 特殊字元,則需要加 quoted。shell 會移除這些 quotes。
  • #arg:args 的數目,也等於最後 argument 的 index
  • arg 負的 index 包括 script 前面的指令行,一直到 interpreter 名稱。
範例:
編輯 hello.lua,內容如下:(說明:print("印出的字串"),用「..」結合字串)
# this line ignored
print("number args:"..#arg)
print("arg[-2]:"..arg[-2])
print("arg[-1]:"..arg[-1])
print("arg[0]:"..arg[0])
print("arg[1]:"..arg[1])
print("arg[2]:"..arg[2])
print("arg[3]:"..arg[3])
在 shell 執行指令
LUA_INIT='print("LUA_INIT first")' lua -v arg.lua Hello Word "last arg"
其輸出如下:
LUA_INIT first
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
number args:3
arg[-2]:lua
arg[-1]:-v
arg[0]:arg.lua
arg[1]:Hello
arg[2]:Word
arg[3]:last arg
可看出 lua 先執行 LUA_INIT,然後選項 -v 顯示版本訊息,最後才是執行 arg.lua 的結果,印出 args 數目及所有 args,其中 last arg 中間有空格,所以需要用 quote。

script 檔案的第一行如果是「#」開頭,會忽略。如果寫成「#!/usr/bin/lua -v」,在 Linux 檔案就可以直接執行。

指令「luac arg.lua」會將 arg.lua 編譯成二進位的 lua bytecode 程式 luac.out,用法跟 arg.lua 一樣,只是加速 lua 載入時間,不用再編譯成 bytecode。bytecode 檔並不表示執行較快,或檔案較小。

指令「lua -e stat」直接執行 lua statement stat。例如「lua -e 'print("Hello Word")'」

指令「lua -」執行來自 stdin 的 lua 程式,例如「echo 'print("Hello Word")' | lua -」

lua option「-l name」用來載入 library,相當於呼叫 require('name') 。

只執行指令「lua」進入互動模式,prompt the user and execute lines from the standard input。輸入 end-of-file 字元結束,在 Linux 是 Ctrl-D, 在 DOS/Windows 是 Ctrl-Z (Ctrl-Z 在 Linux 會讓程式進入背景執行), 或呼叫來自 os library 的 os.exit()。
  • lines are read until a complete statement is formed or a syntax error is found 
  • 一種中斷不完整的 statement,強迫 syntax error 的方式是輸入「;」。
  • If a line starts with '=', then lua displays the values of all the expressions in the remainder of the line. The expressions must be separated by commas.
  • The default prompts are "> " and ">> ". The global variables _PROMPT and _PROMPT2 can change the prompts.
「lua -i script」在執行完 script 也會進入互動模式

References
  1. man lua
  2. man luac
  3. 本站 Lua 相關文章

SIP header Via

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