作者: Jerry Lin

  • 處理 Facebook 官方 SDK PHP 版本過時問題

    實作 Facebook 登入時,如果使用官方提供的 Facebook PHP SDK,會遇到登入時使用 oAuth 的 function 過時的問題,至目前為止官方尚未發表更新處理。

    參考:

    facebook/graph-sdk is deprecated and doesn't support PHP 8
    Problem/Motivation facebook/graph-sdk is a dependency of socialfeed, but it has been moved to: facebookarchive/php-graph-sdk and hasn't been updated in 2 years. It also doesn't support PHP …

    目前的解決方法是有好心人發布 fork 的版本。可參考上述討論串,用 composer 安裝。目前已測試可使用的 package 參考這裡。該版本要求 PHP 7.3 以上,可於 PHP 8.0 上執行。

    nickdnk/graph-sdk – Packagist
    Facebook SDK for PHP compatible with PHP8
  • 製作 Ubuntu 遠端桌面伺服器

    有時我們會需要安裝一個雲端的伺服器是有 GUI 介面可以操作的,舉例像是用模擬器爬爬蟲,或是需要遠端協作需求的人,會需要在雲端伺服器上安裝一個桌面伺服器。

    先提一下會有缺點:

    1. 通常雲端 VPS 廠商不會有顯卡,所以遠端桌面勢必顏色和顯示上不會太好。
    2. 雲端廠商的規格和價格成正比,勢必無法和自己使用電腦上比較。
    3. 即便使用 GUI 介面,他畢竟是一台伺服器,你能連上表示其他人也能連,常常很容易忽略了伺服器需要設定的安全機制。

    這邊使用 Linode Ubuntu 22.04 安裝,安裝目標:

    1. Gnome desktop 環境
    2. XRDP 遠端桌面連線

    捨棄 Linode 文件中描述的 VNC 連線,是因為怎麼裝都連不起來…曾經懷疑是不是 Gnome 安裝錯了,後來發現根本是 VNC 設定有問題,果斷使用 XRDP 來處理。

    步驟:

    1. 首先參照 Linode 文件 確認購買一個伺服器,並且設定好伺服器時區\hostname\更新等等。
    2. 如果不使用 tasksel 安裝,則使用以下指令:
      sudo apt install ubuntu-desktop gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal
    3. 如果使用 tasksel 安裝,請參考這裡 
      sudo apt install tasksel
      sudo tasksel install ubuntu-desktop
    4. 安裝 xrdp 功能,文件中使用的 OS 是 ubuntu 18.04 不過用 22.04 也行的:
      sudo apt-get install xrdp -y
    5. 如果使用 ufw 套件(可用 ufw status 或是 iptabes -h 指令檢查):
      sudo ufw allow 3389/tcp
    6. 如果使用 iptables 套件:
          1. 編輯設定檔案:
            nano /etc/v4
          2. 輸入內容並儲存(注意要開啟 3389 port):
            *filter
            
            
            # Allow all loopback (lo0) traffic and reject traffic
            # to localhost that does not originate from lo0.
            -A INPUT -i lo -j ACCEPT
            -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
            
            
            # Allow ping.
            -A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
            
            
            # Allow SSH connections.
            -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
            
            
            # Allow HTTP and HTTPS connections from anywhere
            # (the normal ports for web servers).
            #-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
            #-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
            -A INPUT -p tcp --dport 3389 -m state --state NEW -j ACCEPT
            
            # Allow inbound traffic from established connections.
            # This includes ICMP error returns.
            -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
            
            
            # Log what was incoming but denied (optional but useful).
            -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7
            
            
            # Reject all other inbound.
            -A INPUT -j REJECT
            
            
            # Log any traffic that was sent to you
            # for forwarding (optional but useful).
            -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7
            
            
            # Reject all traffic forwarding.
            -A FORWARD -j REJECT
            
            
            COMMIT
          3. 編輯設定檔案:
            nano /etc/v6
          4. 輸入內容並儲存:
            *filter
            
            
            # Allow all loopback (lo0) traffic and reject traffic
            # to localhost that does not originate from lo0.
            -A INPUT -i lo -j ACCEPT
            -A INPUT ! -i lo -s ::1/128 -j REJECT
            
            
            # Allow ICMP
            -A INPUT -p icmpv6 -j ACCEPT
            
            
            # Allow HTTP and HTTPS connections from anywhere
            # (the normal ports for web servers).
            #-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
            #-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
            
            
            # Allow inbound traffic from established connections.
            -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
            
            
            # Log what was incoming but denied (optional but useful).
            -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7
            
            
            # Reject all other inbound.
            -A INPUT -j REJECT
            
            
            # Log any traffic that was sent to you
            # for forwarding (optional but useful).
            -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7
            
            
            # Reject all traffic forwarding.
            -A FORWARD -j REJECT
            
            
            COMMIT
        1. 執行指令:
          iptables-restore < /etc/v4;/sbin/iptables-save;ip6tables-restore < /etc/v6;/sbin/ip6tables-save;
    7. 設定 polkit 添加授權規則,編輯檔案:
      sudo nano /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf
    8. 輸入以下內容後儲存,這主要功能是色彩管理避免需要多次輸入密碼:
      polkit.addRule(function(action, subject) { if ((action.id == "org.freedesktop.color-manager.create-device" || action.id == "org.freedesktop.color-manager.create-profile" || action.id == "org.freedesktop.color-manager.delete-device" || action.id == "org.freedesktop.color-manager.delete-profile" || action.id == "org.freedesktop.color-manager.modify-device" || action.id == "org.freedesktop.color-manager.modify-profile") && subject.isInGroup("{group}")) { return polkit.Result.YES; } });
    9. 重啟 XRDP:
      sudo /etc/init.d/xrdp restart

    連線時 windows OS 用戶使用內建的遠端桌面連線工具即可, MacOS 用戶推薦使用 Microsoft Remote Desktop 這套軟體。

    其他額外你可能需要的東西

    1. 安裝 Chrome: https://linuxize.com/post/how-to-install-google-chrome-web-browser-on-ubuntu-20-04/
    2. 安裝 Telegram:https://linuxhint.com/install-telegram-desktop-messenger-linux/

     

    參考文件:

    1. https://www.linode.com/docs/guides/set-up-and-secure/
    2. https://www.linode.com/docs/guides/install-vnc-on-ubuntu-20-04/
    3. https://operavps.com/linux-vps-with-gui-and-rdp/
    4. https://documentation.suse.com/zh-cn/sles/15-SP2/html/SLES-all/cha-security-policykit.html
  • Progressive Web Application(PWA) 製作

    PWA 又稱「漸進式的網頁應用程式」,有很多文章已經有說明,參考這裡,或是參考這個都有說明。

    這次介紹一個 PWA 的好用工具:

    PWABuilder
    All the tools you need to build and deploy your Progressive Web Apps.

    操作方法簡化非常多,開始之前要注意幾件事情:

    • 準備一張  512×512 的 png logo (如果原本 logo 不夠大的話)
    • 要確保有更改網站內網頁的權限
    • HTTP Server 要注意安全性配置是否會阻擋根目錄的 json 和 js 檔案
    • 網站一定要有合規的 HTTPS 憑證使用

    首先進入網站以後輸入網址。
    系統便會開始撿測需要的資源,會給一份報告告訴你缺什麼,或是已經有了什麼。如下圖,會發現 PWA 需要的 Manifest.json 和 server-woker.js  都沒有,這時點擊一下右下角的 next 按鈕。

    點擊之後,會產生可以下載的 PWA 必要文件檔案。依照提示點擊 Generate 按鈕,下載必要檔案。
    下載完成解壓縮後,資料夾中會有如下檔案,點開 next-steps.html 會提示接下來要做的事情。
    next-steps.html 會導向 https://github.com/pwa-builder/pwabuilder-web/blob/V2/src/assets/next-steps.md 這個網址。簡單來說要做五件事情。

    1. 把目錄裡面的 manifest.json 上傳到網站根目錄。
    2. 把 pwabuilder-sw/pwabuilder-sw.js 上傳到網站根目錄
    3. 把準備好的 logo 改名 app-icon-512×512.png(預設 manifest.json 會吃 favicon.ico 可以從檔案中修改)
    4. 在網頁 header 中添加以下兩串代碼
      <link rel="manifest" href="manifest.json" />
      <script type="module">
         import 'https://cdn.jsdelivr.net/npm/@pwabuilder/pwaupdate';
         const el = document.createElement('pwa-update');
         document.body.appendChild(el);
      </script>
      
      

       

    以上,恭喜完成一個 PWA 基本配置,更進階的使用可以參考 manifest.json 中的配置:

    Web App Manifest | MDN
    Web App manifest 是一個 JSON 格式的文件,它提供了應用程式相關的資訊(像是名稱、作者、圖示、描述)。 manifest 的功用是將 Web …

    這裡面有詳細說明。像是如果要讓主畫面圖片更清晰,可以在 manifest.json 把 icons 參數調整過。

    值得一提的有幾個設定:

    —-

    安卓手機上使用 PWA 方法,請參考這裡

    iOS 上就是開 safari 然後把網站加入主畫面就行啦,參考這裡

    同場加映:

    Progressive Web App 加入主畫面 : PWA 究竟加入和安裝了什麼 (2) – iT …
    加入主畫面 (Add to Home screen) 加入主畫面 (Add to Home screen) 常見的縮寫為 A2HS,可以看成是讓使用者將 Web App 進行 "安裝&quo…
    iOS PWA Compatibility-firt.dev
    What's supported on Safari on iOS and iPadOS for Progressive Web Apps
    Day 02 – 30 天 Progressive Web App 學習筆記 – 為什麼需要 PWA? – iT …
    為什麼需要 PWA? 很多人認為網頁沒辦法跟原生的 APP 相提並論,因為網站沒辦法像原生 APP 一樣快速、可靠、高互動等等 PWA …
    將您的網站轉換成高品質PWA
    使用 PWA Builder 從現有網站建立高品質的PWA

     

  • Hestiacp 安裝筆記

    最近再找一款能夠方便架站自由度也高的管理面板,主要是為了架設 LEMP 的環境,於是找到這款 Hestiacp 。這是 Vestacp 的兄弟款,不過 Vestacp 已經沒有維護了。

    先講結論:
    這是一款學習門檻較高的 panel,建議提供給已經熟悉使用 debain / ubuntu 的管理員,可以做一個屬於自己的習慣的模版和 SOP,對於較為複雜的 LEMP 網站會滿方便的。但因為是開源的服務,導致還是不是很方便(和 aapanel 比較),對於習慣無 panel 操作的用戶還是會感覺到礙手礙腳的。


    這款 Hestiacp 的好壞,個人分析如下:

    優點:

    1. Panel 最大的好處就是有許多配置都調整好了,不用費心客製化 LEMP 的各種參數。
    2. 同樣使用 Panel 的好處之一:很多動作不用一堆指令,用網頁 UI 點一點就處理好了。
    3. 這款 Hestiacp 許多套件安裝和配置是使用系統原生的實作方法, panel 實作安裝服務等也是很透明易懂,甚至提供開發文件。也是開源的。
    4. 許多操作是原生的作法,會用 debain / ubuntu 的話會很方便,也不會有過多包裝,不用擔心學了以後其他 panel 或是轉換無 panel 等有學習障礙。
    5. 有還在維護中的文件和論壇,而且 panel 也有繁體中文的翻譯可以使用。
    6. 內建網站統計工具,是面向 MIS/SE 的一套統計服務。

    缺點:

    1. 使用 panel 都會有壞處就是:習慣使用 command line 的操作的話,要強迫自己有些需求要從 panel 上實現,要不 panel 沒有同步的話可能會有設定互相衝突覆蓋的問題。
    2. Hestiacp 有部分設定在網頁上不方便操作,要用 v-xxxxx  等 panel 指令動作比較快處理,參考列表。學習門檻較高。
    3. 文件管理器長的很醜,如果有需要還是推薦用 command line 處理比較舒服。
    4. 開源的 Panel 要記得常更新,避免被 0day 攻擊,更新時要注意客製化的 template 等需要確保不會被更新覆蓋。
    5. 客製化 http Service (Nginx / Apache)的樣版真的有夠麻煩。和 aapanel 的方便性差滿多的。
    6. Hestiacp 建立 LEMP 套件需要事先安裝好,套件無法獨立安裝(會與面板衝突導致不顯示)。

    Hestiacp 論壇: https://forum.hestiacp.com/
    介紹:https://hestiacp.com/
    文件:https://docs.hestiacp.com/
    Github:https://github.com/hestiacp/hestiacp

    支持系統:

    • Debian 10
    • Debian 11
    • Ubuntu 18.04 LTS
    • Ubuntu 20.04 LTS
    • Ubuntu 22.04 LTS

    — 以下架設和簡易心得 —

    提醒下:有部分配置和安裝需要更詳細的測試,並非一個完整的安裝 SOP。

    先登入root 權限,更新一遍

    apt-get update

    下載 install.sh

    wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh

    下載 install.sh

    wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh

    參考選定安裝(https://gabizz.github.io/hestiacp-scriptline-generator/)不安裝 mysql \ http server 做最小安裝,port 設定 8083:

    sudo bash hst-install.sh --apache no --phpfpm no --multiphp no --vsftpd no --proftpd no --named yes --mysql no --postgresql no --exim yes --dovecot yes --sieve no --clamav yes --spamassassin no --iptables yes --fail2ban yes --quota no --api no --interactive yes --hostname no --email no --password no --with-debs no --port '8083' --lang 'zh-tw' --force

    更新 Panel 網域(假設網域 cp-testing.69939.uk),記得 dns 要先設定上

    v-change-sys-hostname cp-testing.69939.uk

    Panel 網域補 SSL

    v-add-letsencrypt-host

    更改密碼

    v-change-user-password admin 密碼

    透過上述選定安裝,預設安裝的服務有這些:

    後台新增一個用戶,設定方案為 default

    點入該新增的帳號以後,選擇右上角登入該帳號之後,就可以創建其他網站。

    再創建網站之前如果需要編輯 nginx 內容,需要編輯樣版,參考:https://docs.hestiacp.com/admin_docs/web.html#how-do-web-templates-work
    Nginx 的路徑為:

    /usr/local/hestia/data/templates/web/nginx/php-fpm/

    檔案要記得複製一份新的並且命名好。避免更新 panel 的時候被覆蓋回去。

     

    另外備註一些參考:

    1. 面板的指令列表:https://github.com/hestiacp/hestiacp/tree/main/bin
  • 壓力測試 – ab(ApacheBench)指令的操作與結果說明

    Apache 內建帶有一個 ab 指令,可以作為壓力測試使用。

    用法:ab [options] [http[s]://]hostname[:port]/path
    
    可用餐數:
    -n requests 要執行的請求數
    -c concurrency 一次發出的多個請求的數量
    
    -t timelimit 秒到最大值。花在基準測試上,這意味著 -n 50000
    -s timeout 秒到最大值。等待每個響應,默認為 30 秒
    
    -b windowsize TCP 發送/接收緩衝區的大小,以字節為單位
    -B address 進行傳出連接時綁定的地址
    -p postfile 包含要 POST 的數據的文件。還記得設置 -T
    -u putfile 包含要 PUT 的數據的文件。還記得設置 -T
    -T content-type 用於 POST/PUT 數據的內容類型標頭,例如: 'application//x-www-form-urlencoded',默認為"text/plain"
    
    -v verbosity 要打印多少故障排除信息
    -w 在 HTML 表格中打印結果
    -i 使用 HEAD 而不是 GET
    
    -x 屬性 要作為表屬性插入的字符串
    -y 屬性字符串作為 tr 屬性插入
    -z 屬性字符串作為 td 或 th 屬性插入
    -C 屬性 添加 cookie,例如。 'Apache= 1234'(可重複)
    -H 屬性添加任意標題行,例如。 'Accept-Encoding:gzip'
    在所有正常標題行之後插入。 (可重複)
    -A 屬性 添加 Basic WWW Authentication,屬性
    是冒號分隔的用戶名和密碼。
    -P 屬性 添加Basic Proxy Authentication,屬性
    是冒號分隔的用戶名和密碼。
    
    -X proxy:port 代理服務器和使用的端口號
    -V 打印版本號並退出
    
    -k 使用 HTTP KeepAlive 功能
    
    -d 不顯示百分位數服務表
    -S 不顯示置信度估計值和警告
    -q 執行超過 150 個請求時不顯示進度
    -l 接受可變文檔長度(用於動態頁面)
    
    -g filename 將收集到的數據輸出到 gnuplot 格式文件
    -e filename 輸出帶有百分比的 CSV 文件
    
    -r 不要在套接字接收錯誤時退出。
    
    -m 方法 方法名稱
    -h 顯示使用信息(此消息)
    -I 禁用 TLS 服務器名稱指示 (SNI) 擴展
    -Z ciphersuite 指定 SSL/TLS 密碼套件(參見 openssl 密碼)
    -f protocol 指定 SSL/TLS 協議
    (SSL2、TLS1、TLS1.1、TLS1.2 或 ALL)
    -E certfile 指定可選的客戶端證書鍊和私鑰
    

    結果的部分會長的像是這樣:

    Server Software: 主機使用的系統\軟體(nginx or apache 之類)和版本,通嘗是關閉的
    Server Hostname: 網站的 Hostname ,網域名稱
    Server Port: 連線的 port,大多是 443 或是 80
    Server Temp Key: 連線時的臨時交換密鑰
    TLS Server Name: TLS 連線的名稱
    
    Document Path: 連線網頁路徑
    Document Length: 連線網頁回應的檔案大小
    
    Concurrency Level: 同時進行壓力測試的人數
    Time taken for tests: 本次壓力測試所花費的總秒數
    Complete requests: 完成的要求數(Requests)
    Failed requests: 失敗的要求數(Requests)
    Keep-Alive requests: Keep-Alive 的要求數
    Total transferred: 本次壓力測試的總數據傳輸量(包括 HTTP Header 的資料也計算在內)
    HTML transferred: 本次壓力測試的總數據傳輸量(僅計算回傳的 HTML 的資料)
    Requests per second: 平均每秒回應要求數量
    Time per request: 平均每個要求所花費的時間(注意單位是 ms, 豪秒)
    Time per request: 平均每個要求所花費的時間,跨所有同時連線數的平均值(注意單位是 ms, 豪秒)
    Transfer rate: 從 Client 端到 Web Server 之間的網路傳輸速度
    
    Connection Times: 連線的時間統計,是一個二維表格,分別表示最小值\平均\中間值\最大值:
    
    Connect: Request 從 Client 端到 Web Server 的時間
    Processing: 資料到 Web Server 後到 Response 結束( Response 全部下載完成)的時間
    Waiting: 資料 Connect 狀態後,Client 端等待的時間,亦指 Client 送出 Request 後,一收到 Response 前等待的時間
    Total: Connect + Processing 的時間,也就是從 Client 發出 Request 到 Response 全部下載完成的時間
    

    要注意幾點:

    1. mac 默認是安裝的,但是在 mac 上使用會遇到版本或是數量上限的問題,可自行 google 修復
    2. 一般壓力測試不考慮頻寬,如果遠端測試的話會有頻寬限制(除非 server 端頻寬更低XD),建議是在同網段進行測試
    3. 壓力測試請由小至大,一次太大伺服器爆掉會有點麻煩。

    參考資料:

    使用 ApacheBench 進行網站的壓力測試 – The Will Will Web
    The Will Will Web – 記載著 Will 在網路世界的學習心得與技術分享 –
    指令-ab 壓力測試工具
    OS: ubuntu-20.04 說明:ab 是一種用於對 Apache (HTTP) 服務器進行基準測試的工具。最主要是在讓您了解當前的 Apache 安裝方式執行。這尤其會顯示您的 Apache …
    分享 ApacheBench 的壓力測試結果報告分析心得 – The Will Will Web
    The Will Will Web – 記載著 Will 在網路世界的學習心得與技術分享 –

    如果想要在 windows 上操作(我沒做過),參考:

  • 檢查與轉換檔案編碼,使用 Chrome 瀏覽器和 Sublime 3 文字編輯器

    有時下載一個 txt 文件,用文字編輯器打開來發現不是 utf8 編碼,但是不知道他是用了什麼編碼,這邊可以先丟到 chrome 瀏覽器看看,如果 chrome 瀏覽器顯示是正常的,就可以開啟 “開發者工具”,開啟”主控台”,輸入指令:

    document.charset

    就可以顯示目前的編碼名稱,如下圖所示:

    這時如果想要儲存成常用編碼的檔案,這時可以用 sublime 3 或是其他可以轉換編碼的文字編輯器。

    用 usblime 3 為例,如圖操作,先開啟指定編碼看是否正確,正確的話再另存編碼即可。

  • PHP 網站的翻譯 / 多語系,批次翻譯 php array 的方法

    拜 AI 科技之賜,現在生成型的文字 AI 已經足以處理 php array 翻譯了,我使用 ChatGPT 付費版來處理翻譯,操作上就貼文件給他,直接下指令請他翻譯,參考:

    — 舊文 —-

    PHP 的多語系或是翻譯實作的形式各式各樣,像是 PO/MO 翻譯檔案、寫在 SQL 資料庫、靜態檔案或是寫在 PHP 檔案之中的作法,作法之多,從 PO/MO 檔案轉換的線上工具可以一窺一二。

    這邊使用 Codeigniter 的語系系統,是用 PHP array 來處理的,這樣的形式要批次處理前置翻譯有點困難,如果要是用翻譯的 API 也要額外付費,於是用了一些比較迂迴的作法。

    首先擁有的翻譯資源:

    • Poedit 軟體。因為之前有需要大量使用 wordpress 功能,需要翻譯外掛和布景主題,所以有買斷一個個人使用版本。這套工具可用來翻譯 PO/MO 格式的檔案。
    • LEMP 本地開發環境。

    實作的 SOP 是這樣的:

    1. 將翻譯的 PHP 檔案全部轉換/產生新的 PO 檔案。
    2. 透過 Poedit 軟體做前置翻譯。
    3. 透過軟體內建搜尋翻譯功能初步作一次調整。
    4. 確認 PO 檔案放在和 PHP 檔案是同一個資料夾。
    5. 取出將 PO 檔案翻譯內容,替換原 PHP檔案內容。
    6. 做檢查微調。檢查 ‵/‵ 字符等兩個檔案,或是其他可能會有不同的地方。

    附上其中 SOP 的 1. 和 5. 的檔案原始碼:

    # php2po.php
    <?php 
    
    $PATH = dirname(__FILE__) . "/路徑";
    $files = glob($PATH . '*.php');
    
    foreach ($files as $file) {
        $lang = [];
        include $file;
    
        $fh = fopen($file . ".po", 'w');
        fwrite($fh, "#\n");
        fwrite($fh, "msgid \"\"\n");
        fwrite($fh, "msgstr \"\"\n");
    
        foreach ($lang as $key => $value) {
            $key = addslashes($key);
            $value = addslashes($value);
            fwrite($fh, "\n");
            fwrite($fh, "#. $key\n");
            fwrite($fh, "msgid \"$value\"\n");
            fwrite($fh, "msgstr \"$value\"\n");
        }
        fclose($fh);
    }
    
    
    # po2php.php
    <?php
    function get_replace_array($file)
    {
        $input_lines = file_get_contents($file);
        preg_match_all('/msgid \"(.*)\"/', $input_lines, $msgids);
        preg_match_all('/msgstr \"(.*)\"/', $input_lines, $msgstrs);
        $arr = [];
        for ($i = 1; $i < count($msgids[1]); $i++) {
            // 第一個是空值
            $arr[$msgids[1][$i]] = $msgstrs[1][$i];
        }
        // var_dump($arr);die();
        return $arr;
    }
    
    $PATH = dirname(__FILE__) . "/路徑";
    $files = glob($PATH . '*.php');
    
    foreach ($files as $file) {
        $lang = [];
        include $file;
    
        $replace_array = get_replace_array($file . ".po");
    
        $php_file = file_get_contents($file);
        $_lang = [];
        foreach ($lang as $key => $value) {
            $_lang[$key] = $value;
    
            $value_tmp = addslashes($value);
            if (isset($replace_array[$value_tmp])) {
                $_lang[$key] = $replace_array[$value_tmp];
            }
    
            if ($value != $replace_array[$value]) {
                echo $key . ", " . $_lang[$key] . "
    \n";
            }
        }
    
        file_put_contents($file, '<?php $lang = ' . var_export($_lang, true) . ';');
    }
    
    

    需要注意幾件事情:

    1. 買斷版的 Poedit 也是有翻譯數量上限的,不過暫時夠用就是。
    2. Poedit 在前置翻譯之前記得設定好語系,除了語系之外可以儘量讓檔案小一點,不用特別標記其他的 meta ,會產生多餘的註解檔案。
    3. 在本機操作 PHP 轉換時要注意一下 RAM 是否夠用,
    4. 檔案轉換的路徑需要自行調整,PO 檔案的命名是以原始 PHP 檔案直接加上 .po 副檔名。
    5. 如果轉換出來的 po 檔案有問題無法開啟,建議放上 po editor online 上檢查看看,或是轉換一下下載繼續處理。
    6. 如果真的無法翻譯,檔案量不大的話可以把變數拆行丟 google 翻譯 是可行的,要注意 key 值的命名規則,不要被翻譯了。
  • [快速筆記] 信件RWD

    如果有需要信件 RWD 功能,現在有一個框架可用,叫做 mjml:

    MJML – The Responsive Email Framework
    The only framework that makes responsive email easy. MJML is a markup language designed to reduce the pain of coding a responsive email.

    這裡有線上編輯器和各種模版可選擇:

    Responsive Email Templates
    Ready-to-use and free responsive email templates coded in MJML.

  • Mac 使用 Homebrew 安裝 php 7.3

    有時會需要更改 Mac 內建的 PHP 版本或是新增一個 PHP 來使用,這時候會需要使用 Homebrew 來安裝:

    Homebrew
    The Missing Package Manager for macOS (or Linux).

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    安裝好 Homebrew 之後,安裝 php 7.3 會發現已經不支援了,參考 stackoverflow 會得知需要用別的來源:

    brew tap shivammathur/php
    brew install shivammathur/php/[email protected]

    注意 tap 動作只需要成功執行一次就行。

    安裝時可能會遇到的注意事項:

      1. Xcode 會提示需要更新(如果都沒更新的話),只需要按照提示更新即可。
      2. 會得到 php 的位置資訊,例如我安裝以後得到的位置就是
        /usr/local/opt/[email protected]/bin/php
      3. 要確認 install 之後有沒有正確 link ,我需要兩個版本,原版本是 8.1.14 所以並不會正確執行,也沒有必要執行。參考這裡,另外建議檢查一下 ~/.bash_profile 之中有沒有指定 PATH。

    2023-10-23 update:

    現在 PHP 已經更新到 8.2 啦,上述 brew 的方式依然可以更新,安裝時更換版本號碼即可。安裝成功後檢查 ~/.bash_profile 的 PATH 更新為新版本,之後刷新指令 source ~/.bash_profile 就行的。

  • HTTrack Website Copier 砍站工具在 MacOS 上實現

    HTTrack 是一個砍站軟體,他在 windows 上有 GUI 介面,不過在 Mac 上只有 command line 介面,也不難處理,對於下載網頁的靜態資源還是不錯用的。

    安裝和執行方法參考:

    [MAC] HTTrack Website Copier砍站軟體!移植到MAC的安裝與使用教學
    說到砍站軟體,大家第一印象不外乎就是HTTrackWebsiteCopier,說到這套砍站軟體,算是最老牌同時也是最簡易好上手的砍站軟體,說到這一個…

    滿詳盡的,這邊就不贅述。

    要注意的重點:

    1. 使用 Homebrew 安裝,在教學網頁中第一步驟為安裝 Homebrew 過程。 Homebrew 官網參考請點這裡
    2. 有需要其他安裝版本的話可以參考官網下載(這塊沒特別試過,請小心服用)。
    3. 雖然是廢話,不過還是要提醒一下,砍站軟體並不能完整複製網頁/網站,並非砍下來直接打開看就是一模一樣的。