碎碎念
做你自己,其他人都已經有人做了。
— 作者:Oscar Wilde。
做你自己,其他人都已經有人做了。
— 作者:Oscar Wilde。
這輩子,沒這麼討厭a b c e d f過。
-Lambert Chen
在程式的世界裡,不同程式語言就像不同的國家,有屬於自己的語言及文法。就像Python的int,沒有定義int的範圍,要多大就多大,要正就正,要負就負。但到了C可就不同了,Unsigned int , Long , Unsigned float,每一種都有自己的邊界值。那在python中如何讓電腦看得懂不同語言,但相同的byte呢?就要依靠Struct了。
在電腦的儲存空間中,一個數值常常會被切分成4個bytes(也就是32bit),並儲存於連續的儲存空間中。每一個byte皆用16進制表示0~255(00~FF),而這些數字也像我們在用的10進制數字,會有個十百千萬,擺放的方式也些不同,有時是「萬千百十個」,有時是「個十百千萬」,這也就是電腦儲存器裡面的位元組序(Endianness)。
若電腦依照「左高右低」排序則為大端序(big-endian),反之則為小端序(little-endian)。
舉個例子 有一組數組 0x0A0B0C0D,依照端序不同有不同的儲存方式,解析時須特別注意。
| Address | big-endian | little-endian |
| 5000 | 0x0A | 0x0D |
| 5001 | 0x0B | 0x0C |
| 5002 | 0x0C | 0x0B |
| 5003 | 0x0D | 0x0A |
| Character | Byte Order | Size | Alignment |
| @ | native | native | native |
| = | native | standard | none |
| < | little-endian | standard | none |
| > | big-endian | standard | none |
| ! | network (= big-endian) | standard | none |
在Python 中使用 Struct模組時,也需特別留意端序的性質,一但端序搞混了,數值可是天壤之別呀!
馬上來看看Python如何將這些Hex透過Struct做解析吧
Python提供了三種最常使用的方式來做Pack,Unpack。
import Struct
struct.pack(format,v1,v2) #將python元件打包成binary package
struct.unpack(format,buffer) #將binary package轉成python元件
struct.calcsize(*format) #依照format來計算需多少byte e.g. struct.calcsize('2I3s')

這邊用簡單的Float,Hex互換來說明一下Pack及Unpack。
設定兩個數值 (Float:25.5 Hex:0x41cc0000),端序為小端序。
透過struct.pack()將數值打包成binary package,接著再使用struct.unpack()將binary package轉換回python 字串。
import struct
def float_to_hex(Float_num):
Float_num = float(Float_num)
return hex(struct.unpack('<I',struct.pack('<f',Float_num))[0]) #'<' little endian, 'f' 4 bytes float
def hex_to_float(Hex_num):
return float(struct.unpack('<f',struct.pack('<I',Hex_num))[0]) #'<' little endian, 'I' 4 bytes unsigned int
print(float_to_hex(25.5))
print(hex_to_float(0x41cc0000))
以上就是Python對於binary package的常用處理方法,對於IoT專業人員,看到這些data就是要準備和他作戰,binary的東西只要任何一點疏忽,所換來的結果可是不容小覷的,處理binary講求謹慎,Struct Module提供了更多處理binary package的function,小弟拋磚引玉,歡迎大家討論分享~
https://docs.python.org/3/library/struct.html
https://sanyuesha.com/2018/03/10/why-pack-unpack/
https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F
懶骨頭的Lambert最愛用Aliases建立別名啦,不僅操作Git起來少打了很多字,
更有了一種(恩~這是我專屬的Git Command呢)的優越感。
還在常常checkout、status、commit -m、log –oneline 的你還不趕快來用別
名建立自己專屬的Git Command嗎?
很簡單,只要在CMD下Git的config即可,趕快開始做吧。
git config --global alias.co checkout
#使用git config --global設定
#alias.co checkout ( alias.<別名> <被取別名的Command> )
設定好之後呢,就可以使用git co來產生git check out 的功能了。
當然,較為複雜的Command也可以用別名取代!
git config --global alias.last "log -1 HEAD"
#alias.last "log -1 HEAD" ( alias.<別名> "<一串的Command>")
設定完畢之後,就不用辛辛苦苦地打git log -1 HEAD啦~
只要打上git last,Git就自動幫你秀出最後一筆log的HEAD了。
真的省了不少時間呢!
簡單好用的Alias,輕鬆就可以使用,趕快客製化自己的Git command吧
有甚麼覺得好用的別名方式,或是有甚麼問題,也歡迎留言分享討論~
在網頁UI刻劃完畢,API串上後,正式上線前的必經關卡就是效能壓力測試了,
Jmeter可以輕鬆的錄製腳本,模擬虛擬用戶使用網站的情況,
便於開發人員即時反應並且處理問題,更了解正式上線前軟硬體須調整的部分,
可說是測試內不可或缺的一環。
新版本於4.0後移除了工作台的項目,故操作起來有些許的改變,以下步驟說明如何以Jmeter建立網頁錄製腳本。

Create後進行Template設定,設定hostToRecord及schemeToRecord
HostToRecord: http://www.google.com(錄製google為範例)
SchemeToRecord: https

進入瀏覽器的進階設定頁面>連線設定 設定Proxy
將手動設定Proxy(打勾),
HTTP Proxy: localhost Port: 8888
符合Jmeter內的設定,若Port被用走需修改為其他的Port

由於代理伺服器為localhost需安全性憑證來確保連線安全,Jmeter含有憑證可匯入。
Jmeter憑證存放於Jmeter安裝目錄(.\apache-jmeter-5.2.1\bin)
若搜尋不到憑證可先按一次錄製的Start按鈕(第五步驟)


先點選HTTP(S) Test Script Record(代理伺服器),設定好Target Controller(錄製到哪裡去)
點選Start即可錄製

按下Start後,會出現Jmeter憑證通知,點選OK即可。
之後出現的小方框代表Jmeter正在紀錄目標網站的操作過程。便可以開始操作網站錄製腳本。

錄製結果將產生於Thread Group > Recording Controller下
你做了多少動作Jmeter就會幫你記錄下來
也可以進去調整你送出的API Param

以上就是小弟如何透過Jmeter提供的代理伺服器錄製網頁腳本的過程,若瀏覽者有更好的方法,或是任何問題,都可以在下方留言一起討論討論~