Tech
Python Tkinter的Listbox無法scroll
環境: Windows 11, Python 3.8
用鍵盤上下鍵觸發Listbox.yview_scroll也沒反應。
這個很詭異的問題是下拉選單原本是用python預設的srcoll動作,但是選項小於15個時, 不會有scroll的反應, 目前用手動加上scrollbar解決。
PostgreSQL刪除一堆欄位資料,資料庫佔用硬碟空間反而變大
一個原本佔用磁碟空間25.921GB的資料庫,刪除某個欄位內容資料(SET foo=''),大概1000萬筆資料,發現資料庫佔用空間反而變大: 33.478GB(花了1703秒)。
PostgreSQL有個VACUUM指令,試用看看,果然執行完磁碟空間變成24.8GB(花了1106秒)。
VACUUM FULL清的最乾淨,但是花時間,而且會lock table,正式站要小心使用。
Python 製作縮圖 (Pillow/PIL)
Pillow (PIL Fork) 10.4.0 documentation
Usage:
thumb = Image.open(img)
thumb.thumbnail(i[1] , Image.LANCZOS)
# thumb = thumb.convert('RGB')
thumb.save(target_path, "JPEG")
thumb.close()
演算法可以參考下圖。

screenshot via: Filters
Pillow-SIMD
Uploadcare提供了SIMD加速的Pillow: uploadcare/pillow-simd: The friendly PIL fork
Benchmark測試 Pillow Performance
Linux
CPU: Intel Celeron N4505 2.0GHz
安裝libjpeg-dev, zlib1g-dev後,安裝pillow-simd才會成功。但執行python出現illegal hardware instruction的錯誤訊息。
# install requirements
sudo apt install libjpeg-dev zlib1g-dev
# install pillow-simd
CC="cc -mavx2" pip install -U --force-reinstall pillow-simd
MacOS
MacBook Pro: 3.1GHz Intel Core i7
用brew安裝jpeg後,安裝pillow-simd成功,執行也沒問題。
總結
速度有比較快,希望有空來做benchmark。
拿到Excel資料是1個欄位,很多列(Row),要變成1列很多欄(Column)的形狀
先把Excel變成csv (編碼要特別選UTF-8)
然後整裡ChatGPT給我的答案,我只取我容易理解的。
用tr把換行改成逗號,再輸出成output.csv:
裡面還會有Windows的^M換行符號,再用tr去除一次:
tr真好用,懶人的sed。
Python 打包成Windows的exe檔遇到被當成病毒的問題
StackOverflow都是說自己build PyInstaller的bootloader可以解決,因此參考: Building the Bootloader — PyInstaller 6.3.0 documentation
Build PyInstaller bootloader
1. 準備build環境 (GCC...)
試了自己build MinGW,遇到zlib static找不到的問題。
發現這包(WinLibs - GCC+MinGW-w64 compiler for Windows)可以直接使用,方便很多。
(另外也許可以用MSYS2,目前還沒試過)
2. Build from PyInstaller source code
cd pyinstaller\bootloader 進入bootloader目錄
3. Start Build
4. Install
回到pyinstaller目錄,然後執行
失敗的話換
然後就可以執行pyinstaller指令了
測試結果
VirusTotal
用VirusTotal服務測試
原本預設(pip install)的Pyinstaller:

用另一套Nuitka (先轉成C++,功能強大),但是也會被誤判。

Custom build PyInstaller的bootloader看起來就好很多了,實際上還需要更多驗證。

白名單處理
有人佛心整理了各家防毒軟體的誤判回報區
Blog說明 How to stop your Python programs being seen as malware | by Mark Hank | Medium
PWA(Progress Web App)原來真的是App
目前使用的Floorp瀏覽器更新,提到這次更新支援Windows的PWA(Progress Web App)跟SSB(Site-specific browser)。好奇去看了一下Floorp blog對PWA的介紹Floorp のプログレッシブウェブアプリの機能と仕様 | ABlog,內文用MDN這個開發網頁常需要查找資料的網站來當例子,原來PWA在瀏覽器上安裝後,在系統的應用程式圖示裡就真的會有一個新的Icon跑出來,執行的話就像是特別開一個網頁的應用程式。
引起我的興趣,我之前一直以為PWA跟RWD(Responsive Web Design)差不多,只是過幾年固定會出現的技術Buzz Word,原來他真的是接近原生App那樣的執行,操作界面在各種多到爆炸的前端工具/框架的網頁世界裡,開發起來真的是方便很多,還有service workers可以支援離線,雖然我覺得比起Native App還有很多先天無法克服的,但是已經是從網頁、網頁的擴充功能(extension)那邊跨出很大的一步了,想到一些之前開發桌機App考慮用到類似Electron的工具,現在知道了PWA,還有另一種不同的選擇了。
在Linux用Chromium安裝PWA
目前Floorp只支援Windows,試試看Linux(Debian 12 Bookworm)的Chromium,也是可以安裝。


應用程式區有Icon了

執行起來長這樣

可以uninstall

PWA的真實案例
除了上面提到的MDN,還有Spotify, Uber, Pinterest... 也都有做PWA。
About Images
Image Resolution
-
72 PPI 是 80年代 Mac 定義 (配合 Macintosh 和 ImageWriter 設備)
-
現在螢幕普遍 PPI 都比 72 PPI 高很多,電腦處理只看 width, height 不看 PPI (不同 PPI 相同 width, height, 看起來還是一樣)
-
只有列印 PPI 才有差別
RAW
有DNG, NEF等格式,python有好用的rawpy可以直接轉換成其他格式:
import rawpy
import imageio
path = 'image.nef'
with rawpy.imread(path) as raw:
rgb = raw.postprocess()
imageio.imsave('default.tiff', rgb)
postprocess的參數: Params class — rawpy 0.22.0 documentation
- use_camera_wb: default
False。結果如下圖: 左邊是True, 右邊是False,不知道原理,但左邊看起來比較正確。 - output_bps: default
8。8 的話檔案是1百多MB,設定成16的話是2百多MB,我看不出差別。 - otuput_color:
rawpy.ColorSpace.ProPhoto。不懂,有空再來研究 ProPhoto RGB - 维基百科,自由的百科全书

如何知道目前Debian版本號碼
LSB (Linux Standard Base),Linux Distribution版本,代碼等基本發布訊息
一句話說出Linux發布系統跟版本
Debian 9以後,除了基本訊息,還有一些不知道可以做什麼的 URL
hostnamectl就像"關於我的電腦",包含一些有用的硬體訊息
但如果要知道minor version的話就要看