跳到主要內容

發表文章

目前顯示的是 2020的文章

編輯器無法使用 Tab 縮排

在編寫程式時的縮排,我喜歡用 Tab 多於空白。最近在寫 Laravel 時卻發玩編輯器都轉用了空白,無論我怎樣設置也是一樣。後來發現編輯器會跟據當時目錄中的 .editorconfig 內容來影響設定。於是打開 .editorconfig 檔,把裡面的 space 改為 tab 就沒再出現空白的情況。

在 Raspberry Pi 4 上安裝 Pandas DataReader

如果在 Raspberry Pi 4 上的 Ubuntu 18.04 以 pip 指令安裝 Pandas DataReader,會出現報錯內容。主要問題是找不到 libxml2 檔案。網上的解決方案是用 apt-get 去安裝 libxml2,在我的情況下沒有改善。原來不單止要安裝 libxml2,還需要 libxslt。正確方法如下: $ sudo apt-get install libxml2-dev libxslt-dev $ pip3 install lxml $ pip3 install pandas-datareader

Raspberry Pi 4 伺服器軟體設定

按照之前的步驟把 Ubuntu 18.04 安裝好到 Raspberry Pi 4,還用上了 SSD 作為主要儲存媒體。下一步便是安裝所需軟件。在這之前,先做一下更新,確保所有資源都是最新。在 Raspberry Pi 4 上登入 Console 並輸入: $ sudo apt-get update $ sudo apt-get upgrade $ sudo apt dist-upgrade $ sudo reboot $ sudo apt-get install ubuntu-desktop $ sudo apt-get install -y xterm $ sudo apt-get install python3.7 $ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 $ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2 $ sudo update-alternatives --config python3 為了安全起見,先建立一個新用戶並把它加到 sudo 群組。往後就是用這個帳號來做設定: $ sudo adduser sitachan $ sudo usermod -aG sudo sitachan 這時回到 macOS 的 Terminal,測試新帳號能否登入: $ ssh sitachan@192.168.1.100 $ exit 除了使用密碼登入 SSH 外,還可以 SSH Key 來登入,能省卻了輸入密碼的步驟。在 macOS 的 Terminal 下輸入: $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/Users/home/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been sa…

架設 Raspberry Pi 4 以 SSD 起動

Raspberry Pi 必須要以 SD 卡啟動,至少就目前來說是這樣。我希望它能以 SSD 作為主要儲存媒體。要達到這個目的,需要做一點修改。以下是在 macOS Catalina 的步驟。


首先,到 https://ubuntu.com/download/raspberry-pi 下載 Ubuntu 18.04 64-bit 版本。把影像檔以 balenaEtcher 分別燒錄到 SD 卡及 SSD。在 Terminal 輸入 lsusb。把 SSD 以 USB 接上電腦,然後再輸入: $ lsusb 查看多出來的一行的 SSD 的編號。如上圖所示,我的 SSD 編號是 152d:0583,把它記錄下來。插入 SD 卡,打開 /nobtcmd.txt。把「root=LABEL=writable」改為「root=/dev/sda2」。如果使用的是非 ORICO 連接合,則需要在行首輸入「usb-storage.quirks=152d:0583:u 」,那是剛才得到的 SSD 編號。這是告知 Raspberry Pi 啟動的裝置是 SSD。


把 SD 卡和 SSD 都接上 Raspberry Pi 4,然後開機。當成功運行後,輸入:
$ findmnt -n -o SOURCE / 如果顯示 /dev/sda2 代表了正在使用 SSD 作為主要儲架媒體。再以: $ df -h 觀看 SSD 的大小。我的 SSD 是 512GB,看到哪個 470G 就是了。
參考:
https://krdesigns.com/articles/raspberry-official-ubuntu-18.04.04-bootable-from-USB-SSD-drive
https://jamesachambers.com/raspberry-pi-4-usb-boot-config-guide-for-ssd-flash-drives/

安裝新伺服器硬體

公司的 Raspberry Pi 4 是二十四小時全天候運行,它的透明塑膠外殼附帶了一把小風扇能有效散熱,只感到微微的溫暖。我的 Raspberry Pi 是用來作為伺服器,熱力可能會更高,所以選擇了散熱效能更強的外殼。


星期一在淘寶以 ¥60 購買了這款外殼。它是由鋁製成,還附帶了兩把小風扇;金屬外殼與晶片之間貼上了導熱矽膠,能把熱力快速傳播並由冷風帶走。希望不會使伺服器的溫度太熱。


安裝好 SSD 儲存裝置後,便是我新的 Raspberry Pi 4 伺服器了。

安裝 SSD

我喜歡 ORICO NVMe M.2 SSD Enclosure TCM2-C3 的透明設計。它的包裝普通而細心。一條 USB Type-A 到 USB Type-C 線、一條 USB Type-C 到 USB Type-C 線、一支小螺絲批、兩片導熱矽膠。


SSD 方面,了解過不同牌子和型號,選擇了 Seagate 512GB BarraCuda 510 M.2 2280。可是到旺角電腦中心購買時沒有貨,選擇了這款次選的 ADATA 512GB XPG SX8200 Pro M.2 2280。除了一片 SSD 外,還附帶一片散熱片。


ORICO 的盒子只要輕輕一推便能鬆開。要拿出電路板,把 SSD 安裝進去。


在 SSD 末端裝上卡關螺絲後,把電路板放回盒子。然後在 ORICO 的散熱板背部貼上導熱矽膠。位置是隨意地貼。我選了 SSD 晶片較集中的位置。


最後把蓋子合上就完成安裝 SSD 的步驟。這就是新伺服器的儲存裝置。

選擇新伺服器硬件

家中帶有光碟機的 Mac mini Server 是很多年前的產品,已經變得很慢。雖然它還能提供服務,但就不能切合時代變遷的需求,是時候退下來到蘋果產品博物館。從功能、體積、效能、價錢各方面的考慮後,新的伺服器將選用 Raspberry Pi 4 + 512GB SSD。

伺服器是 24 小時運作,如果單純用大容量 SD 卡的話,速度是夠快,但壽命則不會長久。SD 卡及 Flash Drive 的設計是讀寫頻率低的工作。既然是全天候運作,得找讀寫頻率高的設備。SATA 硬碟及 SSD 硬碟就能滿足這個需求。我希望裝置細小、快速、安靜、堅固,預算在 HK$600 左右。SSD 有符合這些條件的選擇。

SSD 有兩種設計。一種是細小的盒子,以 USB Type-A 線連接;另一種是手提電腦用,像記憶體般的 m2 格式電路板。Raspberry Pi 4 沒有相關接合,須另購連接盒;能以 USB Type-C 線連接。有了盒子的話,兩者都方便攜帶。然而,前者的傳輸速度多為每秒 540MB;後者則多為每秒 3400MB。USB Type-C 的傳輸上限為每秒 20G bps,約是 2500MB 左右。而 Raspberry Pi 4 只有 USB Type-A 3.0 接口,速度是 5G bps,約是 640MB 左右。意味著用 m2 也最多只有這種速度,確是有點浪費。不過,小盒子與 m2 在相同容量的價錢只相差 HK$100 左右。在眾多品牌和型號中,我選擇了後者的 ADATA 512GB XPG SX8200 Pro M.2 2280 PCIe Gen3x4 SSD。外置盒則選擇 ORICO NVMe M.2 SSD Enclosure TCM2-C3,喜歡它的外形和透明設計。

武漢肺炎強制家居檢疫趨勢圖

武漢肺炎疫情持續有一個多月了。我們身處數位時代,香港政府的資料一線通提供了滯後的「根據香港法例第 599C 章正在接受強制家居檢疫人士所居住的大廈名單」。雖為何會說滯後?因為強制家居隔離十四天,如果數據是 3 月 10 日,理應完成隔離的時間是十四天的 3 月 23 日。當然輸入資料需時,但也不用四天吧。雖然資料滯後,但還是有參考價值。

利用 Python 3.7 + Pandas 把 CSV 數據載入並以圖表顯示,能讓我們更容易了解箇中的趨勢變化: import datetime import pandas import numpy from matplotlib.font_manager import FontProperties import matplotlib.pyplot as plot %matplotlib inline ## Read CSV data dataPath = "../Dataset/Coronavirus Disease (COVID-19)/20200311_home_confinees_tier2_building_list.csv" data = pandas.read_csv(dataPath) ## Convert string to datetime fieldName = data.columns[3] data[fieldName] = pandas.to_datetime(data[fieldName], format='%d/%m/%Y') _title = '衛生署 COVID-19 家居隔離 599C 資料' count = data.shape[0] _csvNote = '截至 2020 年 3 月 11 日,共 '+str(count)+' 人' ## Prepare title fieldName = data.columns[3] x = data[fieldName].to_numpy() fromDate = numpy.amin(x) fromDateString = pandas.to_datetime(str(fromDate)).strftime('%b-%d')…

測試股票買賣演算法

昨天學習到利用 Pandas DataReader 取得過往股票數據;今日嘗試編寫股票買賣演算法去估算資產收益。如果十年前以 HK$100,000 本金去購買兩隻股票,到今日資金會變成接近 $37 萬或 $20 萬。看來成效不錯。繼續修改演算法,看看會否有更好的成績,或是不論哪隻股票也是有這樣的表現。

Pandas DataReader

瀏覽網頁時,發現到一個叫 Pandas DataReader 的 Python 模組,能讓程式猿輕易取得過往的股票數據;不論是美股還是港股,都能提取;而且是免費呢。真的十分方便。安裝方法如下: pip3 install pandas-datareader

NFC Checkin 開發結果

離開了 iOS 最新技術有幾年時間,變得生手。這個項目,由最開始用 SwiftUI 建構畫面失敗,換回 Objective-C 而藍牙 Framework 出事,還是要轉回 Swift,今次嘗試純 Swift 5。邊學邊做,花了 22 小時完成了一個 NFC Solution。能成功辨認到 MiFARE Classic 1K 卡的獨立編號很有滿足感。看似是小事,但這是 Vendor 說的不可能,我把它實現。遇到 Framework 沒有觸發時的 Callback,要令到 Solution 好用、快速、簡單,想到用 Threading 方法解決。重重難題都解決了,下一步是找個場合正式使用。

用 PIL 把 PNG 轉成 Webp

自行修改的 WhatsApp Sticker 應用程式在幾個月前加入了 Pack URL 安裝功能,不用再把 PNG 轉成 Webp 後再打包上 TestFlight,流程加快了很多。經過幾個月後,老人家忘了如何把 PNG 轉成 Webp,需要在這裡記載一下: from PIL import Image image = Image.open("snake.png") image.save("snake.webp", "webp")

ACR1255U-J1 入手

最近由於武漢肺炎疫情,買了一批口罩給員工;大家取得口罩時要簽名作實。要花時間簽名之餘,之後還要同事把資料輸入電腦,這個流程效率不好。公司有一套拍卡出勤系統,每位員工都有一張 NFC 員工證。如果同事能拍一拍卡便拿到口罩,時間及姓名自動數碼化,效率便能提升。於是著手構思一個流動的拍卡系統。

在網上搜尋過資料,得出兩個方向。一是購買 NFC 讀卡器,配合手機應用程式或網頁程式運作;另一個是購買帶有 NFC讀卡功能的 Android 手機。考慮過不同情況,最終選擇了前者。在眾多的讀卡器中,選擇了這台 ACR1255U-J1 藍牙讀卡器。它支援 iOS 及 Android 系統;有相關 SDK 給我開發手機應用程式。能直接以 USB 線連接電腦。看來是抗展性很高的產品。