Skip to content

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,正式站要小心使用。

VACUUM FULL

Python 製作縮圖 (Pillow/PIL)

Pillow (PIL Fork) 10.4.0 documentation

Usage:

Read image and make thumbnails
thumb = Image.open(img)
thumb.thumbnail(i[1] , Image.LANCZOS)
# thumb = thumb.convert('RGB')
thumb.save(target_path, "JPEG")
thumb.close()

演算法可以參考下圖。 Compare Filters

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的錯誤訊息。

Linux
# 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成功,執行也沒問題。

MacOS
# install requirements
brew install jpeg
# install pillow-simd
pip install pillow-simd

總結

速度有比較快,希望有空來做benchmark。

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

git clone https://github.com/pyinstaller/pyinstaller

cd pyinstaller\bootloader 進入bootloader目錄

3. Start Build

python3 ./waf distclean all

4. Install

回到pyinstaller目錄,然後執行

python3 setup.py install

失敗的話換

pip install .

然後就可以執行pyinstaller指令了

測試結果

VirusTotal

VirusTotal服務測試

原本預設(pip install)的Pyinstaller:

pyinstaller-buildin-bootloader

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

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

白名單處理

有人佛心整理了各家防毒軟體的誤判回報區

hankhank10/false-positive-malware-reporting: Trying to release your software sucks, mostly because of antivirus false positives. I don't have an answer, but I do have a list of links to help get your code whitelisted.

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,也是可以安裝。

linux pwa

linux pwa

應用程式區有Icon了

linux pwa

執行起來長這樣

linux pwa

可以uninstall

linux pwa

PWA的真實案例

除了上面提到的MDN,還有Spotify, Uber, Pinterest... 也都有做PWA。

About Images

Image Resolution

  • The 72 PPI Web And Screen Resolution Myth

  • 72 PPI 是 80年代 Mac 定義 (配合 Macintosh 和 ImageWriter 設備)

  • 現在螢幕普遍 PPI 都比 72 PPI 高很多,電腦處理只看 width, height 不看 PPI (不同 PPI 相同 width, height, 看起來還是一樣)

  • 只有列印 PPI 才有差別

RAW

有DNG, NEF等格式,python有好用的rawpy可以直接轉換成其他格式:

RAW to TIFF範例
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 - 维基百科,自由的百科全书

camera-wb

如何知道目前Debian版本號碼

LSB (Linux Standard Base),Linux Distribution版本,代碼等基本發布訊息

lsb_release -a

一句話說出Linux發布系統跟版本

cat /etc/issue

Debian 9以後,除了基本訊息,還有一些不知道可以做什麼的 URL

cat /etc/os-release

hostnamectl就像"關於我的電腦",包含一些有用的硬體訊息

hostnamectl

但如果要知道minor version的話就要看

cat /etc/debian_version