Skip to content

Zeroplex 生活隨筆

軟體開發、伺服器和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

年份: 2025 年

PHP 的小故事

Posted on 2025 年 8 月 25 日2025 年 8 月 25 日 By 日落 在〈PHP 的小故事〉中尚無留言

我接觸 PHP 蠻久了,大概從 5.1 還是 5.2 開始用到現在 8.4,避開了聽說很雷的 PHP 4,看著 PHP 引進新的功能,到現在社群開發出各種神奇的工具。

回顧過去一些事情,我覺得很重要的事情,不只可以了解 PHP 是什麼樣子程式語言,或許也可以協助判斷其他程式語言是否適合在你手上的專案使用。


就我所知,PHP 4 到 5 主要是支援物件導向,開始可以使用 class 來設計自己所需的功能,不用擔心 function name 和其他人的衝突。在這個時候,大家可以各自在網路上下載別人寫好的類別來使用,例如那個時候「藍色小舖」就有很多工程師分享自己實做的功能,例如 MySQL driver 之類的。

一些大型的專案仍保有這類的程式,像是 dolibarr ERP 的 /htdocs/core/class 目錄下,就有多個作者實做的 class。

在這個時候,功能比較複雜的專案可能會遇到類似的問題,我想要 require 新的 class 時,發現該 class 也有 require 其他的 class,如 dolibarr 的 fileupload.class.php:

<?php

/* Copyright (C) 2011-2022	Regis Houssin			
 * ....
 */

require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';


/**
 *	This class is used to manage file upload using ajax
 */
class FileUpload
{

在 FileUpload 中需要使用到 files 和 images 這二個類別。

若現有的專案,剛好有這二個類別時,會遇到類別名稱衝突,導致 require 失敗,導致 FileUpload 沒有辦法使用。這個問題其實和更早期 PHP 的狀況相同,大家各自實做自己的 function、和別人分享 function,卻又怕遇到相同的 function 名稱導致衝突。

為了解決 dependency (相依性、依賴關係) 問題,PHP 5.3 開始支援 namespace。

透過 namespace 功能,大家為 class 和 function 設定各自的 namespace,如:

<?php

namesace Zeroplex;

class FileUpload {
}

雖然 class 名稱相同,但只要在不同的 namespace 就不會導致衝突。


再故事往下之前提一下 autoload 功能,當 require 寫到手軟時,就開始有人開始想各種偷懶的方法了。

PHP 的 autoload 功能,允許使用者在建議物件時,針對自訂的邏輯,決定要做什麼事。所以這讓帶來幾個好處:

  • 只要先定好規則,就可以透過類別名稱,找到需要 require 的檔案
  • 透過 autoload,在需要使用時再 require 檔案

當這個功能合併使用時,就獲得合併技能「要使用時在 require」,不僅可以讓程式碼可讀性增加,也可以減少 disk I/O、記憶體使用量。

例如我透過 spl_autoload_register() 先定義好 require 規則:

<?php

spl_autoload_register(function ($className) {
    $classInfo = explode('/', $className);
    $namespace = $classInfo[0];
    $className = $classInfo[1];

    echo "namespace: " . $namespace . "\n";
    echo "class name: " . $className . "\n";

    require __DIR__ . "/library/" . $namespace . "/" . $className . ".php";
}

上述設定會自動將 Zeroplex/FileUploader 拆解成 namespace 和檔案名稱並 require,執行程式時會在 new 階段透過 autoloader 來決定要去哪裡 require 檔案:

<?php

$uploader = new Zeroplex\FileUploader();
namespace: Zeroplex
class name: FileUploader

在百家爭鳴寫 library 時,還會遇到一個問題:A 和 B library 都需要用到 C library,但 A library 中任何版本的 C library 都可,而 B library 則需要 C library 的最新版。這樣開發程式時,就還需要考慮到底要使用 C library 的哪一個版本。

於是 composer 就出現了。composer 是 dependency management,會自動尋找專案中各 library 可正確運作的版本。


時間往後走一段時間, 來到 PHP 7。

PHP 7 做的最大改變,是大幅改寫直譯器,讓效能大幅提升,而且不只是快一點點而已,是快了 100%。以前為了讓 PHP 程式跑得更快,Facebook 開發了 hhvm,現在用不到了。

若想知道為什麼效能可以快這麼多,可以參考 Nikita Popov (PHP 核心工程師之一) 的簡報:PHP 7 – What changed internally?。或是聽他的演講:

除了效能以外,PHP 在此時也慢慢的提供一些資料型態的定義、檢查功能,像是在撰寫 function 時可以定義 argument 的資料型態 (type hint),除了 scalar type 也開始支援使用者自訂 class 的支援。

這些支援,讓原本是 dynamic typing 的 PHP 可以多一些檢查,程式的可讀性和穩定性上都有改善。


PHP 7 到 8 我打算很不負責任得什麼都不說直接跳過 XD

這邊列出一些有趣的專案:

  • 在 awesome-php 上有很多有趣的專案
  • 如果覺得 PHP 效能不佳,可以試試看 Swoole 以及 Phalcon,這二個 framework 使用 C/C++ 實作,在 phpize 與 PHP 串接。
  • 其實有了 interface,不只有 C/C++,連 Rust 也可以開發 PHP extension
  • PHP 沒有 non-blocking I/O?其實也有,實作方法換一下即可 ReactPHP

Tags:PHP, 資訊學習

中國廠商列表

Posted on 2025 年 5 月 30 日2025 年 5 月 30 日 By 日落 在〈中國廠商列表〉中尚無留言

前陣子,花時間慢慢把中國廠商和中資廠商記錄下來,若比較敏感的產品,可以避開這些公司。

後來發現,這件事情早就有人在做了,整理成資料庫「笨他侵略」,而且還比我敏感很多,連和辦活動有合作關係的公司都被記錄戲來。

Tags:分享, 生活雜記

Linux 個人電腦的分割區建議

Posted on 2025 年 5 月 30 日 By 日落 在〈Linux 個人電腦的分割區建議〉中尚無留言

常看到其他人建議新手分區切 / 和 /home,但覺得那是伺服器和多人共用的切法。

通常會把 /home 獨立出來,是因為多人共用主機時:

  • 儲存空間用盡可能導致 /var/log 無法寫入,導致服務中斷
  • 若要使用 Linux quota 來限制每個使用者的空間使用量,需要建立獨立的分割區

若電腦是個人使用的話,不會遇到上述問題,就不需要把 /home 獨立出來。整個分割區給 / 其實也沒問題。若擔心的話,倒是可以把 /boot 獨立出來 (看建議是保留 2 GB),開機失敗還有機會還原。

  • /boot:系統開機程式用,保守的話使用 ext 檔案系統格式,其他格式也可以
  • /:其他資料放一起就好
Tags:Linux

建立安全的密碼需要思考的一些問題

Posted on 2025 年 4 月 15 日2025 年 4 月 15 日 By 日落 在〈建立安全的密碼需要思考的一些問題〉中尚無留言

隨著電腦速度越來越快,密碼的長度以及複雜度就變得更重要。

最近正在設計新的密碼來取代原有強度不夠的密碼,以下是設計密碼時我會考量到的因素,給大家參考。

容易記憶

密碼之所以被稱作「密」碼,意思就是只有你一個人知道,其他人不應該透過任何方式,例如紙條、你的個人資料、平日對話關鍵字等方式,來得到、猜到你的密碼。

簡而言之,密碼必須記在腦裡,不應該出現在其他地方。如果密碼無法記在腦中,而必須寫在紙上,或是儲存在其他地方,這個密碼就不能算是一個安全的密碼。

長度

長度當然越長越好,因為密碼長度越長,表示要破解時猜測要花的時間也會越長。但若長度過長而導致密碼記不起來、必須透過其他方法記憶時,與前一項「容易記憶」就衝突了。

個人建議密碼盡可能超過 12 個字,而長度到多長依照個人能力而定。再透過「複雜度」讓密碼更不容易被猜到。

複雜度

可以用來當密碼的文字,可以除了數字以外,還有應無大小寫 (大寫和小寫是不同的),另外可以再加上特殊符號,如 @、&、! 等等,密碼中包含越多不同類型的文字,安全性越高。

目前大多數的系統僅支援基本英文文字與符號,因此使用中文文字或是全形符號、emoji (🤘) 來當作密碼,可能會遇到一些問題、導致部份系統發生錯誤。

到這邊應該會有人有疑問,長度要夠長、又需要包含數字、英文大小寫,還要加上特殊符號,這連寫下來都有困難,怎麼可能記得住?事實上,有一些方法可以幫助密碼記憶 (可以參考中文輸入法拆字根的方法):

  • 使用字形來幫助記憶
    • 英文的大寫 H,可以拆成二個英文小寫 l 與一個符號 -,變成 l-l
    • 英文 x 可以拆成 ><
    • 中文的 丼 可以用符號 # 來替代
    • 數字和英文的這幾個字長得很像:0、o、O,或是拆成符號表示 []
    • 當然也可以把顏文字當作密碼的一部分:/__\==b
  • 使用文字、符號的意思來協助記憶:
    • 符號 @ 有英文 at (或中文 在) 的意思,所以可以「我在睡」可以用 me@ZZzz.. 表示
    • 肯定句用 .、疑問句用 ?,有和沒有可以透過 + 或 - 來表示
    • 常用句表示法:網路上常使用 !@#$%^&* 來代表髒話,你可以建立只有自己在使用的特殊格式
  • 使用發音協助記憶:
    • 「悲劇」改為 BG、「科科」改為 kerker
    • 「好酷」改為 how、Kooool
    • 「打趴」二個字分別拆成 da 和 %
  • 用鍵盤按鍵位置記憶 (記住鍵盤按鍵位置並不是大家都做的到,但可以用):
    • 「科科」的注音對應的按鍵是 dkdk
    • 「啊」注音則會對應到鍵盤 * (有個空白沒錯)

以上應該可以讓大家多出很多增加密碼長度又不會增加記憶難度的方法。


密碼管理工具

現在有一些密碼管理工具,像是 1Password、bitwarden、KeePass,你只需要記憶一個主要密碼用來開啟密碼管理工具,而其他網站、服務的密碼,都是由管理工具隨機產生,不需要你記憶。

這樣有一個好處,你只要花時間設計並記住一個夠安全的密碼,來開啟密碼管理工具,網站、服務登入時,只要從管理工具複製帳號、密碼再貼上就好。這樣每個網站都會有完全不同的密碼,即使其中一個網站的密碼被盜用,其他網站仍然是安全的。

但這個方式也有一個缺點,就是把雞蛋放在同一個籃子,LastPass 在 2022 年被駭客入侵成功,甚至有傳言使用者密碼資料庫也被竊。

密碼管理工具並不表示絕對的安全,使用時記得搭配 2FA 工具來多加一層保護。


另外我想提一些比較沒有人在討論的問題。

行動裝置、觸控螢幕

前段有提到可以使用鍵盤的對應位置來協助建立密碼,但在寫這篇文章的當下,鍵盤可能已經不是主流的輸入工具了,可能是觸控螢幕。而使用觸控螢幕時,輸入法 app 的排版、操作方法則會是影響密碼輸入最大的因素。

Gboard 螢幕鍵盤樣式
Gboard 螢幕鍵盤樣式

超注音螢幕鍵盤樣式
超注音螢幕鍵盤樣式

以上二張圖,可以看出不同的輸入法有不同的排版,英文按鍵的位置上大多是類似的,但遇到要輸入符號,則不同輸入法可能都有不同的版面,若輸入法沒有特別為符號輸入設計,輸入包含符號的密碼會變得很麻煩,甚至常常出錯。

若如果經常使用行動裝置,可以將符號縮限在 @、#、$ 或 $ 等一些比較常用的符號,這些符號在大多數螢幕輸入法上比較容易找到。


密碼側錄與猜測方法

一些使用者平常沒注意到的地方,以及新的技術發明,導致密碼輸入時可能更容易被辨別或猜測:

  • 有些人使用的螢幕、鍵盤保護貼磨損嚴重,導致螢幕解鎖圖形、按鍵容易猜測
  • 利用熱成像攝影機,可以讓被按過的按鍵、接觸過的螢幕區塊變得很明顯,可用來猜測使用者輸入的內容。或許透過重複輸入某個文字,可以來降低猜測準確度?
  • 透過聲學辨識,可以準確得聽出使用者按下的是哪個按鍵,這還真的想不到要怎麼防

其他新的身份驗證方法

密碼並不是唯一可以用來辨識身份的方法,一些新的技術,可以讓你使用其他方法來做驗證:

  • 生物特徵辨識:透過每個人都不同的特徵來辨別人的身份,像是指紋、虹膜、臉型等等
  • FIDO:通常用做 2FA 來辨識身份,透過實體的 USB、藍芽、手機等設備,來確認使用者為本人

參考資料:

  • Create and use strong passwords – Microsoft Support
  • 設定高強度密碼並強化帳戶安全性 – Google 帳戶說明
  • Password guidelines – IBM Documentation
  • Thermal cameras could help reveal your password
  • New acoustic attack steals data from keystrokes with 95% accuracy
  • 有趣的生物辨識及應用 – 財團法人台灣網路資訊中心部落格 | TWNIC Blog
  • FIDO 是什麼? – TWCA
Tags:分享, 資訊安全

zstd 其實不支援多檔案解壓縮

Posted on 2025 年 3 月 6 日2025 年 3 月 6 日 By 日落 在〈zstd 其實不支援多檔案解壓縮〉中尚無留言

zstd 是由 Facebook 開發的一個壓縮演算法,由於壓縮率、花費時間介於 gzip 與 bzip2 之間,且支援多執行緒,近期很紅。

稍早看了 zstd 的 manual,有個 -r 參數的說明:

-r: operate recursively on directories

想說支援巢狀檔案結構,解壓縮會輕鬆一些,就直接使用 -r 來備份整個目錄:

tree -a www
www
├── docker-compose.yaml
└── .env

zstd -T4 -r www/ -o web-backup.zst

結果在解壓縮時發現問題,解壓縮以後不會還原資料結構,只會變成一個包含所有檔案內容的檔案:

unzstd web-backup.zst
web-backup.zst      : 27 bytes

ls
web-backup

查了一下資料,發現 Github 上有 issue 卻被 closed,而 StackExchange 上的文章也說明無法還原目錄結構。

如果你用了 zstd -r 的話,請注意資料可能無法復原,還是使用 tar 比較保險。


tar 使用 -z 時,會使用 gzip 壓縮檔案內容,指令大概長這樣:

tar zcvf web-backup.tgz www/

若要使用 bzip2 時,參數則為 -j:

tar jcvf web-backup.tbz www/

若想要使用 zstd,可以透過 tar -I 的參數來指定要使用的壓縮工具:

  • 使用 pigz 來壓縮:tar -I pigz -cvf web-backup.tgz www/
  • 使用 lbzip2 來壓縮:tar -I lbzip2 -cvf web-backup.tbz www/
  • 使用 zstd 則是:tar -I zstd -cvf web-backup.tbz www/

zstd 預設只會使用 1 個執行緒來壓縮,若要支援多個執行緒記得加上 -T 參數:

tar -I 'zstd -T4' -cvf web-backup.tbz www/
Tags:Linux

文章分頁

1 2 下一頁

其他

關於我  (About me)

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Ubuntu Unix Vim Web Windows WordPress XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.