2019年12月27日 星期五

Fashion MNIST 資料集概述

Fashion MNIST 是 TensorFlow 官網入門影像分類範例所使用的一個資料集。

假設使用的是 python 範例,載入資料時便會自動下載,以 Windows 來說,會儲存在 C:\Users\XXX\.keras\datasets\fashion-mnist 資料夾下,共有 4 個檔案:

train-images-idx3-ubyte.gz  60,000 張的訓練資料
train-labels-idx1-ubyte.gz 60,000 張的訓練資料分類結果

另外 2 個檔案便是 10,000 張的測試資料及分類結果

以 train-images-idx3-ubyte.gz 來說,解壓縮後的檔名為 "train-images-idx3-ubyte",此為 binary 檔案,前面 16 個 Byte 是描述此 binary 檔案用,剩下的 Byte 開始每 28 x 28 個 Byte 就是 1 張 28 x 28 的灰階圖片,每 1 個 Byte 就是 1 個 pixel 的灰階值,其順序是由左而右,由上至下。

因此,我們可以很簡單的寫個 C code 來把 binary 資料儲存成 BMP 檔案,以 24 位元的點陣圖為例,每 1 個顏色都寫一樣的值,其結果便會是灰色圖,這裡要注意的是 BMP 是先填底部的值,故要記得調整。

#include <stdio.h>
#include <mem.h>

unsigned char header[] = {
    0x42, 0x4D, 0x66, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
    0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x30, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

int main(void)
{
    FILE *src = fopen("train-images-idx3-ubyte", "rb");
    if (!src) {
        return -1;
    }

    fseek(src, 16, SEEK_SET);

    unsigned char value;
    unsigned char gray_img[28*28];
    unsigned short img_size = sizeof(gray_img);
    unsigned short header_size = sizeof(header);

    FILE *dst;
    char img_name[32];
    unsigned short index = 1;

    while (1) {
        memset(gray_img, 0x00, img_size);
        fread(gray_img, 1, img_size, src);

        if (feof(src)) break;

        sprintf(img_name, "train_images_%05d.bmp", index++);

        dst = fopen(img_name, "wb");
        if (!dst) {
            fclose(src);
            return -1;
        }

        fwrite(header, 1, header_size, dst);

        for (int i = 0; i < 28; i++) {
            for (int j = 0; j < 28; j++) {
                value = gray_img[(27-i) * 28 + j];
                //value = 255 - value;
                fwrite(&value, 1, 1, dst);
                fwrite(&value, 1, 1, dst);
                fwrite(&value, 1, 1, dst);
            }
        }

        fclose(dst);
    }

    fclose(src);

    return 0;
}

甚至可以再透過較高階的語言,把個別的 BMP 圖再合併回一張圖,當然也可以一開始就都用 python,底下為訓練資料集的前 400 張圖合併結果。

2019年12月24日 星期二

UltraEdit 搜尋時出現一個無效的引數錯誤

這個問題我猜是因為曾經在搜尋某值時,也許是特殊字元,當 UltraEdit 在開啟搜尋功能時,它會去載入設定檔中 [Find History] 區塊的歷史紀錄,因為特殊字元的緣故導致它產生錯誤。

當這個問題一發生時,每次搜尋時都要多 click 好幾次,實在是讓人阿雜。

解決方式也很簡單,直接砍掉 C:\Users\XXX\AppData\Roaming\IDMComp\UltraEdit\uedit32.INI[Find History] 區塊,並重開 UltraEdit 即可。

解決問題後才發現,在進階 -> 配置 -> 工具列/功能表 -> 其他,就有一個清除歷程的按鍵,使用它應該也能夠解決問題,差別在會多清除一些開啟文件等記錄。

EDK2 編譯時期前置作業概略

我們在 build UEFI Application 時,第一個步驟便是會呼叫 edksetup.bat,以下是針對我感興趣的部份作記錄。

1. Call edksetup.bat, it will call BaseTools\toolsetup.bat.
2. In BaseTools\toolsetup.bat, if it can't find Conf\target.txt and Conf\tools_def.txt, it will copy BaseTools\Conf\target.template and BaseTools\Conf\tools_def.template to Conf folder to generate Conf\target.txt and Conf\tools_def.txt.
3. When you call build.exe(BaseTools\Source\Python\build\build.py), it will pass these two files in LoadConfiguration function.

2019年12月23日 星期一

EDK2 預設視警告為錯誤

一般來說,撰寫 UEFI Application 時,如果編譯過程中遇到警告,會出現 C2220 錯誤訊息。

這個是因為在 UDK\Conf\tools_def.txt 檔案中,在所屬的 VC 版本編譯選項中預設有 /WX 選項,故會將警告視為錯誤。

下面以我最常用的 VC 版本為例:
DEBUG_VS2012x86_X64_CC_FLAGS  = /nologo /c /WX /GS- /X /W4 /Gs32768 /D UNICODE /O1ib2s /GL /Gy /FIAutoGen.h /EHs-c- /GR- /GF /Zi /Gm

如果我們想忽略某警告,最簡單的方式便是在 UEFI Application 的 INF 中加上 /wd9999 選項,9999 便是警告編號。

還有一種方式是去動態改變 warning 層級,假設 9999level 1 的 warning,而我們現在是使用 level 2 check,只要指定 /w39999 後,9999 便會變成 level 3 warning,故不會產生 C9999 警告訊息,在某些情境下還蠻好用的。

另外,LINKER 也有 /WX 選項,這個倒是可以用 /WX:NO 覆寫。

2019年12月19日 星期四

Chrome Extension + Export Excel

之前寫的 The books list 小工具,可以幫忙把網頁上顯示的購買書籍書名 parsing 出來,以方便後續使用,目前支援 Readmoo 舊版書櫃,Kobo 以及 Google Play Books。另外,Google Play Books 的書購買的不夠多,故不確定分頁機制如何,無法處理。

原本是直接將書名顯示在 Web 視窗,但似乎還是有點麻煩,雖然我現在也懶得另外整理清單了,前天趁著測試的空檔,使用 SheetJS 這個純 javascript 套件,便順利的產出了 Excel 2007 格式。

另外,調整格式等功能需要 Pro 版本才行,但一般使用已經夠用。

如果想自己改 Community 版本的話,只要 follow 他的 License,應該也可以自行加上 Style 等功能,這個可以找其他語言的 Open Source 專案,便知道如何比照辦理。

或許也可以使用 Golang 的任一專案,來個 Golang -> WebAssembly -> Javascript 乾坤大挪移也說不定?

2019年12月16日 星期一

Ubuntu 16.04 + NVIDIA-Linux-x86_64-410.93.run driver 循環登入視窗解決方式

當初這個系統是為了跑 TensorFlow-gpu 版本安裝的,中間一度有幫人 build tool,測試發送 ARP 廣播封包等。

最近使用 TensorFlow Lite 時偶然發現,在本機前面登入時,會一直循環登入,也就是輸入帳密後,又會回到輸入帳密的登入視窗。

有嘗試重裝同一版 driver,但過程會一直報錯,看 /var/log/nvidia-installer.log 也看不出什麼特別的,只能看出似乎幾個 c code 的 structure 有衝突,直覺是我的 GCC 版本似乎跟之前安裝時的不一致,但我印象中幫人測試 tool 時,我並沒有做額外的更新。

沒辦法,使出最後一招,下載最新版的  NVIDIA-Linux-x86_64-440.44.run,安裝後馬上恢復正常。

稍微查了一下,網路上是建議安裝 NVIDIA driver 時,不要預設使用圖型登入,聽說比較容易有問題,記錄一下,避免忘記。

2019年12月15日 星期日

mooInk Pro 購買中獎發票

之前購買電子書發票都是直接捐贈,不知從什麼時候開始,改成歸戶至手機條碼。

今天為了註冊新的自然人憑證,無聊查了一下這次中獎發票明細是什麼,才發現居然是購買 mooInk Pro 的發票。


不過這不是要記錄的重點,因為自然人憑證只有 5 + 3 年可用,重點是重新申請自然人憑證時,要如何做電子發票設定?

只要到財政部電子發票整合服務平台,點選登入→自然人憑證→註冊即可,完畢後原本已歸戶的資料就會再併回此張新的自然人憑證。

2019年12月13日 星期五

docker run 重要參數

一樣,又是個不常用的東東,拯救我的腦袋。

-v 掛載 /home/xx 目錄到 container 的 /test
-w 設定工作目錄為 container 的 /test

docker run -v /home/xx:/test -w /test --runtime=nvidia -it --rm tensorflow/tensorflow:latest-gpu /bin/bash

Tensorflow Lite on Windows - 使用 Google 並且不求甚解

雖然我很喜歡 Linux,但我工作的環境都是使用 Windows 居多,由於手邊還有 Linux 的電腦,故遇到 OS 相關問題就是跑去該電腦前打開電源開機,然後回到自己座位使用 SSH 登入,中間如果需要傳輸檔案便使用 WinSCP 解決。

最近嘗試使用 Tensorflow Lite 轉換 Tensorflow Model,但在 Windows 上無法成功,隨便 Google 一下錯誤訊息,看起來似乎要跑在 Linux 上,後來果然在 Linux 上成功轉出 Model。

但因為要改 Model 和 Code,不論是 python 還是 Tensorflow 都不是我平常會用的傢伙,故常常改來改去,每次都要用 WinSCP 上傳還真是麻煩,雖然 UltraEdit 貌似有支援 SSH,但我的版本是灰色狀態( 寫文章時,已經找到解決方法 ),目前要處理的事一籮筐,故暫時沒時間解決,只好乖乖的再重頭看一次錯誤訊息。

首先,錯誤訊息是長這樣。

"'toco_from_protos' \xa4\xa3\xacO\xa4\xba\xb3\xa1\xa9\xce\xa5~\xb3\xa1\xa9R\xa5O\xa1B\xa5i\xb0\xf5\
xa6\xe6\xaa\xba\xb5{\xa6\xa1\xa9\xce\xa7\xe5\xa6\xb8\xc0\xc9\xa1C\r\n"

感覺就是一堆火星文,老辦法還是 Google,貌似是 python 16 進位字串,不確定對不對?反正簡單使用 python 是可以轉換的,我們得到下列錯誤訊息。

s = "'toco_from_protos' \xa4\xa3\xacO\xa4\xba\xb3\xa1\xa9\xce\xa5~\xb3\xa1\xa9R\xa5O\xa1B\xa5i\xb0\xf5\
xa6\xe6\xaa\xba\xb5{\xa6\xa1\xa9\xce\xa7\xe5\xa6\xb8\xc0\xc9\xa1C\r\n"

print(s)

Traceback (most recent call last):
  File "Test.py", line 5, in
    print(s)
UnicodeEncodeError: 'cp950' codec can't encode character '\xa4' in position 19: illegal multibyte sequence

一樣繼續 Google,搜尋如何改變 code page,原來使用 "chcp 65001" 就可以改成 UTF8,雖然我也不知道 python string 預設編碼是什麼?管他的,時間寶貴,不行在回來查。

這次有了比較清楚的錯誤訊息,但還是回到一開始隨便 Google 到的結果,找不到 "toco_from_protos" 這支轉換程式。

tensorflow.lite.python.convert.ConverterError: See console for info.
'toco_from_protos' is not recognized as an internal or external command,
operable program or batch file.

坦白講,實在是沒道理,堂堂 Google 霸主加上又是 python,沒道理只支援 Linux,更何況使用關鍵字查詢,看起來就是包在 Tensorflow 裡面的,非 Linux 其他安裝時所安裝的工具。

既然 Tensorflow Lite 並沒有說只支援 Linux,一樣繼續 Google,看到了關鍵字 "C:\Python\Scripts\toco_from_protos.exe"。

果然在我安裝目錄下是有這個執行檔的,接下來問題就簡單了,把該目錄加到 Path 路徑即可,雖然我也不知道為什麼我安裝時沒有選擇自動加入?

終於可以在 Windows 下繼續改 Code 了,這條不歸路不知道還要走多久?


後記

人對沒興趣的東西真的會不求甚解,我對 python 和 Tensorflow 都沒有興趣,故我只想快速解決問題,雖然真的是很快速解決問題,因為打這篇文章比我解決問題所花的時間還要多!

還是老話一句,學海無涯,Code 海茫茫,我也想有無限制的精神時光屋可以修練XD

2019年12月3日 星期二

傑克李奇電子書

感恩讀墨,又多了 4 本傑克李奇的電子書!雖然有 2 本我之前已經買過紙本了,等有錢再來把它買回。

丟了藤井樹、李查德、以及一堆資訊書籍之後,能買電子書的我都選擇買電子書了,如果沒有電子書,紙本書就丟一本買一本,雖然心疼但也沒辦法,誰叫我不是大富翁呢!

2019年11月29日 星期五

一個 ARP 廣播封包的故事

ARP 協定是在乙太區域網路中常用到的一個協定,當我們有資料要傳給區域網路上的某台裝置時,由於上層僅知道 IP 資訊,故需要使用 ARP 協定來得知該裝置的 MAC。

一般來說,系統都會有內建的 ARP table,以 Windows 來說,可以使用 "arp -a" 來觀看,如果在 table 中找不到對應的 IP,就會發出 ARP 廣播封包來得到該台裝置的 MAC,而這個封包的目的 MAC 便會是 "FF:FF:FF:FF:FF:FF",表示要傳給區域網路中的所有節點。


我們有個專案會使用 UEFI Shell 開機且定時的使用 HTTP Web API 跟 Server 溝通,以得知接下來要做的測試並回報測試結果。

某天我們拿到了新的板子,恰巧的是網路卡晶片也改了,這時原本正常的測試都無法順利進行,不是 DHCP 取不到 IP 就是 HTTP Web API 無法正常工作。當然,一開始會直覺是因為新板子的緣故。

由於此板已經在私人的網路環境測試過,DHCP 看起來都正常工作,只好詢問公司 IT 是否有更改公司區域網路設定,不料 IT 並沒有修改設定,這段期間也有將自己電腦接到該板子所使用的 port 測試,看起來網路也都正常,偏偏兩者合起就來就是無法正常工作,這中間還做了很多實驗,但都無助於問題解決。

沒辦法只好動用 Wireshark 和 mirror port switch 了,首先可以確認的是某些時候不論是 DHCP 的回應封包或是測試 Server 的 SYN-ACK 封包,都有正常送回板子端,但不知道什麼緣故,板子會認為沒有收到封包,結果便是 DHCP 取不到 IP 以及 HTTP Web API 失效。

雖然從封包可以證明問題似乎是出自板子端,但對解決問題還是沒有幫助,畢竟在我們自己的私人網路環境都是正常的。幸好在截取封包的過程中,發現有一個設備不斷的在發出 ARP 廣播封包且每次要詢問的 IP 都不一樣,從比例來看,至少佔了封包數的 40 % 以上( 因為是 mirror 故這個數字可能 double 了 ),這是個不正常的現象,一般來說,大部份都會是 IPV4 封包佔的比例會是最高,ARP 應該是 10% 以下較為合理。


將此情況回報給 IT 後,據 IT 的說法是該台設備的使用者誤將 DHCP 設定設成固定 IP,導致該設備不斷的發出 ARP 廣播封包。說也奇怪,在 ARP 廣播封包消失後,我們的板子就恢復正常了,個人猜測是因為 UEFI Network Stack 的 implement 無法處理此類情況,畢竟 UEFI 只是個單執行緒的精簡 OS?

雖然後續測試看起來都正常了,但到底是不是因為 ARP 廣播封包所引起?這個問題一直在我心頭縈迴不去,看來證明它的方式便是想辦法創造出一樣的環境。

Google 了一下,想要發出 ARP 封包看起來在 Windows 下不可行,幸好這個世界上還有萬能 OS - Linux 存在,只要使用 RAW Socket 便可以順利的發出 ARP 廣播封包。

萬事具備,只欠東風,使用 Switch 架設了一個私人網路環境,並配合測試 Server 配置,設定了相關裝置的固定 IP,原本只是簡單寫個 for loop scrip 10000 + C code 發送 ARP 廣播封包,但板子看起來卻是一切正常?靈機一動之下,判斷是壓力不夠,在開啟另外一個終端機並執行相同的 script 後,我們的板子終於宣告不治,一直要等到 ARP 廣播封包結束後才能恢復正常。


能夠確認自己的判斷並重現問題,我想這才是 RD 的本事所在,真不枉費我寫了 14 年的 Code。

2021/12/24 更新

原來是我誤會 Windows 了,Windows 有提供一個 SendARP 的 Win32 API,故我們在 Windows 下也可以發送 ARP 封包,重點是可以用 Go!另外,我也找到一個 Go package 可以在 Linux 下發送 ARP 封包,這樣就更容易做測試了。

2019年11月28日 星期四

Free Software EFI file system drivers

之前就看過有人提到此類 driver 的存在。最近在查資料時,又找了一下,記錄下來以備不時之需。

https://efi.akeo.ie/

上述是一個 open source 專案,裡面有很多 file system 的 EFI driver。以讀取 NTFS partition 來說,這個專案比較方便,直接使用 load 方式載入即可。不像另外一個 rufus 專案,還需要動到 dd command 才行。

唯一要注意的是 NTFS 只能 read,不支援 write。想想也很合理,畢竟微軟並沒有提供正式的 Spec,大部份的解決方式都是靠 open source 社群摸索出來的。

2019年11月26日 星期二

Wireshark 重出江湖

第一次使用 Wireshark 應該有 10 年以上了吧,記得最早的名字似乎不是 Wireshark?總之,那是個還買得到純 Hub 的年代,要抓封包並沒有那麼困難,因為 Hub 根本不管 MAC,故不像 Layer 2 Switch 一樣,可以解決碰撞的問題。

最近為了看一個問題,此問題可能是在 device 端,故我需要抓到流經 device 的封包。因為我不是 IT,我也沒有觸碰實體 IT Switch 的權限,最簡單的方式便是接個 Hub,沒想到市面上已經找不到純 Hub,不太可能為了這個去拍賣網站購買舊貨。幸好 Layer 2 網管型 Switch 一般都會有個 mirror port 的功能,可以把想監聽的 port 導出來好方便抓取封包。以前無聊就查過最便宜的機器要多少錢,沒想到只要一千塊就可以搞定,故趁這個機會買台來玩玩。

我購買的機器是 ZYXEL GS1200-5,這應該是市面上最便宜的了吧?只要設定 192.168.1.4 以後的 IP,便可能透過 Web 界面設定 mirror port 的功能。要注意的是由於是 mirror,故 Wireshark 除了 mirror port 的封包,還會抓到 Wireshark 本身電腦的封包,故 Switch 的接法便顯得重要。一開始我 mirror 的是 IT Switch 出來的線,會讓封包更顯得零亂,後來直接 mirror device 那個 port 才方便分析封包。


既然都要抓封包了,便趁這個機會買了本 Wireshark 的書,我是在 Google Play Book 購買的 PDF 電子書,大推這一本《實戰封包分析第三版》,說得非常清楚。我雖然也在 Amazon.cn 買了 2 本簡體書,但翻沒幾頁就看不下去了。

最後終於順利的解決問題了,但這個故事說來話長,有機會再好好分享。

2019年11月20日 星期三

Parsing XML that hast namespace in python


import xml.etree.ElementTree as ET

def main():
    tree = ET.parse('content.opf')
    root = tree.getroot()

    ns = {
        'manifest' : 'http://www.idpf.org/2007/opf',
        'item' : 'http://www.idpf.org/2007/opf'
    }

    manifest = root.find('manifest:manifest', ns)

    count = 0
    for item in manifest.findall('item:item', ns):
        s = item.attrib
        print(s['href'])
        count += 1

    print('All items are', count)

if __name__ == '__main__':
    main()

2019年11月18日 星期一

傳說中的記憶體增加警告

之前為了讓網域上的 device 可以連接 Server 做測試,需要有合法的 OS,但 IT 只有 Win10 的授權可以安裝,反正也不需要什麼多好的效能,故上線時倒也一直相安無事。

約莫是一年前發現 Server 會無緣無故無法從遠端連線,即使人在本機前面,輸入帳密後依然無法操作電腦,經過了幾次觀察後才發現,是因為實體記憶體已經快耗盡,系統不斷在做 Swap 才導致操作無法回應。後來歸納出是因為 Win10 只要一陣子沒有做 Windows Update,記憶體便會緩慢的不斷增加,而我們的電腦只有 8G 的 RAM 可用。

手上 Coding 的工作便做不完了,實在是不想每天做 IT 營運檢查,故那時寫了一個簡單程式,會去監控 Server 的記憶體使用情形,每天會發送一次 mail 報告目前記憶體使用情形,每一個小時也會檢查一次,如果超過 50% 便會再發一次 mail 通知,覺得記憶體使用過多,便遠端去做 Windows Update 即可。

雖然針對電腦管理也有很多免費軟體可用,但實在是不想安裝軟體,故自己來還是比較簡單,對 Server 也比較沒負擔,因為管理軟體大概都需要開啟 Web 服務以及安裝資料庫,好方便監控。

不知不覺就這樣過了一年,昨天休假時無聊開啟公司信箱,第一次遇到超過 50% 的情形,截張圖紀念一下。

話說 Win10 還真吃記憶體,昨天每日報告還在 38% 左右,晚上 5 點多左右便升到了 55%,Windows 還真是讓人猜不透呀。

2019年11月7日 星期四

熱騰騰的 Amazon 雲端發票

想不到 Amazon 沒有等到明年 1 月 1 日才搞定電子發票,而是在 11 月初就正式上線,不禁要給他一個讚,雖然還是輸 Google 好幾個光年XD

手邊雖然沒有微軟的服務,但我想微軟應該是一直都有開發票才對,畢竟有作業系統和辦公室軟體的銷售業務。


由於這些境外電商的銷售屬於新興類別,財政部於 2018 年 7 月 16 日修正公布統一發票使用辦法第 7-1 條第 2 款規定,本法第 6 條第 4 款所定營業人 ( 即境外電商營業人 ) 應開立雲端發票交付買受人。故電子郵件便順理成章的成為此類銷售的電子發票載具。

如果有自然人憑證或是手機條碼的人,可以去「財政部電子發票整合服務平台」,將電子郵件載具做歸戶的動作,只要再設立金融帳號,系統便可以自動對獎並匯款,真的是節省很多時間。

如果我是政府,我一定會開發一套適合各行業的發票系統,並免費提供給各家使用,這樣除了消費者對獎方便,其實也可以從這些數據看出國家目前的民生消費狀況,並依據情況來調整國家經濟政策。

2019年11月6日 星期三

繁體電子書閱讀元年

今年對我來說是個特別的一年,我從原本只有 PW3 的機器,陸續買了 Oasis 2、Boox Note Lite、Boox Nova Pro 以及最後的 mooInk Pro。也是從今年開始,知道了 Kobo、Google Play Book 以及 Readmoo 電子書商的存在。故我從購買原文資訊技術書開始轉變成購買繁體中文書,這一切的一切都是拜電子閱讀器所致。

當然,購買繁體中文書也開始遇到停滯期,感覺想買的書都買了,雖然從讀墨購書金額看不出來就是XD


2019年11月5日 星期二

mooInk Pro 1.4.1 更新

此次更新最大的亮點是增加了更換休眠圖片的支援,圖片大小為 1650 x 2200 pixel。不過因為灰階螢幕的關係,要做出漂亮的圖片還真不簡單!

關於更新一事,我後來想通了,mooInk Pro 既然是 Sony DPT-CP1 的機子,整體的 Code 應該都是 Sony 原本的,Readmoo 應該只有增加 UI 及 App 的支援。故關於 PDF 的相關更新,我想應該是很難,這部份應該都是原 Sony 的,真希望是我想錯就好了。

2019年11月1日 星期五

How to select server with NVIDIA GPU card support

Please refer to the link below.
https://www.nvidia.com/en-us/data-center/tesla/tesla-qualified-servers-catalog/

如果是 1U 的機器,顯卡都必須橫放,支援清單可以從上面的列表查到。
至於是立式的機器就比較不用擔心。

用電瓦數
NVIDIA T4 16GB - 70W。
NVIDIA Tesla P100 - 300W。
Inten Xeon CPU - 85W。

以 T4 的卡來說,其長寬如下
6.89 cm x 16.95 cm。

https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/tesla-t4/t4-tensor-core-product-brief.pdf

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 進位,想通了這一點,稍微調整了一下順序,果然整本書就對了。

2019年9月26日 星期四

繁體中文書在 Kindle 無法選擇內建繁體中文字型問題

昨天轉某本書進 Kindle Paperwhite 3 觀看時,發現無法選擇繁體中文字型,只能選擇英文字型。印象中這已經是第二本書會有這個現象,還是來研究一下。

看了一下 content.opf 大概知道問題是出在哪裡,原因是有兩個 "dc:language" 欄位,我想 kindlegen 在 parsing 時,找到第一個 language 就不會再找下去,故會以前面的為主。

解決的方式也很簡單,拿掉英文的即可。

错误(prcgen):E24010:无法解析目录中的超链接

错误(prcgen):E24010:无法解析目录中的超链接(一个可能的原因是此链接指向带“样式显示:无 (style display:none)”的标签)。

這個錯誤是由於 toc.xhtml 裡面目錄指向的連結頁面,其 CSS 顯示有 "display: none;" 這個描述,將其拿掉即可。

2019年9月25日 星期三

Get Node.js return value in Windows Batch

You can call process.exit(xxx).

Then "xxx" will present in %ERRORLEVEL% variable.
________________

If you prefer to use Python, you can call exit("xxxx").

騎腳踏車上班記錄

新烏路自行車道入口到秀朗橋引道 - 22 分。
秀朗橋引道到慈濟醫院左方租借站 - 11 分。

如果以環快的距離來看約 6 公里﹝自行車道應該會更多﹞,一路逆風,真是累呀。

此提案是由劉哲彰議員在新北市議會第2屆第2次定期會的第3審查會所提出,案號為 25 。

http://bms.ntp.gov.tw/NewTCAV/BillQuery/BillQuery_Form_Context.aspx?BillNO=9473


2020/06/09 更新

有一種東西叫 App,我居然自己算,哈,老人一個。

2019年9月21日 星期六

mooInk Pro 入手感想

終於在昨天拿到 mooInk Pro,一開始還被黑貓進度查詢誤導,幸好東西已經送到家裡,而不是躺在營業所。

跟在試用時的感覺一樣,就是質感真棒。磨砂設計也不容易沾上指紋!

下載了幾本書試閱,感覺翻頁速度還可以,實際使用碼表測試,翻頁速度約為 1.4 ~ 1.5 秒間。 

放了 10 幾個 PDF 檔案,中文書的表現都還不錯,英文書的要看原始留白狀況,有些書確實會有字過小的問題。

《打火哥的30堂烈焰求生課》

《C11 Spec》

手寫功能很像拿鉛筆在筆記本上寫,個人是覺得比 Nova Pro 好寫,手寫感確實加了很多分。手寫顯示的確會有延遲感,但不管它照寫,字還是有正常出來。


最後試著把 Amazon.com 的英文書放入觀看,顯示效果就不好,個人是覺得 calibre 的問題,畢竟 aw3 是 Amazon 自有格式。另外也試著從 google 買了一本書,這本格式看起來就比較正常,也能使用目錄跳轉。

Kindle Paperwhite3 and Readmoo mooInk Pro

底下是一些 EPUB 格式觀看的效果,大推 Manning 這家書商的書,共有 PDF、EPUB、MOBI 格式可供下載,如果只是買紙本書,某些書還可以上網註冊下載電子檔,只可惜他們家的書我想買的都買了。
《Go in Action》- Manning Book Store

深入淺出 Rust》- Amazon.cn - Converted by Epubor

《x86汇编语言:从实模式到保护模式》- Amazon.cn - Converted by Epubor

《x86汇编语言:从实模式到保护模式》- Amazon.cn - Converted by Calibre

簡單總結一下

優點

1. 質感很棒。
2. 10 吋螢幕。
3. 手寫感很棒。
4. 橫轉直功能強大。

缺點或可以改進的部分

1. 四邊薄,背面中間突起設計,個人覺得不太好拿,Note Lite 設計比較好拿。
2. 手寫感雖然很好,但機構設計導致螢幕稍凸出,不易將字寫漂亮。
3. 內建瀏覽器不好用。
4. PDF 只能滑動翻頁。
5. PDF 增加裁邊功能。
6. EPUB 檔案開啟很慢﹝1.1.9 有變好,但是超過 10MB 還是慢﹞。
7. 保護套黏上就很難取下,不建議使用。

目前已知 Bug﹝1.1.5﹞

1. 刷新螢幕設定與對比度設定,偶爾會回復預設值。


目前已知 Bug﹝1.2.0﹞

打開書櫃中已下載的書,常常會卡在載入中畫面,只要在螢幕上滑一下或是按下功能鍵即可。另外,如果有打開網路,似乎就不會有問題?

目前已知 Bug﹝1.3.2﹞

重置系統在登入狀態下不能用,需在個人帳戶中按下退出,該頁面下方的重置才能使用。


2019/09/21 更新

HappyZ 的 tool,無法連線到 device,使用 DPA 軟體也看不到 device,我猜這個方法應該不適用,需要再做研究,但使用特定 port 連接 HTTPS 是可以通的。

坦白說即使可順利連線,EMMC 的 partition 也不知道是不是與 CP1 一致,雖然我覺得以 Readmoo 的規模來看,應該是沒有資源來處理 BSP 這塊?要有能力處理 Bootloader 和 Linux 底層,我認為團隊應該也要有 2 ~ 3 人,這還不包括硬體人員,故我認為沿用 CP1 的機會是比較高的,除非 Sony 有幫他們作調整。

2019/09/22 更新

先使用 https://github.com/janten/dpt-rp1-py  工具 register,HappyZ 工具就可以正常連接,現在就只剩要不要衝的問題﹝據我以身試毒的結果,讀墨有做檔案檢查,可以透過工具上傳,但並未真的更新﹞


2019/09/23 更新

好久沒有在午休時間看書了,mooInk Pro 讓我重享讀書的樂趣,只可惜我還是不想把我的 PW3 和 mooInk Pro 帶出門,通勤太累了。

2019/09/24 更新

昨天晚上回家拿下保護套時,因為黏膠很黏,需要用較大的力氣才能分離,一時未注意到手指位置,導致螢幕右上角有一個凹陷的小指印,不得不說 Sony 的這個設計很爛,以 mooInk Pro 的輕薄設計,為了取下機器,感覺機器都快被凹彎了。

順便更新系統到 1.1.9 版,最明顯的差異就是 EPUB 書籍開啟速度變快,原本 1.1.5 大概超過 5MB 的書就會很慢,這版好一點,大概可以到 10MB,另外,有開啟過的似乎會比較快?

1.1.9 版有提供原始碼下載,看了一下,只是 Linux 部份,還看不出 kernel 版本,故用處不大。

2019/11/07 更新

前幾天釋出了 1.4.1 版,增加了休眠圖片的支援。

不知不覺也擁有機器一個月了,240 克的重量拿在手上真的是無負擔,最適合我這種家裡沒書桌的人使用。昨天還買了一本《臺北城中故事》,配合大螢幕看起來爽度滿分,感覺自己都變成歷史學家了XD

2019/12/23 更新

上個星期五買了《七龍珠超》漫畫 8 本,但觀看時下半段會被截斷,因為此問題跟個人書櫃的漫畫一樣,之前也有聽過讀者反映,故我認為應該要從 App 端改進才對。

後來讀墨團隊在更新版本 1.6.2 後,此問題便順利解決,個人書櫃漫畫的問題也一併解決了。除此之外,此版本還開放了原本藍牙連線的功能,目前可以用的有文石的翻頁器以及鍵盤,藍牙耳機雖然也可以連線,但目前還不支援有聲書。

2020/03/16 更新

擁有 4 台電子書閱讀器的我,目前最常使用的是 Kindle Paperwhite 3 和 mooInk Pro,使用時間約為 6:4。

2020/05/28 更新

無聊錄了一些短片,實測各種速度,僅供參考。

2020/06/24 更新

越來越少用這台機器了,畢竟當初購買用途是為了看 PDF 和英文 EPUB,這 2 項需求在這台機器都無法滿足我的使用情境,現在也只能拿來看固定版面 EPUB 檔了。

台灣廠商短期內看來也不會出電子紙手機,我覺得最有希望的是凌網,就看他們是否有勇氣突破困境,不然只會永遠在讀墨之後。當然也有可能他們營收是超越讀墨的,只是因為我是讀墨派的故我不知道?

不管答案是哪個,這都不是使用者需要關心的,我只要有一台好的機器就滿足了。

與其等待台灣廠商出電子紙手機,我還是上京東購買海信 A5 比較快,無奈。

2020/06/30 更新

海信 A5 手機已到貨,目前看來能解決我上網查資料之痛點,只差資安問題不能當手機使用?

2020/09/04 更新

目前最新版本 2.1.2,似乎從此版本開始,點選 PDF 目錄可跳頁?EPUB 開啟速度稍微變快,另外,之前 mooInk Pro 傳檔 App 認不到裝置的問題,在這版本也可以正常抓到裝置,不需要如網友說的重置系統,看來是我想的 bug 沒錯,故更新版本後也一併解決了此問題。

2020/11/21 更新

在上一次更新時,個人文件裡的 PDF 檔案就可以使用翻頁器翻頁,版本為 2.2.6。

今日開機同步時,又有新的版本可以更新,我猜有一陣子了吧?這次版本最主要的新增有兩個,一個是流式 EPUB 書籍可以雙頁閱讀,另一個則是可以新增資料夾來管理個人文件,算是有符合一些人的需求,此次版本為 2.3.4。

2021/03/15 更新

前一陣子在讀墨買了鬼滅全套給老婆看,發現每次載入漫畫時都要等待許久,依我之前閱讀個人 EPUB 檔案的經驗,應該是軟體的 Bug 居多,開書後過幾秒直接點選翻頁即可,不要被載入中騙了。

2021/05/28 更新

最近它連自家的固定版面書籍開啟都很慢,我的儲存空間至少都還有 16G(共 25 G 可用) 以上,再加上使用藍牙翻頁器後,如果忘了關機(已開啟藍牙休眠),不知道在哪個條件下會造成休眠有問題而導致耗電劇增?故我已經沒使用這台機器了。

真是糟蹋了 Sony 的這台好機器,這證明了即使硬體很好,沒有好的軟體配合,也沒辦法發揮它全部的效果。

也不能說讀墨的軟體不好,但他們是強在工程師有模組化以及一致的設計邏輯,再加上使用 Javascript 為開發語言,故讀墨的強是強在他們的模組可以大部份的在 Windows、Web 以及 Android 上共用,當然,這只是我的小小感覺。

2019年9月20日 星期五

勒索病毒

勒索病毒是近幾年來興起的一種病毒,發作時會將電腦某些檔案加密,其特徵是原本檔名後會加上類似 ID、email 和自創的副檔名,該病毒程式便可以知道那些是加密過的檔案避免再 2 次加密,在 C 槽和 D 槽或是被加密的資料夾中,會留下一個文字檔,提醒中了勒索軟體,裡面並指定要用比特弊交易,甚至是教導如何購買比特幣XD

根據本人猜測,病毒程式應該是在發作時,先將本機電腦相關資訊送回伺服器產生 ID,並取回非對稱加密演算法的公鑰,之後便利用這把 Key 開始工作。

根據觀察某中毒電腦,病毒應該是同時開啟幾個 thread 對不同槽加密,故我在 C 槽和 D 槽看到不同的檔案卻有著同樣的最後修改時間。

底下是某中毒電腦 D 槽被加密的檔案個數及加密花費時間資訊

178,787 個檔案,花費 6 個小時又 43 分。


不靠病毒軟體監控辦法﹝很容易被反制,但聊剩於無﹞

在各磁碟機根目錄放置一個不會被修改的假檔案,並在某磁碟機一個很深層的資料夾中放置一個程式去監控假檔案的最後修改時間,可以使用 polling 或是各作業系統的 event 通知機制來監控,只要發現異常就馬上執行關機動作,之後再用 Linux 開機碟開機來救援未被加密的檔案。

此原理是利用作業系統的檔案 API 機制,不管我們是使用什麼程式語言,當我們寫程式在 parsing 某資料夾檔案時,底層一定是呼叫到 OS API,理論上吐回來的 handle 應該都是照英文字母排序,故可以達到提早發現的效果。

底下為使用 Go 寫的 sample code

package main

import (
    "fmt"
    "os"
    "os/exec"
    "time"
)

func SomethingWrong() bool {
    var t int64 = 1568963531

    files := []string{
        "C:\\0\\000000.txt",
        "D:\\0\\000000.txt",
        "E:\\0\\000000.txt",
    }

    for _, name := range files {
        fileinfo, err := os.Stat(name)
        if err != nil {
            fmt.Printf("File (%s) is gone. \r\n", name)
            return true
        }

        atime := fileinfo.ModTime()
        //fmt.Println(name, atime, atime.Unix())

        if atime.Unix() > t {
            fmt.Printf("Error : %v (%v) \r\n", name, atime)
            return true
        }
    }

    return false
}

func notifyMessage() {
    cmd := exec.Command("notepad", "電腦中毒了")
    cmd.Run()
}

func main() {
    ticker := time.NewTicker(time.Second * 2)
    defer ticker.Stop()

    isStop := false

    for {
        select {
        case _ = <-ticker.C:
            if SomethingWrong() {
                // do something
                notifyMessage()
                isStop = true
            }
        }

        if isStop {
            break
        }
    }
}

2019年9月18日 星期三

HTML Web Storage

Web Storage 是 HTML5 的一個功能,比 cookie 好用,Web Application 可以透過瀏覽器儲存資料在 Local 端。

Web Storage 可分為 2 種:

windows.localStorage - 不會過期的資料。
windows.sessionStorage - 當瀏覽器分頁關閉時就會消失。

Windows 會將其儲存在 C:\Users\XXX\AppData\Local\,其實也就是 %LOCALAPPDATA% 這個變數的內容。

2019年9月16日 星期一

列出 Linux 某目錄下所有檔案與目錄名稱

太久沒用,花了 10 幾分鐘才搞定,記錄一下。

#include <stdio.h>
#include <dirent.h>
#include <string.h>

void parseDir(char *dirPath) {
    struct dirent *de;
    DIR *dr = opendir(dirPath);

    if (dr == NULL) {
        printf("Can't open folder %s \n", dirPath);
        return;
    }

    while ((de = readdir(dr)) != NULL) {
        if (strcmp(de->d_name, ".") == 0 ||
            strcmp(de->d_name, "..") == 0) {
            // do nothing
        } else if (de->d_type == DT_DIR) {
            char path[256];
            sprintf(path, "%s/%s", dirPath, de->d_name);
            printf("folder - %s \n", path);

            parseDir(path);
        } else {
            printf("file - %s/%s \n", dirPath, de->d_name);
        }
    }

    closedir(dr);
    return;
}

int main(void)
{
    parseDir("/data/imagenet/raw_data/train");
    return 0;
}

Boox Nova Pro 電力記錄

結論

純待機一天掉 4% 電。
上 ptt 半小時掉 4% 電。
上 FB 或瀏覽網頁半小時掉 10% 電。


非專業測試

原本電量 94%,上 ptt 半小時,電力剩 90%。


2019/09/18 更新

經過兩天待機,一天約掉 4% 電。 如果是上 FB 加瀏覽網頁,半小時掉 10%。

2019年9月13日 星期五

我的大叔 - 金錢篇

平常不會特別想去韓國,故對匯率沒有甚麼概念,趁著看第 2 遍的機會,了解一下劇中提到的金錢數字換算成台幣是怎樣!

2019/09/13 台灣銀行牌告匯率本行賣出為 0.02843

item
NT
五千萬商品券賄賂
1,421,500
一億三千萬房子
3,695,900
一萬五千元超市購物
426
四百八十萬安養費欠款
136,464
六百萬部長月薪
170,580
一百一十萬約聘月薪
31,273
二千萬欠債
568,600
五億創業費用(至少8位員工)
14,215,000

2019年9月12日 星期四

慘不忍睹的 MLPerf 試用

MLPerf 是幾家大公司為了讓機器學習可以有個共同的比較標準,所釋放出來的 open source 專案。

試用了幾個 item,根本不是一般電腦可以跑的。

推薦系統需要 400 G 的記憶體,GG。

image classification 跑起來則是一堆問題,文件寫的不清不楚,docker container 的跑法一直搞不定,只好直接用本機 CPU 版本試跑,雖然最後可以成功跑起來,但一開始訓練的正確率只有 0,不知道能不能順利的跑完?

根據個人不負責任猜測,應該可以順利跑完,感覺是每跑完一項﹝100 step﹞就會釋放記憶體,除非有 memory leak,不然跑個幾個月應該可以達到它要求的 0.749 accuracy 吧!

https://www.mlperf.org/

2019/09/13 更新

後來想了一下,應該是 Dockfile 撰寫有問題,裡面指定的某些軟體版本不對,待驗證﹝參考 2019/09/16更新﹞。


上圖是 MLPerf 某個 issue 圖片,看的出來 100 個 step 要跑約 20 秒,跑到 2,008,925 才有 0.78 的正確率,換算下來:

2,008,925 / 100 x 21 / 60 / 60 / 24 = 48.63 天

如果是我的電腦,100 個 step 要跑約 30 分鐘:

2,008,925 / 100 x 30 / 60 / 24 = 418.53 天


2019/09/16 更新

如果是使用 MLPerfV0.5,記得修改 image_classification/tensorflow/Dockerfile,tf-nightly-gpu -> tensorflow-gpu==1.12.0,docker 才可以順利運行,不過由於我的 GPU Card 只有 2G 記憶體,最後還是不能執行,會出現 OOM Error﹝out of memory﹞。


2019/09/17 更新

覺得 MLPerf 還不夠友善,也許因為 contributor 都是大廠大牛,有問題都能自行解決,故沒考慮到一般人,可能要等到 1.0 後再來試用比較好。剛才在 github 順便回答了 2 個問題,希望可以幫助到跟我有一樣困擾的人。

我的大叔

以前就知道 IU 這位歌手,不過並未看過圖片,這次跟著老婆看《德魯納酒店》,總算知道本人長怎麼樣。既然看過本人,乾脆也來聽聽她唱過的歌曲,在 YouTube 搜尋了一下,挑了幾首歌來聽,其中我最喜歡的就是 BBIBBI 這首歌,尤其是她戴著黃色帽子配合酷酷表情在跳 Yellow Card 那段,感覺特別有喜感,於是接連看了好幾天,覺得這首歌很適合寫程式聽,雖然我也不知道她在唱什麼?

不得不說,萬能的 Google 總是帶給人神奇的推薦,終於在上個星期日跳出《我的大叔》大人這首插曲,聽著這感人的歌聲和 MV,我都快哭了,於是便開始我的大叔之旅。

故事是敘述兩個孤獨的人,在經歷了一連串事件後,相知相惜的故事。雖然覺得兩個人很悲慘,但看了又覺得很療癒,覺得彼此都不是孤獨的,那種有人了解的感覺真的很棒。結局雖然不算挺好,但也還可以接受。我想我跟三兄弟的老么一樣,不能拍電影,因為我們都不喜歡悲傷的劇情。

IU 在《德魯納酒店》共換了 N 套衣服和髮型,其中雖然也有幾個造型我很喜歡,但我最喜歡的還是她在《我的大叔》中綁馬尾穿著深色大衣,裹著她瘦小身軀的造型,尤其是當她怯怯的問大叔:可以抱他一下嗎的樣子,看了就讓人心疼。

可惜的是這兩部戲劇我覺得最好聽的歌都不是 IU 唱的,不然我應該會更喜歡她才對。新垣結衣暫時還是在我的心中排第一位XD

以前高中時都是看港劇,大一點則是看日劇,沒想到這幾年看的不是韓劇就是大陸劇,想想韓國現在的實力,不禁的為我們國家擔心,還是衷心的希望國家能夠越來越好,雖然似乎不太可能就是了...

2019年9月10日 星期二

Lua 使用小技巧

變數 Scope

變數前面加上 local 保留字,便是區域變數。


變數型别

number, boolean, nil, table, function, string,最後 2 種為 thread and userdata。

table, function 傳值時,傳的是參考。

local a, b = 1, 2 可以賦值給多個變數,不足的預設是 nil。


邏輯判斷

if flag == true then
    print('true')
else
    print('false')
end


迴圈

for i = 1, 100, 1 do
    -- do something.
end

上面表示 i 從 1 開始,做到 100,間隔 1。

for key, value in pairs(t) do
    print(key, value)
end

印出 table 變數 t 的 key and value

Table 使用

t = {}
t['name'] = John
t['age'] = 18
t[0] = 1
t[1] = 1

上面宣告了一個 table 變數 t,如果要當純陣列用,索引最好從 1 開始,因為長度從 1 開始計算,並且只算純數字索引的元素,不過使用 for 迴圈,則會全部都 iterate 一遍。

可以使用 t[1] = nil 來去除元素。
#t 可以得到陣列長度


函數宣告

function test(a, b)
    -- do something.
    return xxx
end

函數回傳值也可以有多個。


註解

'- -' 為單行註解


字串串接

local s = 'Hello' .. ' World'

字串可以使用單引號或雙引號。

2019年9月9日 星期一

UEFI application - Lua 試用

Lua 是一個輕巧的 script language,可以輕易的與 C 或其他語言結合。

UDK base 中已經含有 porting 好的 Lua project,其版本為 5.2.3

不像 Python,Lua 在 UDK 編譯中完全沒有問題。

使用 Lua,其檔案需為 ASCII 編碼。

目前實測僅有一個地方覺得怪怪的,那就是 os.execute( ) 這個函數,感覺每次都會再帶一個新的 UEFI Shell 起來,如果記憶體回收沒做好,也許會有問題?

2019/09/09 更新
寫了一個簡單的 script 來測試 memory 使用情形,看得出來執行後,可用記憶體減少了約 1MB,好像也還好?


print('start')

os.execute('memmap > before.txt');

for a = 1, 100, 1 do
    print(a)
    os.execute('Counter.efi')
    os.execute('stall 300000')
end

os.execute('memmap > after.txt');

print('end')

2019年9月6日 星期五

數位電子顯微鏡心得

前幾篇文章提到為了檢查 Note Lite 掛點的問題以及避免眼睛瞎掉,我終於在這禮拜入手了  AD106S,要價 NT $3,980。

這台的鏡頭可以拉到 10.5 cm 高,如果再加上 5 倍數位變焦功能,勉勉強強也夠用,不過如果真的要動到熱風槍等工具,就有待實測才能知道可用性。

早上閒逛了一下,發現有另一個型號 ADSM302,台灣要賣到 NT $11,800,但在美國亞馬遜只要 US $218,換算下來也有 NT $2,000 以上的價差。

另外這台 ADSM302 鏡頭可以拉到 22 cm 高,螢幕也多一吋,理論上應該會更好用。

講到這個,網路上也有販售 NT $1,000 以內的頭戴式放大鏡,我的心得是這些東西都不好用,就不要浪費錢了,這種便宜的工具或是其他手持式放大鏡,其對焦距離都過小,故鏡片或鏡頭都必須很靠近實物,就拿最簡單的使用三用電表來量測電壓的使用情境來說,根本幫不上什麼忙。

我想除非是購買外科醫生用的那種精密放大眼鏡,才能空出雙手來操作工具吧。

購書停滯期

沒想到購買繁體中文書跟去天瓏買書一樣,已經開始遇到停滯期。

以天瓏資訊書來說,有興趣的、想看的、也許有用的,老早就買了,不論是紙本或電子書。

現在偶爾經過天瓏,隨意瀏覽一下,都不覺得有什麼新書可買。

原本以為繁體中文書不會這樣,但最近上去讀墨逛逛,感覺也是了無新意。即使現在較少購買的樂天以及 Google 圖書,大概也是那幾本書佔據版面。

就算認真的點進頁面,還是找不到半本有興趣的書。

現在可能只剩中亞資訊書比較能打動我的心吧。

Onyx Boox Note Lite - 敗家深淵

為了搞懂這台爛機器這麼掛的,陸續買了 2 台三用電表、極細探針、放大鏡 N 款,最近眼睛實在是快瞎了,所以我連顯微鏡都買了。

再這樣下去,我可能會連恆溫熱風槍加焊槍,還有直流電源供應器都買了吧,算算又要噴個 1 萬多塊XD


2019/09/09 更新

這一櫃子幾乎都是為了檢測買的工具。



2019年9月2日 星期一

9 月份購買的第一本書

正當大家想要趁著 Kobo 這幾天 58 折好好的衝一波時!我仍然一如往常的在讀墨隨意瀏覽。

挑選了一本《謊言 韓國世越號沉船事件潛水員的告白》,正想趁著中午好好的享受,沒想到這本書看起來有點沉重,讓我不禁懷疑這是亞洲民族共通的劣根性嗎?

還是繼續看《深入浅出SSD:固态存储核心技术、原理与实战》好了,最起碼心情不會那麼的難受。

跨境電商開立雲端發票

前幾天收到 Amazon.com 寄來的通知,告知自 2020 年 1 月 1 日起會開立雲端發票,並提醒消費者﹝公司行號身份﹞需於 2019 年 10 月 1 日 前提供統一編號。

據該郵件提到,自 2017 年 5 月 1 日起,跨境電商均需繳納台灣增值稅﹝中華民國營業稅﹞,也就是說消費者已經被多收了 5 % 的營業稅,但 Amazon.com 卻到 2020 年 1 月 1 日才會開立雲端發票。印象中 Google 今年似乎從 3 月起就已經開立發票了。

衝著這一點,之後付費的雲端硬碟我就會選擇 Google,即使 Amazon 比較便宜。

那為什麼 Amazon.com 自 2020 年 1 月 1 日起才開立雲端發票?原本應該是自 2019 年 1 月 1 日起就應該要開立雲端發票!

查了一下,原來是根據 107 年 7 月 16 日台財稅字第 10704607091 號令

加值型及非加值型營業稅法第 6 條第 4 款所定營業人於 108 年 12 月 31 日前未依規定開立雲端發票得免處行為罰

加值型及非加值型營業稅法第 6 條第 4 款所定營業人自 108 年 1 月 1 日起,應依統一發票使用辦法開立雲端發票,其於 108 年 12 月 31 日前未依規定辦理者,主管稽徵機關應積極輔導,免依加值型及非加值型營業稅法第 48 條、第 52 條及稅捐稽徵法第 44 條規定處罰。

至於樂天理論上應該也要開立統一發票才對,如果只是靠打折就想吸引我買單,這招對我是沒用的,我最討厭不守法的廠商了!

2019年8月30日 星期五

Kindle Paperwhite 3 - 越獄

稍微研究了一下,原來越獄的起手式是先在 USB 某目錄下放置一個特殊的檔案 "RUNME.sh",接著便在 Search Bar 輸入 ";log runme" 指令,這個檔案的開頭是 "#!/bin/sh" 。

不過最新版的 5.12.1 不支援此種方式,需要拆機,才能 telnet 進去。

改天寫個 script 來 parsing root 下的所有檔案結構,看是否能有些想法?

如果這樣可以執行任何程式,我想我應該可以 porting 1 個 ARM 版本的 browser,就可以取代目前內建的版本,不知這樣是否可行?

2019/09/02 更新
確定在 5.12.1 應該是不行了,至少我實測是如此。

Kindle Paperwhite 3 - Poky 1.8.1 build error

下載了 Kindle 5.12.1 的 source code 後,裡面只有一個簡單的 TXT 檔,照著步驟做後,死在最後一步,待研究。

TOOLCHAIN_BUILD_HOW-TO.txt

1. Install Ubuntu 12.04

2. sudo apt-get install tools below.
  gawk
  wget
  git
  diffstat
  unzip
  texinfo
  build-essential
  chrpath
  socat
  libsdl1.2-dev
  xterm
  libssl-dev

3. Install Poky 1.8.1
http://git.yoctoproject.org/cgit.cgi/poky/snapshot/poky-yocto-1.8.1.zip

4. Execute the following command to setup a environment
  $ source poky/oe-init-build-env build
  $ cd build

5. Build toolchain
 $ bitbake gcc-cross

2019年8月29日 星期四

電容概述

電容是一種可以儲存電荷的元件,雖然有各種種類,但大部份的電容有分極性,所以不外乎就是兩根腳,一根接正極,另一根接負極。

以上是從網路上 Google 來的。

下圖是一個電容充電放電的電路圖,是我從某本書看到的,憑記憶畫的。


如圖所述,A、B 開關不同時,對電容的作動不同。

這樣看來,我的 Note Lite 主板的那 10 來顆貼片電容應該是有問題的,可能是因為超過承受電壓或是溫度過高,導致絕緣被擊穿,而發生短路現象。

2019年8月28日 星期三

DRM Tool - Epubor

Epubor 有一些關於電子書的工具,價錢也不貴,等以後有需要的時候再來購買。

大概看了一下,針對 Amazon 的書籍也是需要使用 downgrading Kindle application 的方式,要購買的人還是要注意一下。

https://www.epubor.com/softwares.html

2019年8月27日 星期二

Google API - Node.js Library

在完成了暗黑心法最終版後,將這段期間查的資料記錄一下,以備不時之需。

https://github.com/googleapis/google-api-nodejs-client

上面是 GitHub 的網址,只要照著上面說明,就可以寫出相關的 code。目前該函式庫已經穩定,故不會再新增功能。

https://developers.google.com/apis-explorer/#p/

上面是 Google APIs Explorer 的網址,可以了解目前有哪些 API 可用以及它對應的版本。

Onyx Boox Note Lite 測試點備忘

測試點﹝Test Point﹞是在設計電路圖時,為了方便量測訊號所預留的腳位。

一般來說,只要參照電路圖,就可以知道是否有測試點可以用。之前忘記有這件事,故沒有特別找出對應的測試點。

反正我的 mooInk Pro 也還沒來,就來試著找出相對應的測試點吧。

2019/08/27 更新

一開始就出師不利,目前只找到 PMIC RM818 PWRON PIN,如下圖所示,左 2 PIN 就是 power on button,左 3 PIN 是 GND,左邊就是測試點,如果我沒誤解 datasheet,讓它拉 Low 就會觸發 power on sequence。


至於其他的點,目前只看出排線下方的測試點都是針對排線某 PIN 所預留的。

2019/09/09 更新
有了顯微鏡之後,又找到一個測試點,是 PMIC RK818 53 pin,VCC9,雖說我暫時還不知道這個 pin 為什麼那麼重要。


2019/09/22 更新


找到所有 PMIC 相關的測試點,由左至右分別對應

1. PIN 26 - VFB2,除此之外,還跟右上角黑色電感相通 - 1.12V
2. PIN40, 41 - SW1 - 1.08V
3. PIN33 - VDDIO - 1.82V
4. PIN47 - VLDO3 - 1.00V
5. PIN53 - VCC9 - 3.32V

2019/09/23 更新

此測試點會與 3 顆電容右邊相通 - 1.00V

6 個測試點都是該排線的對應 PIN

由左至右,分別對應接頭的 PIN 3、PIN 4、PIN 5、PIN 6