pretty code

2019年10月31日 星期四

rename function in C Spec

原本以為 rename function 是 UEFI 自己寫的非標準函數,沒想到我從 C11、C99,一路查回到 C90,這個 function 老早就存在了,其宣告如下:

Synopsis 
#include <stdio.h>
int rename(const char *old, const char *new)

Description
The rename function causes the file whose name is the string pointed to by old to be henceforth known by the name given by the string pointed to by new. The file named old is no longer accessible by that name It a tile named by the string pointed to by new exists prior to the call to the rename function, the behavior is implementation-defined.

Returns
The rename function returns zero if the operation succeeds. nonzero if it fails, in which case if the tile existed previously it is still known by its original name.

Ansible 簡介

Ansible 是一個 IT 自動化的工具,可以幫忙管理遠端機器,啟動服務等。

被管理端就是我們要管理的機器,可以是 Linux or Windows ( 需要 PowerShell )。
管理端就是我們執行管理的作業環境,可以是任何機器 ( Windows 不支援 )。

由於 Ansible 大部份都是用來管理 Linux 機器,而 Ansible 是透過 SSH 協定和 Python 來執行指令,故被視為 agentless 的架構 ( Linux 已內建相關軟體 )。

數億張醫療影像在網路上曝光

德國漏洞分析暨管理公司Greenbone Networks在本周公布一項研究報告,指出有大量的醫療影像儲存系統(Picture Archiving and Communication System,PACS)配置不當,而讓數億張的醫療影像在網路上曝光。

今天偶然看到這篇新聞,感覺裡面的名詞好熟悉,還好不是我前前前公司有問題。

PACS 系統主要的功能是用來儲存數位醫療影像,故可能有 2 種應用:
1. 提供醫療儀器將做好的檢查影像上傳儲存的功能。
2. 提供後續醫生觀看影像或打報告用。

DICOM 格式只是一種類似樹狀結構的 Binary 資料,故以 C 語言來說,只要定好 structure 便可以很容易的 parsing。以前練習寫過 Dump Tool,沒記錯的話,不到 1000 行就可以搞定。


至於 DICOMDIR 就是一連串 DICOM 的索引,可能包括某科室歷次檢查的影像或是你在這家醫院全部做過的檢查。

不過如果是 Viewer 的應用就比較困難,自己來寫會是個大工程。

有 Open Source 可以參考的是 vtk-dicom。

http://dgobbi.github.io/vtk-dicom/

2019年10月26日 星期六

寶工 SS-969 熱風槍入手

想了好久,還是下手了這台機器,這大概是我有史以來買東西考慮最久的一次吧。

昨晚第一次嘗試移除電容失敗(250 - 300度),後來不死心的又看了一下 Youtube 維修相關視頻,發現可以使用白紙法來確認熱風槍溫度,便決定今天繼續來嘗試,確保我買的熱風槍沒有問題,當然如果有可以測量溫度的儀器就不用這麼麻煩了。

這個技巧是當熱風槍設定 300 或 380 度時,拿熱風槍去吹白紙約 3 秒鐘,應該可以看到燒焦的痕跡,大概是下面的感覺。


另外,我也查了一下快克2008熱風槍的規格,我買的功率也跟快克一樣,同樣為 700 W,沒道理我無法移除電容!

於是我今天吃完早餐後又開始嘗試,但這次我使用的溫度是 380 度,只要連續吹不到 10 秒,真的可以順利移除電容,但這個溫度要小心,排線底座都被我燒熔了。


以我常看的温州艾奥科技維修視頻為例,板主有提到他的習慣是使用 500 度吹 10 秒,我想這個溫度應該是因人而異,但是我想不通的是不管是熱風槍還是烙鐵,至少都是用 250 度以上的溫度工作,晶片或元件的耐熱應該沒到那麼高吧?以 RK3288 CPU 來說,就我從 datasheet 看到的應該也不能超過 125 度,不過 PMIC RK818 的 datasheet 就有提到焊接時不能超過 300 度


很不幸的是移除完我所有懷疑的電容後,Note Lite 主板依舊短路,但我終究已經完成我想做的事,這下可以好好看書了,為了這台爛機器,我都沒有好好地跟我的 mooInk Pro 培養感情。

底下是今天的戰果,除了移除我懷疑的電容外,反正還是短路,就順便熟悉一下熱風槍手感,當然移除這些也還是短路就是。另外,在最大顆的電容中隨意選取 2 顆,量測的結果都為 20 uF 左右。 


寶工 SS-969 熱風槍,讚喔。


特別感謝温州艾奥科技的相關視頻,讓我擁有使用熱風槍的能力。


後記

1. 雖然熱風槍出風口溫度很高,但 380 度的溫度以及距離出風口大於 15 公分,是不用擔心吹出來的熱風會燙到手。
2. 如果可以,還是要買隔熱墊,比較能保護桌子。

2019年10月22日 星期二

Use 64 bit offset in fseek function

fseek 的 offset 在 C Spec 中是 32 bit 的長度,由於現在的硬碟都很大,加上 GPT 有關 LBA 的欄位都是 8 個 Byte,當存取較後面的 Sector 時,勢必無法使用 fseek 這類的標準 C 函式庫,故我在撰寫 WinGPT 時,一開始使用的是 Win32 API。

後來查了一下資料,GCC 類的 compiler 有一個 fseeko 的函數可用,其宣告是在 stdio.h 裡,在 Windows 下不論是使用 TDM-GCC or MinGW 都可以直接使用,但在 Ubuntu 下,我們需定義一個 macro _LARGEFILE_SOURCE,記得要在 include 其他 header 時先定義。

https://github.com/tylpk1216/WinGPT/blob/master/WinGPT.c

另外在查資料時,發現到 2 件事:

1. printf%ll 在 TDM-GCC or MinGW 編譯時,如果有設 -Wall,會有 "warning: unknown conversion type character 'l' in format" 之類的錯誤訊息,那是因為這些 compiler 底層呼叫的仍是 Windows Runtime( msvcrt-DLL ),由於它不相容 C99 標準,故會有此 warning。

解決方式: 使用 %I64

2. 可以使用 "__linux__" 區分是 Ubuntu or Windows 環境,不需使用 -D 選項就可以寫出漂亮的 code。

2019年10月18日 星期五

GPT Table 解析小工具

由於 Windows 會隱藏某些分割區資訊,故使用磁碟管理工具無法看到全部的分割區。

在 Linux 下有好用的 GParted 可以用,或者也可以直接用 dd command 來 dump。

如果不想安裝額外的工具,可以使用這個小工具來觀看分割區資訊。

https://github.com/tylpk1216/WinGPT


unsigned long long 使用 printf 顯示不正常

一直以來都習慣 build 32bit 的執行檔

今天在印 GPT Table 時才發現
要 build 64bit 才會正確

有機會再來查一下 C Spec

AS SSD Benchmark 4K 顯示數字計算

網路上都推薦使用 AS SSD Benchmark 來看 SSD 是否有 4K 對齊,由於每個人的容量及分割區都不同,故看到的結果也不同,但重點是有顯示 ok 即可。

好奇查了一下 4K 對齊的原理,便知道這個數字的算法了。

首先,我們先了解何謂 4K 對齊,新式機械硬碟的存取都是以磁區﹝Sector﹞來操作,一個磁區為 512 Byte,而 SSD 的磁區是  4K 也就是 4096 Byte,故 SSD 在切分割區時,如果分割區的開始磁區可以被 4K 整除,我們就說它有 4K 對齊

4K 對齊的好處是資料不會跨磁區,而我們知道 SSD 的寫入有壽命限制,故沒有 4K 對齊容易讓 SSD 對磁區的寫入次數被 double,間接的也影響 SSD 的壽命。

有了這些知識後,再配合解析 GPT Partition Header,我們就可以知道 AS SSD Benchmark 的數字如何計算了。

我們先來看使用 Renee Becca 轉移 Win7 後的 SSD 使用狀況,AS SSD Benchmark 顯示的是 234496K。


接著我們來看 SSD 的 GPT Partition Header,付費的 Renee Beeca 在轉移 Win7 時,自動幫我們切了 3 個分割區且做 4K 對齊


從上面我們可以看到共有 3 個分割區 ( little endian ):

1. EFI 開機槽 - 起始磁區為 0x000800。
2. MS 隱藏槽 - 起始磁區為 0x032800。
3. C槽系統槽 - 起始磁區為 0x072800。

ASD SSD Benchmark 顯示的 234496K 也就是 C 槽以 Byte 觀點來看的起始磁區位置

0x072800 x 512 / 1024 = 234,496 K

2019年10月15日 星期二

GCP VM 價錢試算

使用預先保留個體,OS 使用 free Ubuntu,價格看來還行。

US 5.62 x 32 x 1.015 = NT $183


轉移 Win7 到小容量 SSD 硬碟

找了老半天都沒有完整解答,大部分的答案都是將 C 槽以外槽的已用空間縮小到新硬碟的容量內,之後在利用 EaseUS Todo Backup 工具做整顆硬碟 clone,讓 tool 自行調整各槽的大小。

但實情是資料槽東西太多幾乎沒辦法調整,如果備份到外接硬碟所需時間又太久,故最好的方法還是只 clone 系統槽就好。

底下是我用的方法與工具,紀錄一下過程。

1. 使用 Ubuntu ISO 做開機碟並開機,比照原始硬碟切出一樣的分割區,Win7˙會有 3 個分割區,有一個是 Windows 硬碟管理看不到的。
2. 將 SSD 接上主機板,回到 Win7 使用 EaseUS Todo Backup 各別 clone 這 3 個分割區(原本使用 CloneZilla 會失敗)。
3. 用 rufus 做開機碟,來源使用 Win7 ISO
4. 拔掉舊硬碟,將新 SSD 接到舊硬碟的 SATA port,使用 Win7 開機碟並修復開機磁區。
5. 使用新 SSD 開機,進去系統後會說找到新硬體並重開機。
6. 關機後接上舊硬碟,進去系統後使用硬碟管理工具,將舊硬碟的 C 槽隱藏並將原資料碟的代號設置回來。
美光 MX500 500GB SSD 跑分
後記
雖然有成功,但我遇到 3 個問題:
1. 中文輸入法打不出中文 -> 安裝新酷音解決。
2. 某些指令無法直接在批次檔使用,如 "netsh"。
3. 開始的搜尋程式及檔案輸入框,輸入程式會找不到,例如 "notepad"。

反正不影響使用,故不管它。

2019/10/16 更新
下面這套似乎也可以自動處理容量問題,有機會再試。
https://www.reneelab.net/migrate-win-7-to-ssd.html

2019/10/17 更新
今天試用 Renee Becca 才發現只轉移系統槽功能需要付費才能使用,標準版價錢為 US 23.61,這個價錢不貴,乾脆買套來玩玩。

1. 我舊硬碟 C 槽為 200G,測試移轉 1%約要快一分鐘,速度比 EasyUS 快。
2. Renee Becca 會自動切 3 個分割區,並做 4K 對齊
3. 我的新 SSD 是 500G,但 Renee 仍然將 C 槽切成 200G,只要確定系統有轉移成功,可以利用 Win7 硬碟管理工具再合併。
4. 之前遇到的問題,一個都不剩了,果然花錢的還是最棒。

2019年10月8日 星期二

Long loading time of Python module in EDK2 BIOS

There are some thoughts for debug later.

Entry:AppPkg\Applications\Python\PyMod-2.7.2\Modules\main.c -> Py_Main.
Import Entry:AppPkg\Applications\Python\PyMod-2.7.2\Python\import.c -> _PyImport_Init.

Todo

1. include stdio.h
2. Add timestamp in _PyImport_Init function.
3. PyMod-2.7 or Python-2.7.2? Use both two folders.
PyMod-2.7 is right location, we can confirm it by reading "PythonCore.inf" file.

Hint

The importing time is double?﹝傳說中的油漆工演算法?﹞


2019/10/14 更新

After inserting timestamp, we can confirm the problem is in "run_mod" function("Python\Python-2.7.2\pythonrun.c -> PyRun_FileExFlags function"). Unless we prepare to understand python completely, we can't do anything now.

2019年10月3日 星期四

固定版面 EPUB 書籍圖片順序解碼小技巧

昨天在轉某本書時,發現圖片編號有帶英文字母,一時沒想那麼多,故用我以為的順序來轉,沒想到轉出來的 PDF 圖片順序很怪,稍微研究了一下,大概知道發生什麼事了。

我猜原始出版時的電子檔是從 PDF 轉圖片再轉成 EPUB,這個過程可能是 Tool 自動產生,因此其圖片編號是使用 16 進位,想通了這一點,稍微調整了一下順序,果然整本書就對了。