文章

用白話文談數學公式 - Jaccard Index (雅卡爾指數)

假設給定 2 段句子,我們有沒有辦法能夠用數學衡量這 2 段句子之間的相似程度呢?譬如我們怎麼衡量 2 篇論文是否抄襲?抄襲的程度怎麼數值化?要回答這些問題,其實不會很難。

數學上有個最簡單的公式,可以幫助我們衡量相似度:

“Jaccard Index"

Jaccard 是一個非常簡單的公式,容易理解之外,在程式的實作上一點也不困難,是做自然語言處理(Natural language processing)相似度或樣本距離相關問題時,非常基本實用的選項之一。

Posted on  Jan 7, 2023  in  數學概念  by  Amo Chen  ‐ 3 min read

優化 Python Docker Image Size - 從 multi-stage builds 到 distroless

Docker multi-stage builds 教學 一文介紹以 Golang 作為範例,示範如何用 Docker multi-stage builds 的功能,優化編譯 Docker image 的過程,以減少 Docker Image 的 size 。

Multi-stage builds 並不局限於 Golang 這類的編譯(compiled)語言才能使用,腳本(script)語言也能夠運用類似的技巧降低 Docker image size, 例如 Javascript, Python 等開發生態系也都能夠使用。

只是腳本語言需透過直譯器(interpreter)執行的天性,因此其 Docker image 終究難以像 Golang 這類編譯語言所產生的 image 來得小,但這並不代表 Python, Javascript 這類的 Docker image 並不值得使用 multi-stage builds, 優化 Docker image size 仍可以為部署(deployment)速度帶來優勢,同時也能減少網路傳輸所需付出的費用成本。

本文的 multi-stage builds 以 Python 範例出發,一路介紹到如何使用 Google 所提供 distroless 進一步優化 Docker image size 與安全性。

Posted on  Jan 6, 2023  in  Docker , Python 程式設計 - 高階  by  Amo Chen  ‐ 5 min read

使用 ngrok 服務讓人連線到你的 localhost 伺服器

一般而言,開發應用程式(Application)的工作絕大多數都會在本機(localhost)上進行,如果要進行測試會將程式部署(deploy)到測試環境後,再進行測試。

但如果僅僅是一個最小可行性產品(MVP, Minimum Viable Product),或者是一個還在草稿(draft)階段的工作成果,又或者團隊沒有所謂的測試環境時,最不得已的方法就是開放本機(localhost)讓其他人連線進來進行 demo 或測試。

那要怎麼開放 localhost 讓其他人連線進來呢?

ngrok - put localhost on the internet 可能是你最方便又無痛的選項。

Posted on  Dec 29, 2022  in  開發工具  by  Amo Chen  ‐ 3 min read

零經驗也可的 PySpark 教學 - UDF (User Defined Function)

Spark SQL 提供許多好用的函式(functions),例如 concat() , count() , date_format() 等等,但這些內建函式不一定能夠滿足一切的需求,所以有時候需要做一些擴充以達到目的,此種讓使用者能夠進行擴充的功能就被稱為 UDF (User Defined Function), RDBMS 諸如 MySQL 與 PostgreSQL 等也都支援 UDF, 詳見:

  1. MySQL - Adding a Loadable Function
  2. PostgreSQL - User-Defined Functions

Spark 也同樣支援 UDF, 讓使用者能夠擴充函式。

Posted on  Dec 28, 2022  in  Python 模組/套件推薦 , Python 程式設計 - 高階  by  Amo Chen  ‐ 4 min read

Git 版本控制教學 - submodule

Git 可以做到 repository 中嵌入其他 git repositories, 相當於版本控制原本的 repository 之外,也把內嵌的 repositories 也納入版本控制的範圍,這功能被稱為 submodule

不過 submodule 並不是將內嵌 repository 的所有檔案都做額外的版本控制,而是類似於做一個指標(pointer),將 submodule 的版本指向內嵌的 repository 的某 1 個 commit id 。

Posted on  Dec 26, 2022  in  Git 版本控制  by  Amo Chen  ‐ 4 min read

如何使用 macOS 內建的 VNC client

有時工作上會需要使用 VNC(Virtual Network Computing) 連線到遠端的伺服器桌面查看畫面,這時候不免要安裝 TeamViewer , TightVNC , VNC Viewer 等工具進行連線。

不過 macOS 其實有內建 VNC client 可供使用,如果工作上只是需要一個簡便的 VNC client 的話,可以直接用 macOS 內建的 VNC client 。

Posted on  Dec 25, 2022  in  macOS  by  Amo Chen  ‐ 1 min read

用 lsof 指令尋找佔用通訊埠的 Process

最近在開發 Next.js 相關的應用程式,無腦寫了無窮迴圈造成 dev server 關不掉,導致重啟 dev server 時會顯示以下警告訊息,該訊息顯示通訊埠(port) 3000 正在被其他 process 佔用:

warn  - Port 3000 is in use, trying 3001 instead.

本文紀錄如何找到佔用 port 的 Process Id 並且停止其運作。

Posted on  Dec 19, 2022  in  Unix-like 命令列教學  by  Amo Chen  ‐ 2 min read

你知道 Vim 也能加密文字檔(text file)嗎?

Vim is able to write files encrypted, and read them back. The encrypted text cannot be read without the right key.

Vim 作為世界知名的編輯器,實在多才多藝,就連加密都有支援,這麼方便的功能,不免引起我的注意,因此特別花了一些時間查看如何透過 Vim 加密檔案以及用 Vim 加密檔案有什麼限制。

Posted on  Dec 18, 2022  in  Vim  by  Amo Chen  ‐ 3 min read