Skip to content

zh

在Amazon Linux 2上安裝PHP 7.2而非PHP 5.4

問題

當你啟動一個新的 Amazon Linux 2 AMI 服務器並嘗試使用以下命令安裝 PHP:

yum install php

成功安裝後,如果你使用 php -v檢查版本,你會看到:

PHP 5.4.16 (cli) (建立日期: 2019年10月31號 18:34:05 )

不過,最新的PHP版本是7.2,你可能希望使用這個新版本。

解決方案

你可以透過 Amazon Linux Extras 啟動 PHP 7.2,使用以下命令:

sudo amazon-linux-extras enable php7.2

一旦已經啟動,按照接下來的指示完成安裝:

yum clean metadata
yum install php-cli php-pdo php-fpm php-json php-mysqlnd

就這樣。再次使用 php -v檢查 PHP 版本,現在應該會顯示:

PHP 7.2.28 (cli) (建立日期: 2020年3月2日 19:38:11 ) ( NTS )

使用Node.js讀取大型檔案

我最近面臨了分析由日誌文件組成的大數據集的任務。當我試圖在Excel中打開這個文件時,我的筆記本電腦簡直凍結了。鑑於可用工具的限制,我決定使用Node.js腳本解析該文件。

問題

要讀取一個小文件,你可能會使用以下腳本:

var fs = require("fs")

fs.readFile("path/mySmallFile.txt", "utf-8", (err, data) => {
  if (err) {
    throw err
  }
  console.log(data)
})

使用此腳本,你應該能夠讀取小文件的內容。然而,對於大文件,你可能會遇到緩存錯誤,例如 RangeError: 嘗試分配的緩衝區大於最大大小。該腳本將終止,產生類似於以下的錯誤:

Error: "toString" failed
  at stringSlice (buffer.js)
  at Buffer.toString (buffer.js)
  at FSReqWrap.readFileAfterClose [as oncomplete]

解決方案

要讀取一個大文件,你可以像這樣使用Node.js的本地 readline庫:

var fs = require("fs")
var readline = require("readline")

const rl = readline.createInterface({
  input: fs.createReadStream("path/largeFile.csv"),
  output: process.stdout,
  terminal: false,
})

rl.on("line", line => {
  console.log(line)
})

rl.on("pause", () => {
  console.log("Done!")
})

將文件路徑替換為你的大文件的路徑。在 on('line')函數內部,你可以逐行處理文件,例如將其解析為JSON並增加計數器。完成閱讀文件後,可以使用 on('pause')函數顯示最終總和。

使用這種方法,你現在應該能夠使用Node.js處理大量數據集。有關更多信息,請參閱官方文檔:Node.js 讀取API

將WordPress MySQL資料庫遷移到AWS RDS

在這篇文章中,我將說明如何將您本地的WordPress MySQL資料庫遷移到Amazon Web Services(AWS)關聯性資料庫服務(RDS)。你可能會想要這樣做以獲取以下好處:

  1. 改善性能,因為您的資料庫將與在EC2實例上運行的資源分開。
  2. 能夠橫向伸縮您的網站,允許多個EC2實例連接到同一個資料庫。
  3. 更容易進行資料庫維護和升級任務。

信服了嗎?下面是達成此次遷移的步驟:

首先,導航到AWS控制台並選擇RDS。建立一個MySQL資料庫,如下圖所示填寫表單:

DB實例識別碼: wordpress 主用戶名: admin 主密碼: [YourChoice]

您可以將大多數設置保留為其預設值,包括預設的VPC。

其次,編輯這個新建的資料庫的安全組。選擇資料庫,導航至連接和安全標籤,並選擇安全組。在入站規則標籤中,編輯入站規則以移除預設設定並選擇類型:MySQL,協議:TCP,以及端口範圍:3306。

在來源部分,您可以選擇與您的WordPress EC2實例相關聯的安全組,或者輸入您自己的IP地址。如果您還未創建您的WordPress EC2實例,現在你可以做,或者只需從市場使用Bitnami WordPress。

第三,SSH進入您的WordPress實例,並用此命令備份您現有的WordPress資料庫:

    mysqldump -u root -p [YourDatabaseName] > backup.sql

[YourDatabaseName]替換為您的資料庫名稱,例如bitnami_wordpress。應在您的現有目錄中創建backup.sql文件。通過運行命令將此文件導入到您新建的AWS RDS實例:

    mysql -u admin -p -h [RDS_ENDPOINT] -D wordpress < backup.sql

admin[RDS_ENDPOINT]替換為您自己的值。如果您遇到如下的錯誤:

    ERROR 1049 (42000): Unknown database 'wordpress'

這表示您的wordpress資料庫尚未被創建。首先,用以下命令連接到資料庫:

    mysql -h [RDS_ENDPOINT] --user=admin --password=[YourPassword]

一旦連接到MySQL,就用以下命令創建一個新的資料庫:

    mysql> CREATE DATABASE wordpress;
    Query OK, 1 row affected (0.00 sec)
    mysql> exit;
    Bye

最後,編輯您的WordPress EC2實例中的wp-config.php文件。該文件通常位於您的WordPress目錄中,例如倘若您使用的是Bitnami,那麼它位於/home/bitnami/apps/wordpress/htdocs。更新下列值:

    /** The name of the database for WordPress */
    define( 'DB_NAME', 'wordpress' );

    /** MySQL database username */
    define( 'DB_USER', 'admin' );

    /** MySQL database password */
    define( 'DB_PASSWORD', '[YourPassword]' );

    /** MySQL hostname */
    define( 'DB_HOST', '[RDS_ENDPOINT]' );

使用您自己的值替換占位符並保存文件。更改應立即生效。

完成。如果您有任何問題,請隨時聯繫我。

從 Git 倉庫中移除 .DS_Store 文件

如果你是一個同時使用 Mac 和 Git 的用戶,你可能會無意間提交 .DS_Store 文件。這可能會讓你的 Windows 同事感到困惑,他們可能不清楚這些文件的用途,也不明白你為何要提交它們。

首先,什麼是 .DS_Store 文件? DS 代表桌面服務(Desktop Services),這些文件被 Mac 用來確定當你打開它們時如何顯示文件夾。例如,它們存儲自定義屬性,如圖標的位置。這些文件由 Mac 的 Finder 應用程序創建並維護,並且通常是隱藏的。

這些 .DS_Store 文件對 Windows 用戶無益,也不需要提交到你的 GitHub 倉庫。要從你的倉庫中移除現有的 .DS_Store 文件,執行以下命令:

    find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

然後,提交更改以移除這些文件,並推送到遠程倉庫。為了防止這些文件再次被添加,編輯你的 .gitignore 文件,並添加以下行:

    .DS_Store

這樣做將避免你的同事產生任何疑慮。

在Git中忽略已修改的文件

我遇到了一種罕見的情況,一個文件已經被修改,但是我不想將這個變更提交給Git。有各種方法可以實現這一點,比如使用.gitignore文件。然而,如果文件已經被追蹤,這種方法就不起作用。

解決方案是通過執行以下命令來手動忽略文件:

    git update-index --assume-unchanged <文件路徑>

要再次追蹤文件,您可以通過使用以下命令來撤消此操作:

    git update-index --no-assume-unchanged <文件路徑>

如果您有任何問題,請隨時聯繫我。

在 Mac 上尋找並終止鎖定特定端口的進程

問題:有時候,當您啟動一個本地 Node.js 服務器時,它可能會繼續在後台運行。如果您嘗試再次啟動服務器,您可能會遇到一個錯誤,指出端口(例如,8080)已經在使用中並被鎖定:

    throw er; // Unhandled 'error' event
    Error: listen EADDRINUSE 127.0.0.1:8080

解決方案:您可以使用 lsof 命令來識別鎖定端口的進程:

    lsof -n -i4TCP:8080

或者,您可以將 8080 替換為您想要調查的特定端口號。這將顯示當前使用該端口的進程列表。識別您希望終止的進程(例如,正在運行的 node 與 PID 6709)並執行以下命令來將其殺死:

    kill -9 <PID>

最後,重新啟動您的服務器。一旦端口被釋放,它應該可以正常運行。

作為一名軟件工程師如何與產品經理合作

作為一名軟件工程師,我知道與產品經理合作的感覺。借助多年的經驗,我遇到過優秀的產品經理(PM)以及一些不理想的PM。每天,我都會與PM進行合作,我了解到可能出現的挑戰,特別是當彼此的關係變得緊張時。在這篇博客文章中,我將提供一些作為一名軟件工程師如何有效與PM合作的建議。

與PM合作時可能出現兩個主要的困難。第一個問題是,沒有工程背景的PM可能無法理解你正在處理的技術復雜性,導致彼此之間缺乏尊重。第二,如果PM的職業生涯始於工程師,他們如果說出自己完全理解像區塊鏈、大數據或人工智能等技術主題,實際上卻不然,會讓人感到困擾。

要縮小這些隔閡,軟技能和溝通能力是必不可少的。

常見的陷阱1:對科技的無知

從PM那裡聽到最讓人惱火的一句話可能就是, "這只是一個簡單的按鈕。你確定你五分鐘內完成不了嗎?"之類的評論暗示著工作很簡單,並且你是無能的。但是,創建即使是一個簡單的按鈕也並非小事。例如,Google首頁的搜索按鈕不只是一個”簡單的按鈕”。必須要考慮各種狀況,如懸停、點擊、雙擊,以及像文本語言化,訪問性和多個屏幕寬度等其他因素。

常見的錯誤2:誤解角色和責任

PM負責產品,但他們不是你的老闆。在等級組織結構中或者是由外包廠商管理的內部PM中,這種誤解可能尤其普遍。採用像精益求精這樣的方法可以幫助設定邊界並管理期望。需求的頻繁變更可能對項目造成傷害,導致無法重用的代碼,錯誤和技術債務。

常見的錯誤3:沒有清晰的目標

在PM沒有明確的願景並沒有定義具體的需求時,可能會讓人感到沮喪。工程師擅長解決挑戰並需要清晰的目標。需求定義不明會導致產品難以衡量影響和成功。

最後的想法

為了成功地應對這些問題,這裡有我的三個建議:

  1. 以同理心和善意對待非技術的利益相關者,同時讓他們了解你工作的復雜性。
  2. 理解PM並不是你的老闆;願意與他們合作並願意分享成功的成果。
  3. 對行業趨勢保持了解,並準備好在你認為需求有誤時進行有說服力的論述。

請記住,軟件開發是一個團隊運動。像任何隊伍一樣,成功取決於有效的溝通,合作和領導以實現共同的目標。

在Adobe Experience Manager中註冊Sling Servlets

在Adobe Experience Manager (AEM) 中,Sling servlet可以被用來處理某些RESTful的請求-回應的AJAX調用。寫在Java編程語言中的Servlets可以被註冊為OSGi(開放服務網關協議)服務。在AEM中註冊servlet有兩種方法:1) 通過路徑,和 2) 通過資源類型。以下是兩種方法的詳細說明:

1. 通過路徑註冊

例如,如果您希望從客戶端發送一個表單POST請求到路徑/bin/payment 到Sling servlet類,您可以使用以下的註解:

@SlingServlet(
    metatype = true,
    methods = { "POST" },
    paths = "/bin/payment"
)
public class YourServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException {
        // 在這裡執行你的任務
    }
}

當有一個POST請求到 http://localhost:4502/bin/payment 時,servlet將被觸發,並調用 doPost 方法。

前提條件包括在端口4502上運行本地AEM實例,並通過Maven Bundle插件安裝bundle模組。您可以通過導航到 http://localhost:4502/system/console/bundles來驗證bundle的安裝。如果沒有安裝,您可以手動上傳JAR文件。

如果您遭遇“禁止”的錯誤,無法服務 /bin/payment 的請求,請按照以下步驟操作:

  1. 轉到 http://localhost:4502/system/console/configMgr
  2. 搜索 'Apache Sling Referrer Filter'。
  3. 從篩選器中刪除POST方法。這將允許您從任何來源觸發POST方法。
  4. 搜索Adobe Granite CSRF Filter。
  5. 從篩選方法中刪除POST。
  6. 保存更改並再次測試servlet。

Servlet現在應該按預期觸發。

2. 通過資源類型註冊

為了避免上述問題,更好的方法是通過資源類型註冊servlet。重構servlet如下:

@SlingServlet(
    metatype = true,
    methods = { "POST" },
    resourceTypes = "services/payment"
)
public class YourServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException {
        // 在這裡執行你的任務
    }
}

接下來,您需要創建一個頁面來觸發此資源:

  1. 轉到 http://localhost:4502/crx/de/index.jsp的CRXDE Lite。
  2. /content資料夾內,創建一個頁面(例如,http://localhost:4502/content/submitPage.html)。
  3. 在resourceType屬性中,輸入 services/payment 或其他匹配您上述的servlet。
  4. 保存更改並測試POST請求到 http://localhost:4502/content/submitPage.html。 應該可以按预期工作。

額外提示: 您也可以使用Apache Sling Resource Resolver來驗證servlet是否已成功註冊在http://localhost:4502/system/console/jcrresolver

如果有任何問題,可以在下面的評論中留言。

在AWS EC2上安裝Nextcloud,並使用S3儲存空間

為了提高我的隱私,我決定減少使用Google產品。我用Firefox取代了Chrome,從Gmail轉到ProtonMail,現在正在使用Nextcloud而非Google Drive。Nextcloud允許自託管雲存儲並對我的數據進行控制。以下是在AWS EC2上安裝Nextcloud並配置它以使用S3存儲的步驟。

  1. 使用Snap套件管理器安裝Nextcloud:

bash sudo snap install nextcloud

  1. 創建一個管理員用戶賬號:

bash sudo nextcloud.manual-install <admin_username> <admin_password>

  1. 添加你的信任域:

bash sudo nextcloud.occ config:system:set trusted_domains 1 --value=<your-domain>

  1. 使用AWS Route 53,創建一個指向您的Nextcloud服務器的IP地址的A記錄。

  2. 設置Let's Encrypt的SSL證書:

bash sudo nextcloud.enable-https lets-encrypt

  1. 導航到您的域名,您現在應該能夠登錄到您的Nextcloud實例。

  1. 點擊“Apps”並啟用“Default encryption module”和“External storage support”。

  2. 打開AWS IAM(Identity and Access Management)並創建一個具有程序化訪問的新用戶。

  3. 使用下面的JSON代碼創建一個新的策略,將NAMEOFYOURBUCKET替換為您的S3桶的名稱。將此策略附加到新創建的用戶。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetBucketLocation", "s3:ListAllMyBuckets"],
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::NAMEOFYOURBUCKET",
        "arn:aws:s3:::NAMEOFYOURBUCKET/*"
      ]
    }
  ]
}
  1. 在Nextcloud設置中,選擇“External Storage”。在“Bucket”字段中填入NAMEOFYOURBUCKET。選中“Enable SSL”和“Enable Path Style”,然後使用您創建的用戶的憑證填入所需的信息。

  2. 你已經完成了!導航到你的d3文件夾,你現在應該能夠上傳文件了。

在瀏覽器中調試PHP代碼

在JavaScript中,你可以直接在瀏覽器中使用console.log('whatever')進行故障排查。然而,當使用PHP時,需要一些小技巧才能達到同樣的效果。以下是操作步驟:

  1. 創建一個名為debug_to_console的函數來處理輸出到控制台的內容。將此代碼添加到你的PHP文件中:

```php function debug_to_console($data) { $output = $data; if (is_array($output)) { $output = implode(',', $output); }

   echo "<script>console.log('Debug Objects: " . $output . "');</script>";

} ```

  1. 在你需要輸出到控制台的行處,插入以下程式碼:

php debug_to_console("Test");

  1. 如果你需要偵錯一個物件,您可以這樣記錄它:

php debug_to_console(json_encode($foo));

按照這些步驟操作後,打開你的瀏覽器的開發者工具。您應該能夠看到在控制台使用console.log顯示的PHP物件。