LeetCode - 刷題之旅的總結與心得
前言
這裡是我寫Leetcode總結核心概念的地方,不同的情境會使用到的武器不同,這裡我會描述在什麼樣的情境滿足下,適合的資料結構或是演算法。而這個演算法的核心概念是什麼,同時我也會紀錄一些我在刷題時的心得,以及刷題的時間,來慢慢看到成長與進步。
Leetcode時間紀錄
Hash Table
情境1: 快速找元素
通常使用 Hash 的關鍵在於要用 O(1) 的時間複雜度來查找元素,這樣就可以不用遍歷整個 list 從 O(n) 變成 O(1) 的時間內完成整個問題。
相關題目:
leetcode-1-two-sum: 給定一個 target 數值,從 list 中找到兩個數字相加等於 target
leetcode-12-integer-to-roman: 整數轉羅馬數字
leetcode-13-roman-to-integer: 羅馬數字轉整數
情境2: 比對無序的東西
如果要比對兩個無序的東西,像是兩個字串是否是 Anagram,這時候可以使用 Hash 來記錄每個字元出現的次數,然後比對兩個 Hash 是否相同。
相關題目:
leetcode-49-group ...
GitLab CI/CD Components 介紹與使用
前言
你有沒有曾經想過,在部署程式碼之前,希望先檢查一下有沒有錯誤,或者程式碼格式有沒有符合規範?這時候,CI/CD 就可以派上用場。CI(持續整合)可以幫你自動檢查程式碼品質,而 CD(持續交付/部署)則可以自動化部署流程,讓你的程式碼從開發到上線都更順暢。
但是,如果你有很多專案,而且每個專案都需要寫一模一樣或非常相似的 CI/CD 腳本,這就會變成一件既繁瑣又浪費時間的事情。你可能會想:「有沒有辦法只要簡單放入某些內容,就可以套用特定的腳本?」
其實,GitLab CI/CD 就提供了這樣的功能。透過重複利用與共享配置,你可以「讓多個專案共用同一套 CI/CD 流程」,不但節省時間,還能確保所有專案都遵循相同的規範。
例如,你可以在 .gitlab-ci.yml 套用別人是先撰寫好的腳本:
1234include: - component: $CI_SERVER_FQDN/my-org/security-components/secret-detection@1.0.0 inputs: stage: build
這樣,你的 stages 裡面就會載入 secre ...
手把手教你如何在本機透過 ssh 的方式連到 Docker 容器
前言
在開發 Docker 應用程式時,有時候我們會需要進入到容器內部進行操作,例如查看 log、修改設定檔等等。這時候,我們可以透過 ssh 的方式連接到容器,這樣就不用每次都透過 docker exec 進入容器,更加方便快捷。本章節將會介紹如何在本機透過 ssh 的方式連到 Docker 容器。
步驟
步驟 1:建立 Ubuntu 22.04 的 Docker 容器
我們要使用 host 模式來讓容器共享主機的網路。先拉取 Ubuntu 22.04 輕量版的 Docker image
1docker pull ubuntu:22.04
運行容器並使用 --network host,--network host 讓容器直接使用主機的網路環境,因此不需要手動進行 port mapping。因為 ubuntu:22.04 是一個最小化的 Docker image,預設沒有執行任何長時間運行的程序,所以當 docker run 完成初始化後,容器就會立即退出。所以這裡可以使用 tail -f /dev/null 這會讓容器內一直執行,確保它不會退出。
tail 是一個用來查看文件末尾幾 ...
Bash Cheatsheet - 腳本的小抄大全
前言
最近寫了很多腳本,但是有太多參數會忘記了,這篇文章主要是整理了一些常用的 bash 腳本技巧,包括變數、邏輯判斷、迴圈、重導向、子殼層、Here Documents 等等。
1. Built-in Variables
1234567$0, $1, $2 # 第 n 個參數,即 argv[n]$# # 參數數量,即 argc$@ # 所有的參數$* # 所有的參數,但是會把所有參數當成一個字串 可以搭配 IFS (Internal Field Separator) 使用來分割$? # 上一個指令的回傳值$$ # 目前程式的 pid$! # 上一個在背景執行的程式的 pid
2. Bash Builins
數學運算,這兩個寫法等價。
12echo $((1+1))echo $[1+1]
變數,{} 可省略
123456name="Shannon"echo $nameecho ${name}# 字串長度echo ${#name} # 7
指令替換,兩個寫法等價
12echo $(whoami)echo `whoami`
展開
...
養成撰寫 Bash 腳本的好習慣 - Bash Best Practice Guide
前言
因為最近為了撰寫 CI/CD Pipeline,因此有很大的時間都在寫 bash 腳本,寫著寫著就覺得應該來好好了解一些最佳實踐!因此整理出這篇教學。
在目前的世界裡面,Bash 繼承了 shell 的寶座,Bash 是可執行檔唯一允許的 shell 腳本語言。幾乎可以在所有 Linux 上找到,包括 Docker 鏡像。這是大多數後端運行的環境。因此,如果您需要編寫伺服器應用程式啟動、CI/CD 步驟或集成測試運行的腳本,Bash 隨時為您服務。
這篇主要參考了 google 所撰寫的 Shell Style Guide。然後還有網路常見的建議所組成,詳細可以參考 Reference。希望自己在寫腳本的時候可以養成良好的習慣…
google
如果您正在編寫超過 100 行的腳本,或者使用不直覺的控制流邏輯,那麼現在應該用更結構化的語言重寫它。請記住,腳本會不斷增長。儘早重寫腳本,以避免以後更耗時的重寫。
Environment
所有錯誤消息都應轉到 STDERR
這使得更容易區分正常狀態和實際問題。
建議使用列印錯誤消息和其他狀態資訊的功能。
ps.我自己覺得還可以添加顏 ...
一次搞懂 Git Merge 方法 - Merge, Fast Forward, Squash (補充 Gitlab Merge Request 策略)
前言
在軟體開發過程中,版本控制工具是每個開發者都不可或缺的利器,而 Git 以其強大的功能和靈活的操作方式,成為目前最流行的版本控制系統之一。在 Git 中,合併(merge) 是一項極為重要的操作,有時候我們開發完一個新功能(例如一個新功能分支)後,需要將這個新功能合併到主分支像是 master, develop,我們不會直接在主分支上面進行 commit 和 push (往往 repository 的 maintainer 也會禁止這些操作)也因此我們需要發起一個合併請求(Merge Request)來進行合併操作。而這個合併請求有一些不同的策略,理解這些合併策略,不僅能幫助開發者選擇合適的合併方式,還能在團隊協作中保持清晰的版本歷史,避免衝突與混亂。
本篇部落格將深入探討 GitLab 中三種常見的合併方法:Merge Commit、Semi-Linear Merge、Fast Forward Merge。
我會詳細解釋每種方法的操作流程、適用場景及其優缺點,讓你能夠在面對不同的開發需求時選擇最合適的合併策略。希望讀者能夠了解這些常見的合併策略,並能將它們靈活運用於日常開發過 ...
使用 Terraform 建立 GKE 叢集 - 從無到有建立 Google Kubernetes Engine 叢集 + Nginx Load Balancer + 測試
前言
今天要來介紹的是如何用 Terraform 建立 Google Kubernetes Engine,如果對使用 Terraform 建立、修改和刪除的指令不清楚可以參考我之前的文章 Terraform 基本操作,這篇文章主要是要介紹如何使用 Terraform 建立 GKE 叢集,並且建立 Nginx Load Balancer 來做為服務的入口,最後再透過 kubectl 來部署一個簡單的應用程式來測試負載平衡器是否正常運作。同時也會介紹要怎麼撰寫 Google Kubernetes Engine tf 檔案,應該參考什麼網站。
GKE 結構
GKE 的結構是: 叢集(cluster) > 節點池(node_pool) > 節點(node)
叢集
叢集是 Kubernetes 的核心單位,包含所有管理與執行工作負載所需的資源。它是由一組節點組成的容器管理平台。
節點池
節點池是一組具有相同配置的節點(虛擬機),是叢集資源的計算單位。
節點池內的所有節點使用相同的規格,例如機型、磁碟類型、映像類型等。
在 GKE 中,一個叢集可以有多個節點池。
節點
節點是 ...
Terraform 新手介紹 - 一篇立刻搞懂 Terrafrom 的核心與基礎元件
介紹
Terraform 是由 HashiCorp 開發的一種IaC管理工具,其誕生的原因來自現代 IT 基礎設施管理中對自動化、可重複性和跨平台支持的需求。隨著雲計算的普及,企業的基礎設施變得越來越動態,管理多雲環境(如 AWS、Azure、Google Cloud)和本地數據中心的資源變得複雜且容易出錯。傳統的手動配置方式不僅效率低,還容易導致環境之間的不一致。
Terraform 的產生主要為了解決以下需求:
基礎設施即代碼 (IaC):提供一種編程式方法來定義和管理基礎設施,使得資源配置版本化、可審核,並易於復現。
多雲支持:允許用戶通過單一工具管理不同雲平台和供應商的資源,避免過度依賴單一供應商。
可重複性和自動化:使用代碼編寫一次配置,無論是測試環境還是生產環境都可以一致地部署資源。
依賴管理:Terraform 能夠分析基礎設施資源之間的依賴關係,按正確順序創建或刪除資源,減少人為錯誤。
因此,Terraform 的出現使企業能夠更高效地管理和運營現代化的基礎設施,同時加強了敏捷性和穩定性。使用Terrafrom我們就不需要手動去建立或是刪除某個資源,只需要寫好腳本, ...
LeetCode #200 Number of Islands - 刷題之旅
1 題目描述
一個二維數組,把 1 看做陸地,把 0 看做大海,陸地相連組成一個島嶼。把陣列以外的區域也看做是大海,問總共有多少個島嶼。
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] is '0' or '1'
2 解法
這個解法主要有兩個:
DFS:就是深入檢查每個node是否有相連,如果有就把相連的部分都變成0,直到沒有相連的部分為止。
併查集 Disjoint-set data structure: 利用尋找root的方式,如果發現有共同的祖先,那就表示這兩個land是相連的,如果是不同的root就代表不同祖先,可能要建立bridge或是union合併。
DFS的方法比較簡單明瞭,併查集的方法比較複雜,但是很有趣,所以我兩個都會來說明如何實現。
2.1 DFS
基本上在上下左右探索的時候,要確保三個原則:
不要超出rows邊界
不要超出cols邊界
不要走到海洋
1234567891011def dfs(i, j): # (不要超過 row ...
Kubernetes - Replica 的幾種 Controller 比較 [Replication Controller vs ReplicaSet vs Deployment vs DaemonSet]
介紹
Replication Controller:確保有「固定數量」的 Pod 在運行。
ReplicaSet:和 Replication Controller 類似,但更靈活,可使用標籤篩選Pod,負責管理 Pod 的數量。
Deployment:管理和控制 ReplicaSet,讓你可以輕鬆升級、回滾和更新 Pod。
DaemonSet:確保每一台機器上都運行一個 Pod,適用於需要在每個 Node 上執行的服務。
Replication Controller
Replication Controller (RC)
Replication Controller 就像是一個「監視員」,它的工作是確保 Kubernetes 集群中有指定數量的 Pod 在運行。
想像你開了一家餐廳,你希望廚房裡總是有 3 位廚師在工作。Replication Controller 就是那個一直在監視廚房的人,如果發現少了廚師(Pod 故障了),它就會立刻找一個新的來補上。
同樣地,如果多出來的廚師(Pod)不需要,Replication Controller 也會請多餘的廚師離開,確保始終保 ...