搜尋目錄下每一個檔案的特定字/檔案名稱

在開發過程中,我們常需要快速找出「哪個檔案用到了這個變數?」或是「那個設定檔到底放在哪裡?」。 本文整理了 Linux/Mac 終端機中最常用的搜尋指令:grep、ag 和 find。 1. 搜尋檔案內容 (grep) grep 是系統內建最強大的文字搜尋工具。 常用指令 # 在目前目錄 (./) 遞歸搜尋 "R2" grep -rwn --color=auto ./ -e 'R2' 參數詳解 -r (recursive):遞歸搜尋,包含所有子目錄。 -w (word):僅匹配「完整單字」,避免匹配到部分字串(例如搜尋 is 不會匹配到 this)。 -n (line number):顯示行號。 -e (pattern):指定搜尋的關鍵字。 --color=auto:將關鍵字高亮顯示。 顯示前後文 (Context) 有時候只看一行不夠,我們需要看前後幾行程式碼: # -C (Context): 顯示前後各 1 行 grep -rwn -C 1 ./ -e 'R2' # -A (After): 顯示後 1 行 # -B (Before): 顯示前 1 行 2. 更快的選擇:The Silver Searcher (ag) grep 雖然強大,但速度較慢且指令較長。ag 是一個專為程式碼搜尋設計的工具,速度極快且預設忽略 .gitignore 的檔案。 (需額外安裝:brew install the_silver_searcher) ...

September 23, 2023 · 1 分鐘 · Peter

iOS如何把專案打包framwork後也讓原本的pod/套件包入framework ?

工作需要把整個app包成一個SDK讓另一個app引用,所以要把原本專案的套件也包進去,不然在打包framework的時候,import套件那一行會報錯. iOS如何把專案打包framwork後也讓原本的pod/套件包入framework ? 工作需要把整個app包成一個SDK讓另一個app引用,所以要把原本專案的套件也包進去,不然在打包framework的時候,import套件那一行會報錯. 假設你的專案叫”B”,打包的framework取名為BPack,那麽在Podfile的部分要加入framework自己的套件引用,原本的專案裝什麼pod,framework如果有用到該套件也要跟著裝,以SnapKit為例,作法如下: target ‘B’ do Comment the next line if you don’t want to use dynamic frameworks use_frameworks! pod ‘SnapKit’, ‘~> 5.6.0’ Pods for B end target ‘BPack’ do Comment the next line if you don’t want to use dynamic frameworks use_frameworks! pod ‘SnapKit’, ‘~> 5.6.0’ Pods for B Pods for BPack end另外,在Build Setting的部分好像也要做一下設定: 如果你包的是動態庫,那麽在framework target的Build Settings: Linking -> Mach-O Type應該要選擇:Dynamic Libray Mach-O這部分不太確定有沒有影響,不過我這樣選是可以Run App Successful. 有錯麻煩請指正,感謝! ...

September 22, 2023 · 1 分鐘 · Peter

面試必考:OSI 7層模型完全指南 - 從記憶口訣到實戰應用

前言:為什麼 OSI 7層是面試必考題? 在網路相關的技術面試中,OSI 7層模型幾乎是必考題。不論你是應徵後端工程師、DevOps、網路工程師,還是全端開發者,面試官都可能問:「請說明 OSI 7層模型」、「HTTP 在哪一層?」、「TCP 和 UDP 的差異?」 理解 OSI 7層模型不僅是為了應付面試,更是因為: 🔍 除錯網路問題:知道問題出在哪一層,才能對症下藥 🏗️ 設計系統架構:理解各層職責,設計出更好的系統 📡 優化網路效能:知道瓶頸在哪一層,才能有效優化 🛡️ 網路安全防護:不同層有不同的安全考量 本文涵蓋內容 記憶口訣:個人心法,快速記住 7 層順序 每層詳解:功能、協定、實際應用 封包傳輸流程:資料如何在各層之間流動 TCP/IP 對應:實務上常用的 4 層模型 面試常見問題:15+ 個經典面試題與解答 實戰經驗:除錯技巧與常見陷阱 快速記憶:P.D.N.T. S.P.A. 口訣 個人心法 記住每層的首位字母,組成縮寫:P.D.N.T. S.P.A. 口訣:有三個人(‘P’hy. ‘D’a. ‘N’et.)去(‘T.’: 想成 To)‘S.’ ‘P.’ ‘A.’ P - Physical (實體層) D - Data Link (資料連結層) N - Network (網路層) T - Transport (傳輸層) --- S - Session (會議層) P - Presentation (表現層) A - Application (應用層) 其他常見記憶法 英文口訣: ...

August 20, 2023 · 11 分鐘 · Peter

MacOS[祕技] Dock的隱藏與顯示

如果 Dock 有開啟自動隱藏的話,我們可以透過終端機指令把動畫效果關掉,讓操作更順暢。除此之外,還有許多不為人知的 Dock 隱藏祕技,這篇文章將一次整理給你! MacOS [祕技] Dock 的隱藏與顯示與更多隱藏技巧 桌面與Dock選項裡面可以找到 1. 加速 Dock 的顯示與隱藏 預設的 Dock 在自動隱藏時會有一個滑入滑出的動畫,如果你希望它反應更快,可以使用以下指令。 桌面與 Dock 選項裡面可以找到在終端機下指令: 消除顯示延遲 當你把滑鼠移動到螢幕邊緣時,Dock 通常會等待一小段時間才開始浮現。這個指令可以將延遲設為 0,讓 Dock 隨傳隨到。 defaults write com.apple.dock autohide-delay -float 0; killall Dock 加速動畫效果 除了消除延遲,你還可以加速(或移除)動畫本身的滑動時間。 defaults write com.apple.dock autohide-time-modifier -int 0; killall Dock 設為 0 表示瞬間顯示,沒有動畫。如果你覺得太快,也可以設為 0.5(預設值約為 1)。 還原設定 如果想恢復原狀,請執行: defaults delete com.apple.dock autohide-delay defaults delete com.apple.dock autohide-time-modifier killall Dock 2. 在 Dock 加入空白分隔線 (Spacer) 覺得 Dock 上的應用程式太擁擠,想要分門別類嗎?雖然 macOS 不允許直接拖曳空白,但我們可以透過指令加入「隱形的分隔線」。 ...

August 4, 2023 · 2 分鐘 · Peter

Xcode Hotkey

在 iOS 開發過程中,熟練使用 Xcode 快捷鍵是提升效率的關鍵。與其不斷地在滑鼠與鍵盤間切換,不如讓手指留在鍵盤上,像彈鋼琴一樣流暢地寫程式。 以下是我整理的 Xcode 必備快捷鍵速查表: 🚀 導航與跳轉 (Navigation) 最常用的功能,讓你快速在檔案與編輯器之間穿梭。 功能 快捷鍵 說明 快速開啟檔案 Cmd + Shift + O 最強大功能! 輸入檔名快速跳轉 (Open Quickly) 定位檔案位置 Cmd + Shift + J 在左側 Project Navigator 中選中目前編輯的檔案 跳轉到編輯器 Cmd + J 聚焦到編輯器區域,並可選擇開啟位置 顯示呼叫階層 Cmd + Ctrl + Shift + H Show Call Hierarchy,查看誰呼叫了這個方法 全域搜尋 Cmd + Shift + F Find in Workspace,搜尋整個專案 🖥 視窗與介面 (Interface) 快速開關不需要的面板,爭取最大的程式碼閱讀空間。 功能 快捷鍵 說明 開/關 導航面板 Cmd + 0 左側 Navigator (Project, Search, Git…) 開/關 檢查器 Cmd + Option + 0 右側 Inspector (Attributes, Identity…) 開/關 除錯區 Cmd + Shift + Y 下方 Debug Area 開新分頁 Cmd + T 開啟新的 Tab 開新視窗 Cmd + Option + T 開啟全新的 Xcode 視窗 📝 編輯與除錯 (Editing & Debugging) 寫程式時的得力助手。 ...

July 26, 2023 · 1 分鐘 · Peter

RxSwift -bindViewModel

第69行cell.configure一直進不去 RxSwift -bindViewModel 第69行cell.configure一直進不去 原因如下: required init?(coder aDecoder: NSCoder) 是 UIKit 控制器初始化的一部分,尤其是從 Storyboards 或 Xibs 中加載時。如果你正在嘗試從 Storyboard 或 Xib 中加載你的 ZooViewController,那麼就需要實現這個初始化方法。在你的程式碼中, required init?(coder aDecoder: NSCoder) { fatalError(“init(coder:) has not been implemented”) }你用 fatalError("init(coder:) has not been implemented") 拋出了一個執行時期的錯誤。 如果你確實不需要從 Storyboard 或 Xib 加載,你可以避免使用 ZooViewController 作為 Storyboard 或 Xib 的類別,或者避免透過 Storyboard 或 Xib 實例化 ZooViewController。在這種情況下,你的 init(coder:) 方法將永遠不會被呼叫,因此你的 fatalError 也不會觸發。 如果你需要從 Storyboard 或 Xib 加載 ZooViewController,那麼你需要提供 init(coder:) 方法的實現。這可能意味著你需要提供一個預設的 ZooViewModel,或者提供一種方式來設定 ZooViewModel,如下所示: required init?(coder aDecoder: NSCoder) { self.viewModel = ZooViewModel() super.init(coder: aDecoder) }最後從Main.storyboard的viewController冠上我要的ZooViewController, 問題就解決了.

July 21, 2023 · 1 分鐘 · Peter

Flutter 狀態監聽完全指南:Provider、Bloc、Riverpod、GetX 深度比較

前言:Flutter 狀態管理的核心挑戰 在 Flutter 開發中,狀態管理是最重要也最複雜的主題之一。當應用程式規模增長,Widget 樹層級加深,如何讓不同層級的 Widget 能夠正確地監聽和響應狀態變化,成為每個 Flutter 開發者必須面對的挑戰。 選擇錯誤的狀態監聽方式,會導致: ❌ 不必要的重繪:整個 Widget 樹被重建,效能下降 ❌ 記憶體洩漏:忘記釋放監聽器,導致記憶體持續增長 ❌ 狀態不同步:多個 Widget 顯示不一致的資料 ❌ 程式碼難以維護:狀態邏輯散落各處,難以追蹤 本文涵蓋內容 本文將深入探討 Flutter 四大主流狀態管理方案的監聽機制: Provider:Flutter 官方推薦的輕量級狀態管理 Bloc:基於 Stream 的企業級狀態管理 Riverpod:Provider 的改進版本,解決了 Provider 的核心問題 GetX:高效能的響應式狀態管理 我們將從實際問題出發,比較這四種方案的: 🔍 核心原理:底層如何實現狀態監聽 💻 實戰範例:可執行的完整程式碼 ⚡ 效能表現:重繪範圍、記憶體使用 🎯 適用場景:什麼情況下使用哪種方案 ⚠️ 常見陷阱:實戰中容易踩的坑 Provider 狀態監聽機制 Provider 是 Flutter 官方推薦的狀態管理方案,基於 InheritedWidget 實現。它的核心優勢是簡單易用,適合中小型應用。 Provider 核心概念 Provider 使用 依賴注入 (Dependency Injection) 和 作用域 (Scope) 的概念來管理狀態: flowchart TB App[MyApp] --> P1[ChangeNotifierProvider] P1 --> Scope1[作用域 1] Scope1 --> Route1[Route 1] Scope1 --> Route2[Route 2] Route1 --> W1[Widget A<br/>context.watch] Route1 --> W2[Widget B<br/>context.read] Route2 --> W3[Widget C<br/>❌ 無法存取] P1 -.->|提供狀態| W1 P1 -.->|提供狀態| W2 style P1 fill:#4ade80,color:#000 style W1 fill:#60a5fa,color:#000 style W2 fill:#60a5fa,color:#000 style W3 fill:#ef4444,color:#fff 關鍵概念: ...

July 13, 2023 · 18 分鐘 · Peter