從sysbench中學習Lua

2021-09-22 19:25:03 字數 4506 閱讀 4651

我做事喜歡結果導向,喜歡快速迭代,能10分鐘搞定,絕對不願意花15分鐘。但是技術行當,還是得耐得住寂寞,因為很多事情10分鐘搞不定,可能100分鐘,1000分鐘也搞不定,但是不代表我們真搞不定,需要花一些時間,花一些額外的代價來補課。水到渠成的時候,自己也得到了成長。

對於sysbench也是如此,裡面用到了大量的lua模板,而且lua模板是sysbench壓測的必備選項,所以我們要更好的理解它的實現邏輯,如果可以根據自己的需求來定製它的實現,使得符合真實業務,這種基準測試會更有意義。想到了這些,說幹就幹。

我們從sysbench的角度來理解lua,開始lua的學習旅程。

sysbench啟動測試的時候,會在頭部顯示如下的資訊:

sysbench 1.1.0 (using bundledluajit2.1.0-beta3)

這句話資訊量很大,我們可以慢慢分析,可以明顯看到sysbench匹配的這個lua是選用了luajit,是乙個beta版本。而如此一來,我們就需要確認兩點,乙個是lua呼叫c的方法,在這裡使用了luajit,那麼應該是使用ffi庫來呼叫c了,否則一般是使用c的lua c api這種方式。

這個資訊可以在sysbench基礎的lua檔案中看到如下的內容印證。

local ffi = require("ffi")

接著第二個問題,系統層面是預設安裝了lua,基本上是5.1以上的版本,但是luajit我們印象中是不曾安裝過。安裝sysbench的時候是否又安裝了luajit呢?我們使用find來簡單驗證一下,果然是預設安裝了。

這是這個地方的引用是sysbench在指令碼中繫結的路徑,沒有放到系統級的環境變數中。luajit裡呼叫c還是很流暢的,比如可以寫乙個簡單的指令碼,如下:

然後我們就可以暫時先來系統的學習一下lua,然後抓住要點之後再來看sysbench的**就會容易多了。

先來乙個最簡單的hello world

> print("hello world!")

hello world!

> print 'hello world'

hello world

lua中的保留字有下面的這些:

and break do else

elseif end false for

function if in local

nil not or repeat

return then true until

while

如果要新增注釋,有單行和多行,多行可以使用--[[ *** --]]的方式來標註。

> -- this is a test comment --單行注釋

> --[[ --多行注釋

>> this is a test,line 1

>> this is a test comment line 2

>> this is a test comment line 3

如果變數b沒有賦值,就會顯示為nil,我們可以基於這個方式來處理一下變數值。

> print (b)

nil

> b=10

> print b --這種命名方式是不達標的

stdin:1: '=' expected near 'b'

> print(b)

10 然後就開始逐步有難度了。

我們看看學習套路之資料型別, lua中有8個基本型別分別為:nil、boolean、number、string、userdata、function、thread和table。

要驗證還是比較容易的,使用type方法即可。

> print (type('hello world'))

string

> print (type(10+3))

number

> print (type(print))

function

> print (type(type))

function

> print (type(nil))

nil

> print (type(true))

boolean

> print (type(type(x)))

string

遍歷元組

如果有鍵值對這種形式的資料,可以通過迴圈對映的方式來返回,下面的兩個例項,邏輯看起來是一樣的,最後的輸出還是有較大的差別。

> tab1 =

> for k,v in pairs(tab1) do

>> print(k.."-"..v)

>> end

1-val3

key1-val1

key2-val2

> tab1 =

> for k,v in pairs(tab1) do

print(k.."-"..v)

end

key1-val1

key3-val3

key2-val2

關於型別轉換,是在程式中很常見的一類處理方式,數值轉換為字元型,或者字元型轉換為數字,這一點上lua的表現還不錯。

> print("2" + 6)

8 > print('2' + 6)

8 > print ("2"+"6")

8 > print ("2+6")

2+6

> print ("-2e2"*"6")

-1200

> print ("error"+1)

stdin:1: attempt to perform arithmetic on a string value

stack traceback:

stdin:1: in main chunk

[c]: ?

> print ("a".."b")

ab > print(123..456)

stdin:1: malformed number near '123..456'

> print(123 .. 456)

123456

如果要計算字元的長度,可使用len方法或者變數的方式。

> len = "www.jeanron100.com"

> print(#len)

18 > print(#"www.jeanron100.com")

18 如果要初始化table,則可以使用如下的方式:

比如宣告這樣乙個table a,然後賦值取值做資料處理,裡面比較重要的就是下標的處理了,lua的實現下標是從1開始。

> a = {}

> a["key"] = "value"

> key=10

> a[key]=100

> a[key]=a[key]+1000

> for k,v in pairs(a) do

>> print(k .. ":" .. v)

>> end

key:value

10:1100

如果要強化一下迴圈的部分,可以參考下面的例子,把fruits裡的元素都迴圈輸出。

[root@oel641 lua]# cat test1.lua

for key,val in pairs(fruits) do

print("key",key)

end

[root@oel641 lua]# lua test1.lua

key 1

key 2

key 3

還有lua中的函式,甚至支援匿名函式。

[root@oel641 lua]# cat test3.lua

function factorial1(n)

if n == 0 then

return 1

else

return n * factorial1(n-1)

end

end

print (factorial1(5))

factorial2=factorial1

print(factorial2(5))

這段**和c非常相似,但是lua裡面比較有意思,函式可以更加靈活的使用,直接通過類似賦值的方式就搞定了,輸出結果如下:

[root@oel641 lua]# lua test3.lua

120

120

大體測試了這些內容,隨後會把sysbench**裡的邏輯總結出來。

從XML中學習HTML

二初始xml 三寫在後面 請原諒我也濫竽充數了一次標題黨,xml沒有誰好與壞,雖然html是xml的先驅,但是xml卻不是要替代html的,今天把他們放到一起來討論是他們很相似,又具有不同的作用。還是乙個傳送門,自己剛接觸html寫的一點認識,希望多多拍磚斧正。為什麼要學習xml呢?xml exte...

從程式中學習EKF SLAM(二)

進入主迴圈的第乙個部分,就是儲存當前狀態下的資料。這裡順帶提一下系統裡的資料格式。首先看資料離線化儲存的方法 state temp offline data.i 0 offline data.estimate path.push back x offline data.real path.push ...

從APT攻擊中學習

可以看出apt攻擊,叫高階可持續威脅攻擊,也稱為定向威脅攻擊 什麼是定向,也就是指定目標行業而發起進攻 這邊又提到 鏈和社會工程學,那是什麼?社會工程學,也就是社工,通過觀察別人的細微變化,心理,而套話,或者其他達成目標的一種物理攻擊方式 當然你也可以理解成 但是這個比 更厲害,更有藝術感 鏈,就是...