Saturday, December 21, 2024

在 Angular Material 從 Moment.js 轉移到 Luxon

這幾年瀏覽器變很多,連帶的一些本來過去在 Library 做的功能在標準裡面都有相對的替代品,時間相關的部分像是時區以及顯示本地化部分也不例外。

另外就是實作上寫法的問題,現在的 Library 要能夠讓最佳化編譯器可以運作,以便減少下載傳輸量。

曾經處理時間首選就是 Moment.js 函式庫,但時代變了,在 Moment.js 的官網也貼出建議移轉的說明

總之,雖然個人的 Web 前端是湊合著做,不求用到最新的技術。但是終於到了因為 Moment.js 不支援 tree-shaking 而沒辦法簡單無腦 ng update 的時候啊...

npm uninstall @angular/material-moment-adapter
npm uninstall moment
npm install --save luxon
npm install --save-dev @types/luxon
ng add @angular/material-luxon-adapter

程式的部分有相當多的變動,像是在 Luxon 所有物件都是不可變的,所以就不需要 clone 了。轉換日期時間為字串的 format token 也變不少,不過用 Google Gemini 轉效果不錯。

Friday, November 08, 2024

Linux 上應用程式利用使用者資料夾的標準

整個 Linux 作業系統怎麼安排檔案系統,有 Filesystem Hierarchy Standard (FHS) 作為參考標準,在使用者資料夾 (Home directory; ~/) 的部分,目前主要應該都是參考 XDG Base Directory 來放。

使用者設定: $XDG_CONFIG_HOME (~/.config/)
使用者為應用程式做的偏好設定。
使用者資料: $XDG_DATA_HOME (~/.local/share/)
存放類似書籤、憑證、郵件、金鑰等使用者操作應用程式所得到或產生的資料,期待資料格式應具備一定程度的可攜性,使用者可能會想要備份這些資料。
應用程式狀態: $XDG_STATE_HOME (~/.local/state/)
存放像是執行紀錄 (log) 檔、最近存取資料的紀錄、視窗最後位置等,可以用在應用程式啟動時初始狀態的資料,使用者備份這些資料可能沒有太多意義。
使用者自行安裝的程式: ~/.local/bin/
各 distribution 應該自動的在這個資料夾存在時,把他加到使用者的 $PATH 環境變數中。

雖然沒有那麼常見,但最好可以考慮使用者資料夾可能會在不同處理器架構的主機間共用的情形。

規格中另外有定義一些環境變數,用來指定搜尋資料的順序。

Wednesday, November 06, 2024

在 WSL 2 上掛載 USB disk

如果要在 WSL 2 (Windows Subsystem for Linux) 掛載在 Linux 格式 (EXT4, XFS ... etc.) 的 USB 外接磁碟,可以先試試看這篇 Mount a Linux disk in WSL 2 說的方法,萬一不行再去試 Connect USB devices 的方式。

雖然第一篇說該方法針對的是內部儲存裝置,外接式裝置無法支援,但我自己在 Windows 11 (23H2; build 22631) 試是可以的。反而透過 USBIPD 的方式,因為 WSL 提供的 kernel 沒有包含 USB mass storage 的驅動程式,雖然 lsusb 看得到裝置,但是沒辦法掛載起來使用。

Sunday, May 19, 2024

Markdown

目前都是基於 CommonMark 上面再去增加語法或限制,疊在 CommonMark 上面新增的規格稱為 extension。

Extension 在函式庫看起來作法大概是這樣:

  1. 解析部份目前都是產生 AST 再去生成輸出,大概有兩種讓 extension 介入解析的方式:
    1. 讓 extension 實作註冊關注的字元,再去觸發解析與 AST 加工。
    2. 掃出來的 AST 整個讓 extension 實作再去解析與加工。
  2. 完成 AST 之後再進行 render 來產生輸出,看起來多半是讓 extension 註冊處理所屬 token 型別的輸出函式,在 render 時呼叫來處理生成輸出的作業。

直接從 Markdown 產生 HTML 的方式因為比較難擴充的關係,即使有機會比較快,但現在看起來比較不流行了。

Ref:

Thursday, July 13, 2023

Linux 上的 load average 怎麼解釋?

在 Linux 或是大多數的 UNIX-like 的系統上,系統核心 (kernel) 會提供一組稱為 load average 的值,用來反應系統負載狀態。

這組值原則上是基於工作佇列中的工作數量與工作特性權重去計算出來,可以說是在等待資源中的工作數量,系統會提供 1, 5, 15 分鐘的平均值。

以 Linux 來說,納入考量的資源包含了處理器、被分頁置換的記憶體、儲存設備、網路介面等等,因此在 Linux 上 load average 可以說是一個綜合性的指標,可以相當程度的反映出程式分享設備資源的狀況。

舉例來說,如果這個值是 2.00 的話,可以想像成有兩個工作正在等待資源,換句話說,這些等待中的工作所需要的資源目前是完全使用中的。

系統中多半會有許多程式在運行,他們會因為程式本身設計的目的使用不同的資源,因此 load average 也一定程度可以反映出工作組合在特定主機設備上的狀況。

比如說,如果主機上的工作是類似資料庫或是需要大量存取檔案的應用程式,由於儲存設備相對處理器與記憶體多半是相對慢的,工作勢必是需要做一些等待來得到資料,所以在偏高的 load average 下整體而言還是可以有不錯的處理能力 (throughput) 表現。

但如果是使用處理器為主的應用程式,那麼偏高的 load average 就意味著有工作在進行單純的等待,在這個情況下如果處理能力不符合需求的話,可以考慮是不是做一些硬體資源的調整來提升處理能力。

利用這樣的特性,我們也可以透過監視 load average 來偵測到系統的工作組合是不是發生了變化。比如要是遭到了勒索軟體的入侵,由於勒索軟體會進行大量的儲存裝置操作,那麼 load average 就會衝到比平常還高的數值上。

Ref:

Sunday, July 02, 2023

Visual Studio Code 無法識別 PATH_MAX 或 realpath

利用 Visual Studio Code 寫 C/C++ 程式時,發現一些系統定義或是函數被畫了無法識別的紅色波浪 (red squiggly line) 在下面,但是真的編譯程式又會過。

原因是那些定義被放在 feature test macros (FTM) 的後面,當沒有特別給像是 -ansi, -std=c17 之類的參數時 gcc 預設會定義 _DEFAULT_SOURCE 巨集,因此編譯可以順利進行。但是 vscode 的解析器似乎是比照給了 -std=c17 之類的參數,因此這些 Linux 上特有的常數或函數定義就不會被抓到。

解決方法就是在 .vscode/c_cpp_properties.jsondefines 區塊中,加上 _DEFAULT_SOURCE=1 或是 _XOPEN_SOURCE=700 來把 Linux 上的常數或函數定義納入。或是,為求慎重的話,也可以看函數的 man page 裡面所描述的 feature test macros 需求,來決定要怎麼設定。

Ref:

Tuesday, August 09, 2022

Apache 的 name-based virtual host

在 Apache 上面 name-based virtual host 是指: 利用 Host: 這個 HTTP Header (標頭) 決定要用哪個網站組態設定來回應來自瀏覽器的請求。

Name-based Virtual Host Support 這篇文章看起來,現在 Apache 建議無論如何就設定 <VirtualHost> 就對了。

搜尋 request 要用哪個 <VirtualHost> 處理時,會先看 request 所連線的目標 IP:Port 組合,先把有 match 到的部份最精確 (exact match) 的設定挑出來,當有多個設定相符時,會進去看 ServerName 來比對。

Host header 比對 ServerName 時,雖然 Host header 可以攜帶 Port,但是比對時會被忽略,只會使用瀏覽器連線時的目標 Port 進行比對。