pretty code

2018年12月27日 星期四

孩子的學習不能等

在考慮了快一個月之後,我還是下訂了 Kindle Oasis 2。

可惜的是想買的保護套都沒有運送台灣。

運費被收了 USD 20.98,關稅被預收了 USD 14.68。

換算下來大約要 NTD 9600,似乎也沒有比網拍便宜到哪。

但是孩子的學習不能等呀XD


2018年12月26日 星期三

ImportError when using pyinstaller to package up wxPython

如果是使用 Python 3.7
Pyinstaller with wxPython 會出現 wx._core import error

試著改用 Python 3.6 即可

底下是我測試能用的版本

Python 3.6.8 32 bit
PyInstaller 3.4
wxPython 4.0.3

2018年12月19日 星期三

MicroPython on UEFI

MicroPython 是一個 Python3 的子集
其目的是用在 microcontrollers 上或是一些受限制的系統
但並不支援所有的語法

MicroPython differences from CPython

tianocore porting MicroPython 目的是用來取代之前 porting 的 Python 2.7
原因是之前 porting 的效能較不好
也不能存取一些 UEFI Services or hardwares

目前專案位於以下路徑
https://github.com/tianocore/edk2-staging/tree/MicroPythonTestFramework/MicroPythonPkg

如果這個東西的成熟度夠高
應該會適合拿來撰寫 UEFI Application
畢竟整套環境是想用來當作 TestFrameWork 用的


2018年12月14日 星期五

UEFI Application - Stack overflow

最近在幫同事看一個問題
覺得很有趣,故記錄一下解題思路

同事在 build code 時,發現一個 link error
正在產生程式碼
已完成程式碼產生
UefiApplicationEntryPoint.lib(ApplicationEntryPoint.obj) : 
error LNK2001: 無法解析的外部符號 __chkstk

網路查了一下,是因為 VC compiler 檢查到某些 function  有 stack 問題時
便會在 code 中插入 __chkstk 這個 check function

網路看到的解法都是放大 stack size
可以在 INF 檔案編譯選項中加入 /GsXXXXX
但據實測的結果是一點用處都沒有
stack size 還是維持在 32K 左右

後來試著在 INF 檔案編譯選項中加入 /FAcs 選項
此選項會產生 assembly 檔案
副檔名為 .cod

接著在 UDK\Build\程式路徑中
用 grep 搜尋 __chkstk 關鍵字
便可以看到是那個 function 被插入了 __chkstk

底下是我模擬的結果
很明顯的看到 rsp register 被保留了 32776 這麼大的空間(char LocalVar[32768])
當然會造成 stack overflow



2018年12月12日 星期三

Python 正規表示式用法

Python 在使用 re 時
記得 pattern 要包含其他需要的字串(.*)

舉例來說
我想尋找每行有 "ERROR " 字眼的字串
re pattern 要寫成 "ERROR .*"
否則找到的都會只有 "ERROR " 本身

底下是針對規則的進階用法
把想要特別提出來的寫成如下形式
(?P<name>正規表示式)

就可以更方便的找出對應的資料


import re

ERROR_PATTERN = 'ERROR.*Test: (?P<TEST>[0-9]+).*Address: (?P<ADDR>[0-9A-F]+)'

errMsg = '''
2068-09-12 22:06:48 - [MEM ERROR - Data] Test: 6, CPU: 1, Address: 101B8F330, Expected: FFFF5FFF, Actual: FFFFDFFF
2068-09-12 22:06:48 - [MEM ERROR - Data] Test: 6, CPU: 1, Address: 103B8F310, Expected: FFFF5FFF, Actual: FFFFDFFF
2068-09-12 22:06:50 - [MEM ERROR - Data] Test: 6, CPU: 3, Address: 119FEA5F0, Expected: FFFF7FDF, Actual: FFFFFFDF
2068-09-12 22:06:50 - [MEM ERROR - Data] Test: 6, CPU: 3, Address: 11BFEA5D0, Expected: FFFF7FDF, Actual: FFFFFFDF
2068-09-12 22:20:53 - [MEM ERROR - Data] Test: 6, CPU: 2, Address: 10466E930, Expected: FFFF7FEF, Actual: FFFFFFEF
2068-09-12 22:20:53 - [MEM ERROR - Data] Test: 6, CPU: 2, Address: 10666E910, Expected: FFFF7FEF, Actual: FFFFFFEF
2068-09-12 22:20:53 - [MEM ERROR - Data] Test: 6, CPU: 0, Address: 10D6CC9B0, Expected: FFFF7EFF, Actual: FFFFFEFF
2068-09-12 22:20:53 - [MEM ERROR - Data] Test: 6, CPU: 0, Address: 10F6CC990, Expected: FFFF7EFF, Actual: FFFFFEFF
'''

res = re.findall(ERROR_PATTERN, errMsg)

print(res)


輸出結果
[
    ('6', '101B8F330'), 
    ('6', '103B8F310'), 
    ('6', '119FEA5F0'), 
    ('6', '11BFEA5D0'), 
    ('6', '10466E930'), 
    ('6', '10666E910'), 
    ('6', '10D6CC9B0'), 
    ('6', '10F6CC990')
]

2018年12月11日 星期二

GoBus

程式碼

剛來這家公司時
為了早日了解專案順便吃便當
常常看 code 看到忘了時間
於是便有了這支小程式的誕生

此程式的原理是去 parse 公車網站
並顯示出還有多久公車會來
程式寫好後,便設定工作排程器固定時間執行
時間一到程式會顯示在右下角
這樣一來就不會忘記回家了

因為只是支小程式
故並未使用 Thread 只是偷懶使用 Timer
當遇到網路連線太久時,UI 便會無回應(顯示空白)
不過目前夠用就好

2018年12月7日 星期五

Single Python executable binary on Windows

I used "PyInstaller" and I used these parameters to build it

"pyinstaller -D -F -w main.py"

My "main.py" is a "wxPython" project and it works well.

Caution: If you use Python 3.7, you will encounter wx._core import error. You can use Python 3.6 to fix this error.

第一支 UEFI Application - Python code

最近有一個需求

希望使用者設定完參數後
可以連續做一定次數的測試
其目的是希望測試結果的穩定性

平常我們初始化測試都是透過 Web-UI
不過骨子裡其實也是走 HTTP Web API 模式
故在 UEFI 下使用 C 寫並不是太困難

由於還有 download 測試報告
並做一些 disk 資料夾的備份等工作
我最後還是決定使用 Python 來撰寫

不得不說
使用 Python 開發真是飛快
我先在 Windows 下寫好花不到半天
遇到不會的就用關鍵字 google

不過實際跑在 UEFI Shell 上
才發現會遇到一些坑

幸好我的程式每個功能都是 function
只要修改幾個 function 即可
但前提在測試時,不要一次跑完
不然根本不知道程式那邊出錯

目前已知問題有
1. os.rename 會使得原始檔案不見
2. copy_threee 也有同樣的問題
3. 點開頭的檔案在使用 Shell command cp 時會有問題

雖然說來輕鬆
但我可是加了 2 小時班
如果 Python on Windows 我給 90 分
Python on UEFI 我只會給 55 分