顯示具有 Lua & Luci 標籤的文章。 顯示所有文章
顯示具有 Lua & Luci 標籤的文章。 顯示所有文章

2012年3月3日 星期六

IE8無法下載檔案


話說有一天,我用Luci寫一段download動態產生的檔案時,發生部分的IE8下載有問題,都會產生無法下載的訊息,當然就是立刻請問google大神,尋得此文章[PHP]下載檔案時無法直接開啟文件的解法方法,雖然是用PHP寫,不過小改一下就可以在Luci上面如法炮製啦。

[PHP]下載檔案時無法直接開啟文件的解法方法
header("Content-Type: application/octetstream; name=$FILEname"); //for IE & Opera
header("Content-Type: application/octet-stream; name=$FILEname"); //for the rest
header("Content-Disposition: attachment; filename=$FILEname;");
header("Content-Transfer-Encoding: binary");
header("Cache-Control: cache, must-revalidate");
header("Pragma: public");
header("Expires: 0");


Luci不過就是改呼叫luci.http.header()。
[Luci]下載檔案時無法直接開啟文件的解法方法
luci.http.header("Content-Type", "application/octetstream; name=" .. fname); //for IE & Opera
luci.http.header("Content-Type", "application/octet-stream; name=" .. fname); //for the rest
luci.http.header("Content-Disposition", "attachment; filename=" .. fname);
luci.http.header("Content-Transfer-Encoding", "binary");
luci.http.header("Cache-Control", "cache, must-revalidate");
luci.http.header("Pragma", "public");
luci.http.header("Expires", "0");




2011年9月18日 星期日

[Lua Note] 2 - Types and Values


Types and Values

Lua的變數型態完全取決於assign的值,而Lua有8個基本資料型態nil、boolean、number、string、userdata、function、thread和 table等。
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print(type(a))
nil
> a="hello"
> print(type(a))
string
> a=3*5
> print(type(a))
number
> a=function() end
> print(type(a))
function
> a=true
> print(type(a))
boolean


nil

nil和C/Java Script的null意思差不多,當宣告一個變數還沒有給值,預設值就是nil,而當給變數nil就相當於delete這個變數。
> x = {}
> x["y"] = 1
> for k,v in pairs(x) do
>> print(k,v)
>> end
y       1
> x["y"] = nil -- 將y自x中移除
> for k,v in pairs(x) do
>> print(k,v)
>> end
> -- 沒有印出y了


booleans

說到boolean大家應該都知道boolean只有兩種值,true/false,在lua中,除了nil和false是false以外,其他都是true。not則是反轉boolean。
> print(x)
nil
> print(not not x)
false
> x=0
> print(not not x)
true -- 和C不同唷
> x=false
> print(not not x)
false
> x = function() end
> print(not not x)
true


numbers

Lua中沒有整數(integer),數值(numbers)是用雙精度儲存(double-precision floating-point)。


strings

Lua中的字串是儲存8-bit的字元,所以您可以儲存任何的資訊,和C不同的地方是C用null-terminated("\0"當結數符號),而Lua會用length紀錄字串長度。
當Lua中的字串是不能改變的,一旦改變就等同重新建立一個新字串,這點和C也不同。
Lua的字串除了可以用雙引號和單引號表示外,還可以用 [[...]]表示。
> s1="test1"
> s2='test2'
> s3=[[
>> test1
>> test2
>> ]]
> print(type(s3))
string
> print(s3)
test1
test2

Lua中字串可以用..串接在一起。
和JavaScript一樣,Lua在字串和數字之間的數學運算會試著將字串轉成數字,轉失敗就會出現error。
> print(10 .. "1")
101
> print(10 + "1")
11
> print(10 .. "x")
10x
> print(10 + "x")
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: ?


table

table也稱為associative arrays,key可以是任何的資料型態,除了nil以外,都可以當key(或稱index),而任何其值可以是任何的資料型態,其表示法和一般C的array類似都是用"[]"來取值。
> x = {
[1] = "one",
["2"] = "two",
[3.0] = "three",
}
> print(x[1])
one
> print(x["2"]); print(x[3.0])
two
three



2011年9月17日 星期六

[Lua Note] 1 - Getting Started


Chunks

Lua就和一般的Script一樣,沒有所謂的main function,也不需要分號";"'當成一個statement的結束,分號可有可無,不過我還是習慣性的加上去,就像數學運算式的括號,很可能你想的和你寫出來的意思不同,導致錯誤,以下的範例都是一樣的意思
 
    a = 1
    b = a*2
    
    a = 1;
    b = a*2;
    
    a = 1 ; b = a*2
    
    -- "--"是註解的意思
    a = 1   b = a*2    -- 很醜,但還是合法

您可以在提示符號下執行lua,lua [ options ] [ script [ args ] ]
prompt> lua 會進入interactive 模式。
prompt> lua -la -lb會執行a.lua和b.lua,-l相當於require的意思,lua就像一般的computer language一樣,允許您寫自己的library,並且透過require載入。
lua也提供另外dofile這個function,讓您測試您寫的lua檔,dofile和require最大的不同是,require只會載入一次,而dofile可以重覆載入,所以拿來驗證lua檔就非常適合了。



Global Variables

在Lua中,沒有特別宣告local就是Global Variables,用到沒有宣告的變數,其值就是nil
 
function scope1()      -- step 4.
    function scope2()  -- step. 8
        print(A)               -- step. 9 印出A=20
        local A=30         -- step. 10又宣告一個變數A(範圍更小)
        print(A)               -- step. 11 印出該範圍的A, 即30
    end
    print(A)           -- step 5. 印出 10
    local A=20     -- step 6. 新的A=20, Global的A一樣不變
    scope2()        -- step 7.
     print(A)          -- step 12. 印出這個範圍的A = 20
end

print(A)                -- step 1. 印出 nil
A=10                   -- step 2. A=10
scope1()             -- step 3.
print(A)                -- step 13. 印出這個範圍的A = 10
os.exit()



Some Lexical Conventions

和一般的language一樣,會有所謂的key word,以下是lua的key word
while
and break do else elseif
end false for function if
in local nil not or
repeatreturn then true until

lua是case-sensitive就是有分大小寫的。 變數x和變數X是不同的。
在Lua中的註解 --是單行,像C中的//,而--[[ --]]就像C的/* */屬於多行註解。好用的地方是,只要在"--[["前面多一個"-"就等於取消整個註解,超好用。
 
--[[
    print(10)         -- no action (comment)
--]]

---[[
    print(10)         --> 10
--]]


The Stand-Alone Interpreter

lua會將command-line的參數存到陣列arg中,arg[0]存放執行的script,arg[-1]存放script檔名的前一個參數,arg[1]..arg[n]就是依序存放後面的參數。


參考資料:Programming in Lua (first edition)




2011年9月12日 星期一

Lua - Introduction


最近有幸開發新的Web Page,用的是LuCI(Lua Unified Configuration Interface),所以就得先學學Lua嚕,在這裡做些筆記,也和大家分享一下。
Lua是一種embedded language,就像Java Script一樣,通常會依附在host program底下(就像IE和Java script的關係一樣),而host program會執行Lua的程式碼,(就像網頁中參雜Java Script一樣)。不過,在寫LuCI的時候,感覺比較像在寫PHP或者ASP之類的。

Lua主用是用C寫的,原始的Lua非常的小,因為只有提供非常精簡的能力,但是可以透過擴充Library變得更強(更肥),因為精簡,所以適合在Embedded System上使用。

www.lua.org是Lua的官方網站,其中最重要的莫過於裡面的免費書籍,Programming in Lua (first edition),這本是必看的,後面的筆記應該都會是源自這邊,熟悉Lua之後,也可以看看Lua 5.1 Reference Manual
該網站還提供Web版的Lua,讓您沒有Lua也能學Lua。


如果您是在Windows環境底下,您可以安裝luaforwindows來練習,Practice Makes Perfect。