Debian 12 不再允許直接使用 pip 安裝套件。
就算是 root 也不行。
我還回頭測了 Debian 11,並沒有這項限制。
政策變化內容
看看 pip3 install 的錯誤訊息:
$ pip3 install pycryptodome
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.
Debian 12 已經移除 PHP 7.4 套件,只留 PHP 8.2 套件。
不幸的是,有些 PHP 程式還沒有升級到 PHP 8.2。
為了這些舊程式,我編譯打包了 php7.4-compat 套件。
下載 php7.4-compat_7.4.33_amd64.deb。這個下載點大概放到2024年12月吧。
為了執行舊 PHP 程式,使用 docker 跑 Debian 11 容器也是可行的解決方案。
只是容器內的 PHP 7.4 參照的動態連結函式庫是 Debian 11 的套件版,也就是版本較舊。
而自行編譯的方式, PHP 7.4 參照的函式庫會是 Debian 12 的套件版。
由於編譯依賴的套件相同,此法的 PHP 7.4 將和 PHP 8.2 共用相同的動態連結函式庫,是新的版本。
只是 PHP 7.4 的程式碼本身還在用 OpenSSL 1.1.1,所以多連結一個 libssl1.1。
說到 SSH 多組金鑰與帳號管理的需求,我會從 GitHub Desktop 說起。
GitHub Desktop 是個很好用的 git GUI 工具,缺點是它設計上只會記一個 GitHub 帳號。
若你有好幾個 GitHub 帳號,照 GitHub Desktop 設計的操作邏輯,你要重複登出登入切換帳號。
但我們其實可以利用 SSH 金鑰管理機制,直接存取不同帳號的源碼庫。
此外,如果你有申請多家雲端服務商,而他們支援 SSH 連線的話,也是用同一套機制管理多個帳號。
本文分兩章。第一章說明 SSH 金鑰基本操作。第二章說明管理多組金鑰的方式。
- 建立一組金鑰
- 管理多組金鑰

各版本 Linux 散佈套件中,基本都有三款只提供「桌面共用」功能的 VNC 工具。
它們不提供「遠端登入」功能。
我安裝的舊電腦是一台工業用電腦,將近 15 年前的硬體規格。
我最初拿 x86_64 的 Linux USB 作業碟開機,看到 CPU 不支持 x86_64 的訊息時,讓我驚訝不已。
其配置規格為:
- VIA C7 CPU。x86 32 位元 CPU,不支持 x86_64。
- 主機板晶片組內建 S3 UniChrome 顯示晶片。
- 1 GB RAM。
- 2 GB CF 記憶卡。早期工業用電腦常用 CF 記憶卡作為 IDE 磁碟裝置。
就算是 Debian 也很難在這種配置下裝視窗環境。所以我選擇了更精簡的 Alpine Linux。
本文整套安裝結束,清除 /var/cache/apk ,最後用了 root 分割區大約 750~800 MB。
有個客戶最近向財政部申請電子發票服務,問我能不能幫他們的 POS 系統加上列印電子發票的功能。
技術上不難,但向公家機關打交道的事,規格才是最重要的。
總之看看「財政部電子發票證明聯一維及二維條碼規格說明」。
但我萬萬沒想到這種公開規格的事,竟然可以搞成尋寶大冒險遊戲。
絕大多數使用者在安裝 Debian/Ubuntu 之後,會修改 apt 的 sources.list ,完全使用網路上的套件庫,取消 CD 來源。但本文的操作相反,僅使用 Debian/Ubuntu 的 CD/DVD 內容作為套件庫來源。本文適用情境:
- 舊版本系統,官方已經移除網路上的套件庫。
- 主機網路不連外。
以上情境需要管理者事先從網路下載完整的光碟影像,並將光碟中的套件資訊匯入 apt 資料庫。日後需要安裝套件時,apt 就會提示管理者需要插入第幾片光碟。一般還需要手動修改 sources.list 加一些選項, apt 才不會丟出套件來源不能認證(can’t be authenticated)的錯誤。
本站參加 Google AdSense 計畫。日前收到通知「自 2024 年 1 月 16 日起,AdSense 發布商除了遵守《歐盟地區使用者同意授權政策》規定以外,還必須採用 Google 認證且已整合 IAB 資訊公開和同意聲明架構 (TCF) 的 CMP」。為了符合 Google AdSense 規定的隱私權透明揭示原則,增加
「隱私權政策」聲明頁。頁面連結固定可見本站最下方頁腳處。
抱怨一點,Google 怎麼不直接提供隱私權政策的定型化範本。一般人哪知道該寫什麼內容。
安裝 Ubuntu 22.04 後,按照 Jekyll on Ubuntu 的說明,安裝 Jekyll 所需套件與環境。
sudo apt-get install ruby-full build-essential zlib1g-dev
echo 'export GEM_HOME="$HOME/gems"' >> ~/.bashrc
echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
gem install jekyll bundler
安裝完成後,先建立一個測試 Jekyll 用的目錄。例如 jekyll-test 。
mkdir jekyll-test
cd jekyll-test
jekyll new --skip-bundle
這會建立一個全新網站的 Jekyll 專案目錄,但還要修改它的 Gemfile ,改用 github-pages 套件管理內容。
NetworkManager 是目前各種 Linux 散佈套件最常用的網路連線管理工具。預設配置就會安裝這套工具。它提供了多種 GUI 管理工具,一套命令列工具,也允許使用組態檔設定。本文說明如何以命令列工具或組態檔做基本的網路連線設定工作。
- GUI 工具: 有很多種。但通常 GNOME 的 nm-applet (套件名 network-manager-gnome) 就足夠了。它在 KDE 或 LXDE/LXQt 桌面環境也能用。
- 命令列工具: nm-cli。
- 組態檔: nm-settings-keyfile。
因為 Twitter (改名 X) 撤除了活動 Timeline 功能,故本部落將首頁側欄內容改成 Profile Timeline 。
We retired the Likes, Collections, and Moments timelines on January 13, 2023.
You can learn more about this change in our announcement
其實資本論根本沒寫完w
我記得熊彼得吐槽馬克思出版資本論第一卷後,讀了邊際理論,然後資本論剩下的內容就寫不下去了。
ps.馬克思學的是李嘉圖的古典理論
No.29651168
這我倒是第一次聽說,所以馬列信徒的聖經根本是個沒寫完的破書嗎www
「關於我寫到一半寫不下去的理論半成品被野心革命家當作革命聖經放送這件事」
本文內容以 .NET 6 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。
在 .NET 平台上,有兩種主要的計時器類別(Timer),分別是:
在一些 .NET Framework 文件中,還會提到其他種類的計時器類別,例如 System.Windows.Forms.Timer 。但看名字就知道,那些計時器類別綁定在 UI 庫或 Windows 系統上。而本文提到的這兩種計時器則具有普遍性,不會妨礙 .NET 程式的跨平台運行能力。
本文內容以 .NET 6 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。
我們有很多種方法可以結束一個執行中的程式。例如一個在指令列執行的程式,可以按下 Ctrl + C 打斷它。又或者是「工作管理員」這類的工具,也會提供「結束工作」按鈕讓使用者終止指定的程式。 Linux 用戶熟悉的 kill 指令也是一個用外部工具終止程式的方法。
在 Unix/Linux/BSD/macOS 系統,上述操作都統一在 signal 訊號機制。例如 Ctrl + C 實際上觸發 SIGINT 訊號; kill 默認發出 SIGTERM 訊號;強制終止程式觸發 SIGKILL 訊號。具體列表請見 GNU libc manual - Termination Signals。在 Windows 系統上其實也有類似的方法,不過本文重點是 .NET 平台。
本文內容以 .NET 6 或更新版本為目標平台。我不用 .NET Framework ,不保證適用。
Named pipe (具名管道) 在 .NET 上不是新玩意,早在 .NET Framework 3.5 時就已提供 NamedPipeServerStream / NamedPipeClientStream。
但是自 .NET 6 起,它的底層實作技術改變了。
如果你想讓其他程式語言開發的程式 (非 .NET 平台) 和 NamedPipeServerStream / NamedPipeClientStream 程式溝通,必須知道這件事。
我有一個用 .NET Core 3 寫的具名管道服務程式,前陣子想用 .NET 6 發佈到 Linux 跑。結果原先用 FIFO 寫的客戶端程式接不上。一番研究後,才知道 .NET 6 改了具名管道的底層實作技術。