Skip to content

zh

在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物件。

在 MacBook Pro 13,1 上安裝 Ubuntu 19.10

我對 macOS Catalina 感到挫折,因此決定將 Ubuntu 設為我 13 英寸的 MacBook Pro(不帶觸控條)的主要操作系統。作為一名軟件開發者,我發現 macOS 會與 Xcode 一同打包許多工具,這將佔用多達10GB的磁碟空間。雖然磁碟空間並非我主要的憂慮,但有時候網路下載的速度會很慢,而更新也可能會卡住。在試圖完成工作時流失一小時是不必要的障礙。

我起初擔心專有硬體是否能與開源的 Linux 分佈版兼容。令我驚訝的是,許多功能在初次安裝後就可以立即使用,感謝社區的努力。這包括了螢幕、鍵盤、觸控板,以及 Wi-Fi。唯一不適用的功能是音訊,但我可以使用我的 USB Type-C 耳機或帶有喇叭的 HDMI 外接顯示器來解決這個問題。這個 GitHub 頁面提供了關於各種 MacBook 硬體與 Linux 兼容性的詳細文檔:MacBook 在 Linux 上的硬體支援

如果你對在 MacBook Pro 上試用 Ubuntu 感興趣,請按照以下幾個簡單的步驟操作:

  1. Ubuntu 官方網站 下載 Ubuntu 19.10。
  2. 按照此指南的步驟,使用 Etcher 製作可開機的 USB 隨身碟:在 macOS 上製作 USB 隨身碟
  3. 重新啟動你的 MacBook,並按下 Option 鍵,選擇 USB 隨身碟作為開機設備。
  4. 嘗試使用 Ubuntu,如果你覺得合適,就繼續進行安裝。

就是這樣!作為開發者,你可以透過執行 sudo apt install git 來快速設定這類必要工具。這比在 macOS 上更簡單,macOS會以各種方式來限制你的自由。不應該對任何一個平台過於依賴,因為不能一直相信大公司會為了你的最佳利益行事,例如保護你的個人資料不受政府監視。擁抱開源社區,欣賞選擇替代操作系統的自由。

附註 1: 若要讓藍牙運作,請在這個儲存庫中執行找到的腳本:

MacBook 藍牙驅動

附註 2: 若要讓相機運作,請按照這份指南來安裝驅動:

相機驅動指南

設置 MongoDB 與 Koa.js

我正在建設一個 Koa.js 服務器,並需要將其連接到 MongoDB 以儲存和檢索數據。以下是如何在幾個簡單的步驟中實現這一點:

步驟1:初始化 Koa 應用程序之前連接到數據庫

const initDB = require("./database")

initDB()

const app = new Koa()

database.js 中,導入 mongoose。同時確保使用 npm install --save mongoose 進行安裝。Mongoose 是一個物件數據建模(ODM)庫。

const mongoose = require("mongoose")
import { connectionString } from "./conf/app-config"

const initDB = () => {
  mongoose.connect(connectionString)

  mongoose.connection.once("open", () => {
    console.log("Connected to the database")
  })

  mongoose.connection.on("error", console.error)
}

module.exports = initDB

接下來,為您的連接字符串創建配置:

export const connectionString =
  "mongodb+srv://" +
  secret.mongodb.username +
  ":" +
  secret.mongodb.password +
  "@xxxxxx.mongodb.net/test?retryWrites=true&w=majority"

您可以運行本地 MongoDB 實例,或者使用 MongoDB Atlas 並將其託管在 AWS 雲上。您會在那裡找到包含在配置文件中的連接字符串。

步驟2:在 Koa 中創建一個 Schema

例如,讓我們在 /models/users.js 中創建一個用戶模式。

const mongoose = require("mongoose")
const Schema = mongoose.Schema

const UserSchema = new Schema({
  username: String,
  email: String,
  picture: String,
})

module.exports = mongoose.model("User", UserSchema)

步驟3:創建一個服務來查詢數據

假設我們有一個 /service/user.service.js

import User from "../models/users"

export const getUserFromDb = async username => {
  const data = await User.findOne({ username })
  return data
}

export const createUserInDb = async user => {
  const newUser = new User(user)
  await newUser.save()
  return user
}

步驟4:在 Koa 控制器中調用服務

例如,假設我們有一個 /controller/user.controller.js

    import { getUserFromDb, createUserInDb } from '../service/user.service';

    static async getUser(ctx) {
      const user = await getUserFromDb(ctx.query.username);
      ctx.body = user;
    }

    static async registerUser(ctx) {
      const user = await createUserInDb(ctx.request.body);
      ctx.body = user;
    }

最後,您可以使用控制器註冊路由。現在,您應該能夠看到數據被存儲在數據庫中。如果您有任何問題,請隨時聯繫我。

將您的部落格從Medium遷移到Ghost 3.0

Ghost 3.0剛剛被發佈 (https://ghost.org/3/)。我對Ghost比WordPress有強烈的偏好,因為它使用Node.js而不是PHP。Ghost不僅是開源的,還提供了非常酷的黑色主題。所以,我決定將我的部落格從Medium遷移出去。然而,該過程並不直接,也有一些相關的成本。下面是一些步驟幫助你導航遷移並重新控制你的內容:

步驟一:從Medium導出帖子

在Medium上導航到設置並找到允許您下載您的數據的部分:

步驟二:導入至WordPress.com並導出文件

在WordPress.com上創建一個免費帳戶。在導入部分,您會找到一個可以從Medium導入內容的選項:

成功從Medium導入內容後,你可以從WordPress.com導出文件:

步驟三:通過插件將文件導入至WordPress.org並導出文件

http://wordpress.org/ 下載開源的WordPress軟件並使用MAMP (https://www.mamp.info/en/) 在本地運行。複製所有的WordPress文件並將它們放在MAMP內的/ htdocs資料夾中。啟動服務器,您應該能夠運行安裝了MySQL的本地WordPress實例。

導航至導入部分,並選擇從WordPress導入的選項:

然後,從https://wordpress.org/plugins/ghost/ 安裝官方的Ghost插件,並使用此插件導出你的部落格文章:

雖然有一個下載Ghost文件的選項,但對我來說並未奏效。嘗試點選下載.json檔案。

步驟四:導入至Ghost博客

轉到設置,然後轉到Ghost中的實驗室部分,並導入您的文件:

交叉手指!如果一切順利,您應該能看到所有您從Medium導出的文章現已遷移到Ghost 3.0。祝你寫博愉快 :)

在企業網路中設置npm代理

在企業網路下工作可能相當有挑戰性,因為許多東西不會即刻就能運作正常。像是 npm install 等簡易指令可能都無法正常運作。以下為如何跨過代理進行工作的方法:

假設你已經成功在你所使用的企業筆記本電腦中安裝 node.js,找出 .npmrc 檔案。在Windows系統中,該檔案通常位於 C:\Users\<your_user_id>\.npmrc,而在Mac機上,該檔案則位於 Users/<your_user_id>/.npmrc

打開該檔案並加入下列行數:

    https-proxy=http://yourcompanyproxy.com:80
    proxy=http://yourcompanyproxy.com:80
    strict-ssl=false
    registry=http://registry.npmjs.org/

再試執行 npm install,它應該現在可以運作了!

附帶一提的小提示:如果你在企業內部的 Nexus npm 倉庫有一些依賴關係,例如在 @npmcorp 範疇中,運行以下標令以指定正確的倉庫 URL:

    npm config set @npmcorp:registry https://your-company-nexus:80/nexus/content/repository/npm-internal

這樣做應該就能解決任何 "依賴性未找到" 的錯誤。試試看吧!