<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>omegaatt</title>
    <link>https://www.omegaatt.com/</link>
    <description>Recent content on omegaatt</description>
    <generator>Hugo -- 0.164.0</generator>
    <language>zh-TW</language>
    <copyright>Raiven Kao 2020 - 2026</copyright>
    <lastBuildDate>Sat, 07 Nov 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.omegaatt.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>連 RSS 聚合都懶的看了，請直接塞到我臉上</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/karakeep_tg_bot/</link>
      <pubDate>Sat, 07 Nov 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/karakeep_tg_bot/</guid>
      <description>串接 Karakeep 與 Telegram bot 並發送消息到 Telegram channel</description>
    </item>
    <item>
      <title>從 Wolfi 到 SBOM：容器漏洞修補的實作與踩坑</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/wolfi_zero_cve_sbom_pipeline/</link>
      <pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/wolfi_zero_cve_sbom_pipeline/</guid>
      <description>記錄一次 Go 與 C/C&#43;&#43; 容器的 Wolfi 遷移經驗，從動態連結、多平台建置，到用 Syft、Grype 與 ORAS 產生及交付 SBOM。</description>
    </item>
    <item>
      <title>Unrounded Scaling：Go 1.27 浮點數轉換演算法的深度拆解</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_unrounded_scaling/</link>
      <pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_unrounded_scaling/</guid>
      <description>拆解 Go 浮點數列印與解析的 unrounded scaling 演算法，從整數運算、正確性到效能測試，理解 strconv 背後的實作。</description>
    </item>
    <item>
      <title>Spec-First API：用 codegen 約束 LLM 與人類的 drift</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/spec_first_api_against_drift/</link>
      <pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/spec_first_api_against_drift/</guid>
      <description>記錄 Go 服務從 code-first 遷移到 spec-first 的過程，用 OpenAPI、oapi-codegen 與 CI 降低路由、文件與實作之間的落差。</description>
    </item>
    <item>
      <title>Golang 1.27 新特性整理：泛型補完與轉正的實驗性功能</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_1_27_new_features/</link>
      <pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_1_27_new_features/</guid>
      <description>依 Go 1.27 release candidate 整理泛型與實驗功能的變動，搭配程式碼範例記錄升級時值得留意的地方。</description>
    </item>
    <item>
      <title>Go 1.27 即將支援 Generic Method：告別 package-level 函式的 workaround</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_generic_method/</link>
      <pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_generic_method/</guid>
      <description>從 Go 泛型方法的限制談起，整理 interface dispatch 的取捨、package-level workaround 與 generic method 提案的進展。</description>
    </item>
    <item>
      <title>把 k3s 從 Ubuntu 搬到 OpenSUSE MicroOS，順便換上 FluxCD GitOps</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/migrate_k3s_lab_from_ubuntu_to_opensuse_micro_os/</link>
      <pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/migrate_k3s_lab_from_ubuntu_to_opensuse_micro_os/</guid>
      <description>把家中的 k3s 服務搬到 OpenSUSE MicroOS，以不可變系統與 FluxCD 管理升級、設定及日常維運。</description>
    </item>
    <item>
      <title>Pragmatic Clean Architecture in Go</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/pragmatic_clean_architecture_in_go/</link>
      <pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/pragmatic_clean_architecture_in_go/</guid>
      <description>Go 專案該保留哪些分層、捨棄哪些抽象？從實務取捨出發，整理適合中小型專案的 Clean Architecture。</description>
    </item>
    <item>
      <title>k3s Ingress Controller 從 Nginx 遷移到 Traefik 同時整合 CrowdSec</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/migrate_ingress_controller_from_nginx_to_traefik/</link>
      <pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/migrate_ingress_controller_from_nginx_to_traefik/</guid>
      <description>記錄 Homelab 的 k3s Ingress 從 Nginx 遷移到 Traefik 的選擇與設定，並整合 CrowdSec 處理服務入口的防護。</description>
    </item>
    <item>
      <title>用 Hetzner &#43; Proxmox Backup Server 實踐 3-2-1 備份原則的異地備援</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/proxmox_backup_server_on_hetzner/</link>
      <pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/proxmox_backup_server_on_hetzner/</guid>
      <description>用 Hetzner、Proxmox Backup Server 與 WireGuard 建立異地備份，記錄 3-2-1 架構、方案選擇與部署時踩過的坑。</description>
    </item>
    <item>
      <title>放棄 Electron 與 Tauri? 我用 Wails &#43; HTMX 打造 3MB 的跨平台桌面應用</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_desktop_application_with_wails_and_htmx/</link>
      <pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_desktop_application_with_wails_and_htmx/</guid>
      <description>用 Go、Wails、HTMX 與 Templ 製作批次重新命名工具，記錄跨平台桌面應用的技術選擇、開發與打包經驗。</description>
    </item>
    <item>
      <title>旅遊札記 - 2026 新年的關西遊</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/travel_kansai_kyoto_and_osaka/</link>
      <pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/travel_kansai_kyoto_and_osaka/</guid>
      <description>從京都的初雪走到大阪的暖陽。五天的關西旅行，記下沿途的街景、食物，以及和 Murphy 一起經過的日常。</description>
    </item>
    <item>
      <title>Clean Craftsmanship：在 LLM 時代重拾軟體工匠精神</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/clean_craftsmanship/</link>
      <pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/clean_craftsmanship/</guid>
      <description>&lt;h2 id=&#34;為什麼在這個時間點讀這本書&#34;&gt;為什麼在這個時間點讀這本書&lt;/h2&gt;
&lt;p&gt;最近對於如何在 LLM 時代帶領團隊一起提昇生產力感到困惑。當 AI 能在幾秒鐘內生成幾百行程式碼，「寫程式」這件事的門檻似乎降到了前所未有的低點。但門檻低了，品質呢？&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 1.25 testing/synctest 初體驗：告別在測試中寫 time.Sleep 的日子</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_synctest/</link>
      <pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_synctest/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在我們目前的應用程式架構中，由於高度與 Kubernetes 耦合，服務啟動與運作期間需要頻繁地去讀取 K8s 中的 ConfigMap。為了達成配置熱更新（Hot Reload），我們引入了 Kubernetes client-go 中的 &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/informers&#34;&gt;informers&lt;/a&gt; 機制來監聽 ConfigMap 的 CRUD 事件。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RouterOS v7.21 container &#43; App 組合拳，你的下一台 Router 也可以是 All In One Homelab</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/routeros_v7_21_container_and_app/</link>
      <pubDate>Sat, 17 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/routeros_v7_21_container_and_app/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;自從 RouterOS 在 v7.13 引入 container 功能後，這為我們這些 Homelab 愛好者開啟了一扇新的大門。我們終於可以在路由器上原生執行 container，這意味著一些網路相關的基礎設施服務（Infrastructure Services）可以從原本的伺服器中遷移出來。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Container Image Optimization 那些年我們寫錯的 Dockerfile</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/container_image_optimization/</link>
      <pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/container_image_optimization/</guid>
      <description>&lt;p&gt;最近在檢視公司內部的專案時，針對其中一個 container image 進行了優化。在一個簡單的 commit 後，我們的 image size 從 &lt;strong&gt;1.82GB&lt;/strong&gt; 修正到了 &lt;strong&gt;1.18GB&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;透過 &lt;a href=&#34;https://github.com/wagoodman/dive&#34;&gt;dive&lt;/a&gt; 查看，Image Efficiency 更是從不及格的 &lt;strong&gt;69%&lt;/strong&gt; 飆升到了 &lt;strong&gt;99%&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 1.26 新特性在數量上史無前例的多</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/golang_1_26_huge_features/</link>
      <pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/golang_1_26_huge_features/</guid>
      <description>&lt;p&gt;隨著時間來到 2026 年初，Go 語言迎來了 1.26 版本的更新。如果說 Go 1.18 的泛型是語言層面的重大變革，那麼 Go 1.26 則是在「數量」與「廣度」上讓人感到驚艷的一次釋出。從語言特性的語法糖、標準庫的實用擴充，到 Runtime 效能的顯著提升（Green Tea GC），甚至是實驗性的 SIMD 支援，這次的更新內容豐富到讓人目不暇給。&lt;/p&gt;</description>
    </item>
    <item>
      <title>從 GrapheneOS 回歸原廠：Google Pixel 5 刷機紀錄</title>
      <link>https://www.omegaatt.com/blogs/develop/2026/recovery_pixel_to_factory_firmware/</link>
      <pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2026/recovery_pixel_to_factory_firmware/</guid>
      <description>&lt;p&gt;最近整理抽屜時，翻出了這台陪伴我一段時間的 Google Pixel 5。&lt;/p&gt;
&lt;p&gt;身為一個喜歡折騰的開發者，早在它退役成為備用機時，我就第一時間把它刷成了 &lt;a href=&#34;https://grapheneos.org/&#34;&gt;GrapheneOS&lt;/a&gt;。不得不說，GrapheneOS 在隱私保護和安全性上做得真的很好，沒有 Google Play Services 的純淨體驗也別有一番風味（雖然依賴 Sandboxed Google Play 還是能解決大部分 App 的問題）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2025 Recap</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/2025_recap/</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/2025_recap/</guid>
      <description>換工作、帶新人、重新思考 AI 與開發，也繼續旅行與拍照。用一年的文字與照片，留下 2025 的自己。</description>
    </item>
    <item>
      <title>Helm Smart Resource：讓你的 Chart 學會與既有資源和平共處</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/helm_smart_resource/</link>
      <pubDate>Sat, 22 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/helm_smart_resource/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在 Kubernetes 的世界裡，Helm 無疑是管理應用程式部署的霸主。它標準化了資源的定義，讓我們可以用宣告式的方式管理整套系統。然而，在真實世界的維運場景中，事情往往沒那麼單純。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interface 不是有開就好：從一個 PR 來看抽象化的重要性</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/interface-is-not-just-about-creating-one/</link>
      <pubDate>Sat, 04 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/interface-is-not-just-about-creating-one/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近團隊正在開發一個新產品，其中一個核心功能需要 client 與 server 之間進行即時、雙向的溝通。經過一番技術評估，我們決定採用 WebSocket 來實現這個需求。&lt;/p&gt;
&lt;p&gt;身為一個良好習慣的開發團隊，我們在開發初期就導入了依賴注入（Dependency Injection），希望透過界面（Interface）來解耦商業邏輯與具體的實作，這樣不僅能提高程式碼的可測試性，未來在更換底層實作時也能更加輕鬆。&lt;/p&gt;</description>
    </item>
    <item>
      <title>監控你的執行檔：初探 watchexec</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/watch_your_exec_watchexec/</link>
      <pubDate>Sat, 06 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/watch_your_exec_watchexec/</guid>
      <description>前端開發有 liveserver，後端開發有 air，那 TUI 開發呢？本文記錄了我在開發 Bubbletea 應用時，從 air 轉向 watchexec 的心路歷程，以及如何使用這個通用工具來優雅地實現終端機應用的熱重載。</description>
    </item>
    <item>
      <title>用 Golang Bubbletea 打造終端機應用：從 Hello World 到多頁面架構</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/golang_bubbletea_experience/</link>
      <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/golang_bubbletea_experience/</guid>
      <description>探索如何使用 Golang 的 Bubbletea 函式庫，基於 Elm 架構，從零開始打造一個互動式終端機應用（TUI）。本文將從一個簡單的計數器範例，逐步引導你建構出一個類似 Web 應用的多頁面架構，並分享整個生命週期中的關鍵概念與注意事項。</description>
    </item>
    <item>
      <title>初探 Tauri：為了解決朋友的繁瑣任務，寫了個桌面 App</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/tauri_first_look/</link>
      <pubDate>Wed, 27 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/tauri_first_look/</guid>
      <description>一個非工程師朋友的日常繁瑣任務，成為我初探 Tauri 的契機。本文記錄如何使用 Rust 的強大後端結合 React 的靈活前端，打造一個輕量、跨平台的桌面應用，來解決真實世界的問題。</description>
    </item>
    <item>
      <title>Prompt to Product：AI 時代開發者的範式轉移</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/prompt_to_product/</link>
      <pubDate>Sun, 10 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/prompt_to_product/</guid>
      <description>&lt;h2 id=&#34;那些年我們追逐的開發效率&#34;&gt;那些年我們追逐的開發效率&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://nowankybollocks.com/wp-content/uploads/2020/01/10x.jpg&#34; alt=&#34;bg fit right&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;
&lt;p&gt;還記得第一次聽到「十倍工程師」這個詞的時候，心中總是充滿憧憬。想像著有一天也能寫出十倍的程式碼、處理十倍的任務、創造十倍的價值。每當看到某個同事在短時間內完成複雜的功能，總是會想：他們是不是真的擁有某種神秘的超能力？&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何利用 Golang AST 助攻 LLM 省 token 又高效</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/golang_ast_llm_coding/</link>
      <pubDate>Mon, 16 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/golang_ast_llm_coding/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;近來大型語言模型（LLM）的發展可謂一日千里，特別是在程式碼理解、生成與輔助開發方面，展現出了驚人的潛力。許多開發者開始嘗試將 LLM 融入到日常工作中，期望能提昇開發效率，甚至實現所謂的「vibe coding」——讓 LLM 理解程式碼的整體風格與意圖，並在此基礎上進行協作。&lt;/p&gt;</description>
    </item>
    <item>
      <title>一次核心模組的重構經驗</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/experience_of_refine_core_module/</link>
      <pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/experience_of_refine_core_module/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在軟體開發的漫漫長路中，我們時常會接手一些充滿「歷史印記」的專案。這些專案的核心模組，往往因為業務的快速迭代與時間的無情沖刷，逐漸演化成難以觸碰的「史前巨獸」。近期，我便有幸（或許該說是不幸地）參與了一次這樣核心模組的重構之旅，其核心是我們產品線廣泛使用的 Golang gRPC 認證攔截器 (Interceptor)。這段經歷充滿挑戰，但也收穫良多，希望能藉此分享一些心得。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang Iterator 簡介與 samber/lo 比較</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/golang_iterator/</link>
      <pubDate>Sat, 31 May 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/golang_iterator/</guid>
      <description>&lt;p&gt;自從 Golang 1.18 版本引入泛型（Generics）後，Go 語言的生態系統迎來了許多令人興奮的變化。其中，Golang 1.23 版本對 Iterator（迭代器）的標準化，以及 &lt;code&gt;iter&lt;/code&gt; 套件的加入，無疑是近期改動中相當重要的一環。本文將淺談 Golang Iterator 的基本概念，深入探討 Pure Iterator 與 Impure Iterator 之間的區別與設計考量，並與社群中流行的 &lt;code&gt;samber/lo&lt;/code&gt; 工具庫進行比較。&lt;/p&gt;</description>
    </item>
    <item>
      <title>告別 Docker Desktop 束縛！macOS 容器實戰：colima &#43; k8s &#43; containerd 踩坑遷移全記錄</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/colima_docker_alternative_on_macos/</link>
      <pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/colima_docker_alternative_on_macos/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;身為一個開發者，特別是在 macOS 環境下，Docker Desktop 幾乎是容器化開發的標配。然而，自從 Docker Desktop 開始針對大型企業調整其&lt;a href=&#34;https://www.ithome.com.tw/news/146537&#34;&gt;授權模式&lt;/a&gt;後，許多開發者開始尋找替代方案。&lt;/p&gt;
&lt;p&gt;市面上確實出現了一些選擇，例如閉源但功能強大的 &lt;a href=&#34;https://orbstack.dev/&#34;&gt;OrbStack&lt;/a&gt;。但對於熱愛開源的我來說，目光自然投向了社群。這時，&lt;a href=&#34;https://github.com/abiosoft/colima&#34;&gt;colima&lt;/a&gt; 這個開源專案進入了我的視野。它不僅提供了一個在 macOS 上運行 Linux 容器的輕量級方式，還內建了 Kubernetes 支援，引起了我極大的興趣。&lt;/p&gt;</description>
    </item>
    <item>
      <title>建構多平台的 container image</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/building_multiple_platform_container_image/</link>
      <pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/building_multiple_platform_container_image/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近在搞 side project 時，常常需要在不同的 CPU 架構上跑我的應用程式。例如，開發用的 MacBook 是 ARM 架構 (Apple Silicon)，開發用的 Desktop 是 x86 架構（Ryzen 5900X），而部署的伺服器可能是 x86 (AMD64)，有時候甚至想在 Raspberry Pi (ARM) 上跑些小東西。每次都要為不同平台分別建構 image 實在有點麻煩，而且 Registry 上一堆 &lt;code&gt;xxxapp-amd64&lt;/code&gt;, &lt;code&gt;xxxapp-arm64&lt;/code&gt; 的 tag 看了也很礙眼。經過一番研究與嘗試，是時候接觸 Docker Buildx 了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Never Install Locally？試試 Dev Container</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/dev_container/</link>
      <pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/dev_container/</guid>
      <description>&lt;p&gt;最近換了新工作，到了一間資訊安全公司，讓我更加重視開發環境的安全。&lt;/p&gt;
&lt;p&gt;還記得之前分享過&lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2024/two_distrobox_use_case&#34;&gt;透過 Distrobox 解決 Linux 環境依賴問題&lt;/a&gt;，用他來解決不同 Linux distribution 的依賴關係，背後即是讓程式跑在 container 內。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 go work 在本地開發解決同時開發 module 的問題</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/go_module_and_go_work/</link>
      <pubDate>Thu, 20 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/go_module_and_go_work/</guid>
      <description>&lt;p&gt;在 &lt;a href=&#34;https://go.dev/blog/get-familiar-with-workspaces&#34;&gt;Golang 1.18 中 go workspace 的提案&lt;/a&gt;釋出後，golang 的官方文件或多或少也提到應該要怎麼做 multi module 的開發。相較於過去需要不斷的替換 &lt;code&gt;go.mod&lt;/code&gt; 內的 &lt;code&gt;replace&lt;/code&gt; 指令，&lt;code&gt;go work&lt;/code&gt; 大幅改善了 multi module 的開發體驗。&lt;/p&gt;</description>
    </item>
    <item>
      <title>在習慣 go mod 後重新學習 git submodule</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/git_submodule_turorial/</link>
      <pubDate>Fri, 24 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/git_submodule_turorial/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;使用 Golang 作為主要開發已經有五年的時間。最近因工作需要接觸到 Python 專案，並且該專案使用 git submodule 的方式來引用共同函式庫 &lt;code&gt;common-lib-python&lt;/code&gt;。對於長久使用 Golang 的 &lt;code&gt;go mod&lt;/code&gt; 的我來說，submodule 是一個相對陌生的概念。藉這個機會撰寫一篇文章，整理並紀錄一下 git submodule 的用法，也作為未來的參考。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang Composition over Inheritance</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/golang_composition_over_inheritance/</link>
      <pubDate>Sat, 11 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/golang_composition_over_inheritance/</guid>
      <description>&lt;p&gt;Golang 是一門簡潔有力的程式語言，相較於其他程式語言，更傾向於使用組合（composition）而不是繼承（inheritance），語言設計之初更是沒有提供繼承的關鍵字，這種設計哲學讓 Golang 在現代軟體開發中脫穎而出。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 Templater 來提昇 Obsidian 的生產力</title>
      <link>https://www.omegaatt.com/blogs/develop/2025/use_obsidian_templater_to_get_more_productivity/</link>
      <pubDate>Thu, 02 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2025/use_obsidian_templater_to_get_more_productivity/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;這篇文章不涉及 &lt;a href=&#34;https://obsidian.md/&#34;&gt;Obsidian&lt;/a&gt; 完整使用說明以及 &lt;a href=&#34;https://silentvoid13.github.io/Templater/&#34;&gt;Templater&lt;/a&gt; 完整使用教學，僅以一個 use case 來展現如何使用 Templater 來提昇 Obsidian 的使用效率。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;前言&#34;&gt;前言：&lt;/h2&gt;
&lt;p&gt;工作日誌，是一個甜蜜的負擔，有些人是因為公司要求，開始寫工作日誌，逐漸流於形式。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2024 Recap</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/2024_recap/</link>
      <pubDate>Tue, 31 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/2024_recap/</guid>
      <description>關於健康、工作、攝影與旅行的年度回顧。在一次次選擇中，慢慢找到定義自己的方式。</description>
    </item>
    <item>
      <title>開源軟體的雙面刃：免費背後的隱藏成本</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/the_double_edged_sword_of_open_source_software.md/</link>
      <pubDate>Fri, 01 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/the_double_edged_sword_of_open_source_software.md/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;./images/20241102_142051.webp&#34; alt=&#34;setup-0&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;
&lt;p&gt;每日例行地開啟最愛的 Save for later，準備觀看有哪些部落格更新、產品釋出新版本時，一行醒目的提示告訴你「&lt;a href=&#34;https://blog.omnivore.app/p/details-on-omnivore-shutting-down&#34;&gt;我們即將關閉伺服器&lt;/a&gt;」。&lt;/p&gt;
&lt;p&gt;錯愕，這是 2024 年十月底每一位 Omnivore App 難民的心情。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 1.22 中 http routing 的改進</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/golang_http_routing_122/</link>
      <pubDate>Wed, 30 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/golang_http_routing_122/</guid>
      <description>&lt;p&gt;Golang 作為一個偏向 server 應用的程式語言，一般的 web server 並不會直接使用原生的 package &lt;code&gt;net/http&lt;/code&gt;，而更多的使用 &lt;code&gt;gin-gonic/gin&lt;/code&gt; 或是 &lt;code&gt;gorilla/mux&lt;/code&gt;，後來也有 &lt;code&gt;labstack/echo&lt;/code&gt; 以及 &lt;code&gt;go-chi/chi&lt;/code&gt; 等等選擇，在效能、輕量、好維護、好擴充中，都能找到對應的 third party package，其中的原因不外乎是原生的 package 提供的功能過於簡潔。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 TinyGo 與 Raspberry pi pico 實現溫濕度感測器</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/tinygo_temperature_humidity_sensor/</link>
      <pubDate>Wed, 02 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/tinygo_temperature_humidity_sensor/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;作為嵌入式系統學習的微小專案，我決定使用 &lt;a href=&#34;https://tinygo.org/&#34;&gt;TinyGo&lt;/a&gt; 來實現一個簡單的溫濕度感測器。過去我大多使用 Arduino 作為微控制器（MCU）開發平台，但這次想嘗試使用 TinyGo 來進行單片機的學習。
TinyGo 是 Go 語言的一個子集，專門針對小型設備和微控制器進行了優化，使得我們可以在資源受限的硬體上運行 Go 程式。&lt;/p&gt;</description>
    </item>
    <item>
      <title>A smarter way to change directory: zoxide</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/zoxide_a_smarter_way_to_change_directory/</link>
      <pubDate>Tue, 24 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/zoxide_a_smarter_way_to_change_directory/</guid>
      <description>&lt;p&gt;在日常的開發工作中，我們經常需要在不同的目錄間切換。雖然 &lt;code&gt;cd&lt;/code&gt; 命令已經足夠好用，但如果有一個更聰明的工具能記住我們最常用的目錄，並讓我們用最少的按鍵就能快速跳轉，那豈不是更棒?&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 Bitwarden 與自架後端 Vaultwarden 來管理密碼與 2FA Authenticator</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/bitwarden_with_self_hosted_password_backend/</link>
      <pubDate>Sun, 01 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/bitwarden_with_self_hosted_password_backend/</guid>
      <description>&lt;p&gt;在尋覓有哪些 self-hosted 專案好玩時，偶然發現了 1password、LastPass 的開源替代方案，甚至後端資料庫能自架，決定架來用用看。&lt;/p&gt;
&lt;p&gt;為什麼要自架？完全控制資料、隱私考量、或者純粹是學習和折騰 (符合 self-hosted 精神)。但控制權也意味著責任，特別是安全和備份。&lt;/p&gt;</description>
    </item>
    <item>
      <title>在 Firefox 上使用 PWA 將網頁應用安裝成 Desktop App</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/</link>
      <pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;開應用時，跨平台的桌面解決方案時常困擾開發者，在 Linux Desktop 上要支援多種桌面協議與桌面管理系統，更是複雜許多。時常會看到 Electron 等等基於 chromium 的技術。&lt;/p&gt;
&lt;p&gt;當然也可以像是 zed.dev 這樣的 geek 精神，自己寫了一套跨平台的 GUI 框架，但多數新創公司可能沒有這些資源來實現。例如已經非常成熟的 Notion.so、Obsidian 等等都是基於 Electron 實現的。&lt;/p&gt;</description>
    </item>
    <item>
      <title>透過內建的 pprof 工具來分析 Golang 發生的 memory leak</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/golang_memory_leak_detection/</link>
      <pubDate>Sat, 17 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/golang_memory_leak_detection/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;某天下午，公司的 cronjob daemon 無預警的被 GCP OOM Kill 了，且程式碼沒有看出明顯的原因。&lt;/p&gt;
&lt;p&gt;根據過去的經驗，local 開發時會使用 &lt;code&gt;go tool pprof&lt;/code&gt; 來分析 CPU profile 或是 memory 與 trace 的問題，詳細可以參考 &lt;a href=&#34;https://go.dev/blog/pprof&#34;&gt;Go 官方文件&lt;/a&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>從實務經驗重新認識 TLS</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/tls_tutorial_with_two_practice/</link>
      <pubDate>Sat, 22 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/tls_tutorial_with_two_practice/</guid>
      <description>&lt;p&gt;因為&lt;a href=&#34;./../grafana_embed_example&#34;&gt;工作需要部署 grafana&lt;/a&gt;，重新認識了 TLS 的流程，藉此機會把學習過程紀錄下來。&lt;/p&gt;
&lt;p&gt;主要分為理論與案例分享兩個大章節，&lt;a href=&#34;#%E7%90%86%E8%AB%96&#34;&gt;理論章節&lt;/a&gt;主要是在講「應該要知道但學過就會忘」的內行，&lt;a href=&#34;#%E6%A1%88%E4%BE%8B%E5%88%86%E4%BA%AB&#34;&gt;案例分享&lt;/a&gt;則為這一次部署 grafana 時的經驗分享。&lt;/p&gt;
&lt;h2 id=&#34;理論&#34;&gt;理論&lt;/h2&gt;
&lt;h3 id=&#34;介紹&#34;&gt;介紹&lt;/h3&gt;
&lt;h4 id=&#34;tls-是什麼&#34;&gt;TLS 是什麼&lt;/h4&gt;
&lt;p&gt;TLS（Transport Layer Security，傳輸層安全協議）是用來保護互聯網通訊安全的協議。它能夠確保數據在互聯網上傳輸過程中的機密性、完整性和真實性。TLS 是從 SSL（Secure Sockets Layer）發展而來的，因此我們可能也可以把它稱為 SSL/TLS。&lt;/p&gt;</description>
    </item>
    <item>
      <title>透過 throughput 與 latency 的關係解決高延遲問題</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/throughput_and_latency/</link>
      <pubDate>Sun, 16 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/throughput_and_latency/</guid>
      <description>&lt;p&gt;在軟體工程中，我們常會面臨服務 high latency 的問題，而要解決這個問題，理解 throughput 與 latency 的關係是關鍵。&lt;/p&gt;
&lt;h2 id=&#34;名詞定義&#34;&gt;名詞定義&lt;/h2&gt;
&lt;p&gt;什麼是 throughput 與 latency？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;latency：處理一個請求需要花多少時間。從請求進來到回應出去的時間差。通常用毫秒 (ms) 來量測。越低越好。&lt;/li&gt;
&lt;li&gt;throughput：單位時間內能處理多少請求。通常用 RPS (Requests Per Second) 或 QPS (Queries Per Second) 來表示。越高越好。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;server-如何工作&#34;&gt;server 如何工作&lt;/h2&gt;
&lt;p&gt;server 接收請求後，由一個或多執行緒（threads）處理請求並生成回應。單執行緒 server 一次只能處理一個請求，而多執行緒 server 可以同時處理多個請求。&lt;/p&gt;</description>
    </item>
    <item>
      <title>基於 Golang 的 Grafana Dashboard 與 JWT 認證的前後端實作</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/grafana_embed_example/</link>
      <pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/grafana_embed_example/</guid>
      <description>&lt;p&gt;在工作上有一個需求是需要做一些 &lt;a href=&#34;https://aws.amazon.com/tw/what-is/olap/&#34;&gt;OLAP&lt;/a&gt;，原訂計畫是使用 Google Looker(ver. Google Cloud Core)，礙於量小不符合經濟效益，決定用 Grafana 這個較熟悉的開源套件來幫助我們做視覺化的處理。&lt;/p&gt;
&lt;p&gt;這篇文章的範例可以在 &lt;a href=&#34;https://github.com/omegaatt36/grafana-embed-example&#34;&gt;omegaatt36/grafana-embed-example&lt;/a&gt; 中找到所有的 source code&lt;/p&gt;</description>
    </item>
    <item>
      <title>從 vuepress 遷移到 hugo 的心得</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/migrate_from_vuepress_to_hugo/</link>
      <pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/migrate_from_vuepress_to_hugo/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在網頁開發中，選擇合適的靜態網站生成器非常重要。過去我們使用 VuePress 來建立部落格網站，但在使用過程中遇到了一些痛點，最終決定遷移到 Hugo。本篇文章分享遷移過程中的一些心得。&lt;/p&gt;</description>
    </item>
    <item>
      <title>用 testcontainers 在本地開發 Go 應用程式</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/testcontainers_with_go/</link>
      <pubDate>Sun, 19 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/testcontainers_with_go/</guid>
      <description>&lt;h2 id=&#34;介紹&#34;&gt;介紹&lt;/h2&gt;
&lt;p&gt;使用 &lt;a href=&#34;https://testcontainers.com/&#34;&gt;testcontainers&lt;/a&gt; 是在本地開發 Golang 應用程式的一個高效方式。這可以讓我們在不需要依賴外部環境的情況下，模擬應用程式在實際生產環境中的運行狀況。&lt;/p&gt;
&lt;h3 id=&#34;安裝-testcontainers&#34;&gt;安裝 testcontainers&lt;/h3&gt;
&lt;p&gt;在 Go 專案中，我們可以通過以下指令來導入 testcontainers&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用內建的 rsync 備份 Truenas Scale 到 Proxmox Backup Server</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/backup_from_truenas_scale_to_pbs/</link>
      <pubDate>Sun, 19 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/backup_from_truenas_scale_to_pbs/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;過去我會使用 backup script 配合 crontab 來定期的備份 nas 的資料，這次更換了 Proxmox Backup Server 的物理機後，多了一個硬碟的空間好讓我實驗 Truenas Scale 的備份機制。&lt;/p&gt;
&lt;h3 id=&#34;差異&#34;&gt;差異&lt;/h3&gt;
&lt;p&gt;rsync 本身並沒有 server/client 的概念，只有 source 與 destination。
過去我會在&lt;strong&gt;備份主機&lt;/strong&gt;上透過 samba 來 mount Nas 到資料夾內，檢查有沒有 mount 成功才在&lt;strong&gt;備份主機&lt;/strong&gt;上使用 rsync。
而 Truenas Scale 提供的 Data Protection 功能中，內建了 Rsync Tasks 模組，透過預先建立好的 ssh credential 來呼叫&lt;strong&gt;備份主機&lt;/strong&gt;進行 rsync。
同樣都是由&lt;strong&gt;備份主機&lt;/strong&gt;來進行 rsync，主要是任務的執行呼叫是 Truenas Scale 本身還是&lt;strong&gt;備份主基本身&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>透過 Distrobox 解決 Linux 環境依賴問題</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/two_distrobox_use_case/</link>
      <pubDate>Sat, 18 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/two_distrobox_use_case/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;自從一年前嘗試使用 &lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2023/kde_neon_experience&#34;&gt;KDE Neon&lt;/a&gt; 後，主要的桌面開發環境就從 wsl 整個遷移到 Linux 上。這一年來感受到，KDE Neon 可能正如 reddit 上的留言闡述的那樣，只是 KDE 團隊的「實驗場」，可以享受到「最」新的 Plasma 與「較」新的 Kernel，卻始終是基於 Ubuntu 22.04 LTS，即便 Ubuntu 24.04 LTS 推出之際，也不再讓我感受性感。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何不啟動 container 從 image 中提取可執行檔</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/extract_executable_from_docker_image/</link>
      <pubDate>Sun, 14 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/extract_executable_from_docker_image/</guid>
      <description>&lt;p&gt;::: info
雖然文章內大多指令都是使用 docker，但由於是標準的 OCI image，使用 Podman 也是一樣的效果。
:::&lt;/p&gt;
&lt;p&gt;某段時間內，我會將所有需要執行的 binary 使用 containerize 給打包起來執行，例如：&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何利用 Open Policy Agent 配合 Golang 建構彈性的 RBAC 模組</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/golang_rbac_with_open_policy_agent/</link>
      <pubDate>Thu, 04 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/golang_rbac_with_open_policy_agent/</guid>
      <description>&lt;h2 id=&#34;rbac-概念簡介&#34;&gt;RBAC 概念簡介&lt;/h2&gt;
&lt;p&gt;在我們探討如何利用 Open Policy Agent (以下簡稱 OPA) 和 Golang 建立一個彈性的 RBAC 模組之前，先讓我們來了解一下 RBAC的基本概念。&lt;/p&gt;
&lt;p&gt;RBAC（Role-Based Access Control，基於角色的訪問控制）是一種廣泛應用的訪問控制策略，在軟體安全性領域尤為重要。其核心思想是將系統訪問權限與用戶的角色（職位、責任或職務）關聯起來，而不是直接與個別用戶關聯。這意味著訪問權限被捆綁到角色上，然後將用戶分配給這些角色。舉個例子，一個「管理員」角色可能有權訪問系統的所有資源，而「員工」角色則只能訪問特定部分的資源。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Agile Testing 閱讀筆記</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/agile_testing/</link>
      <pubDate>Sun, 24 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/agile_testing/</guid>
      <description>&lt;iframe src=&#34;https://gamma.app/embed/8r0jqfc8k78lads&#34; style=&#34;width: 100%; max-width: 100%; height: 450px&#34; &gt;&lt;/iframe&gt;
&lt;h2 id=&#34;鋪墊敏捷開發價值觀原則與實踐&#34;&gt;鋪墊：敏捷開發價值觀、原則與實踐&lt;/h2&gt;
&lt;p&gt;有什麼開發，就有什麼測試，傳統開發就有傳統測試，敏捷開發就應該要推行敏捷測試。在討論敏捷測試前，應該先理解敏捷開發模式，否則理解敏捷測試會很困難。&lt;/p&gt;</description>
    </item>
    <item>
      <title>那些在 Backend Sharing 中出現的人事物</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/backend_sharing_note/</link>
      <pubDate>Sun, 24 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/backend_sharing_note/</guid>
      <description>&lt;p&gt;《最高學以致用法》、《最高學習法》這兩本書是我在 2023 年上半年讀了覺得挺有意思的書，核心概念就是「產出」，例如唸書時能夠回答同學問題的，肯定都已經精通該知識點了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>透過 CLI 調整藍牙耳機音訊設定</title>
      <link>https://www.omegaatt.com/blogs/develop/2024/change_bluetooth_audio_profile_by_using_pactl/</link>
      <pubDate>Sun, 28 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2024/change_bluetooth_audio_profile_by_using_pactl/</guid>
      <description>&lt;p&gt;接續著 &lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2023/kde_neon_pipewire_and_more_bluetooth_kde_neon_pipe_wire_and_more_bluetooth_codec&#34;&gt;KDE neon / Ubuntu 啟用 PipeWire 與 LDAC/AAC/AptX 藍芽編碼&lt;/a&gt;，每當連線到藍芽耳機時，語音設定檔在使用 LDAC 後，就無法同時使用麥克風，這樣一來在開會時，就需要手動到設定裡面去調整語音設定檔。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 隱式記憶體別名 Implicit Memory Aliasing 與其檢測方法</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/golang_implicit_memory_aliasing/</link>
      <pubDate>Sun, 12 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/golang_implicit_memory_aliasing/</guid>
      <description>&lt;p&gt;在使用 Golang 時，我們可能會遇到一種稱為隱式記憶體別名（Implicit Memory Aliasing）的問題。這篇文章將探討這個問題以及如何使用工具和語言特性來解決它。&lt;/p&gt;</description>
    </item>
    <item>
      <title>透過 frp 與 GCP 打通家用 kubernetes cluster 的對外連線</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/kubernetes_with_frp_tunnel_and_cert_manager/</link>
      <pubDate>Sun, 12 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/kubernetes_with_frp_tunnel_and_cert_manager/</guid>
      <description>&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;
&lt;p&gt;在家裡面架著一台 lab，使用 proxmox ve 作為 vm server
透過 qemu 虛擬化一台 ubuntu server vm
在這個 vm 上使用 k3s，啟動 kubernetes 的服務
在 kubernetes 內跑著眾多 dockerize 的 containers。&lt;/p&gt;
&lt;p&gt;雖然我不是資深維運專家，但我知道這可能很搞笑。&lt;/p&gt;</description>
    </item>
    <item>
      <title>KDE neon / Ubuntu 啟用 PipeWire 與 LDAC/AAC/AptX 藍芽編碼</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/kde_neon_pipewire_and_more_bluetooth_kde_neon_pipe_wire_and_more_bluetooth_codec/</link>
      <pubDate>Sun, 01 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/kde_neon_pipewire_and_more_bluetooth_kde_neon_pipe_wire_and_more_bluetooth_codec/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.ghacks.net/2022/05/23/ubuntu-22-10-dropping-pulseaudio/&#34;&gt;Ubuntu 22.10 將 Audio Server 從 PulseAudio 切換成 PipeWire&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;遇到了什麼問題&#34;&gt;遇到了什麼問題&lt;/h2&gt;
&lt;p&gt;明明使用著有 LDAC 或是 AptX 解碼能力的藍芽耳機，卻只能被迫接受 sbc 的低傳輸率音質嗎，身為規格黨怎麼可以忍受這件事（即便大部份時間都只使用 Youtube Music 的 128K bps opus）&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 wireguard 與 aws 搭建虛擬內網</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/wireguard_easy/</link>
      <pubDate>Sun, 01 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/wireguard_easy/</guid>
      <description>&lt;p&gt;先前在「&lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel&#34;&gt;在 AWS 上使用 EC2 建立 FRP 玩玩內網穿透&lt;/a&gt;」一文中敘述了如何透過 AWS 實現虛擬穿透，也在內文中提到或許可以使用 wireguard 搭建內網，其原因也很簡單：每更新一個 port 都要重新設定 server side 實在是太麻煩了，拖更了進一年終於要開始寫 wireguard 的使用了。（AWS 免費也快到期了）&lt;/p&gt;</description>
    </item>
    <item>
      <title>透過 WakaTime 幫助來紀錄自己做了哪些事，並製作獨特的 GitHub Profile</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/</link>
      <pubDate>Thu, 03 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/</guid>
      <description>&lt;h2 id=&#34;wakatime-介紹&#34;&gt;WakaTime 介紹&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://wakatime.com&#34;&gt;WakaTime&lt;/a&gt; 是一款紀錄自己生產力的工具，透過客戶端插件、集成工具紀錄「行徑」並發送到官方｜非官方伺服器，可以分析花了多久時間在哪個專案、哪個程式語言、會議、code review。
&lt;img src=&#34;https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-1_hu_8ddd40e6f02c3a0a.webp&#34; srcset=&#34;https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-1_hu_ceefbea4e5f89b76.webp 360w, https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-1_hu_68f274219bcbd400.webp 640w, https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-1_hu_8ddd40e6f02c3a0a.webp 960w, https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-1.webp 1103w&#34; sizes=&#34;(max-width: 760px) calc(100vw - 40px), 720px&#34;
  width=&#34;960&#34; height=&#34;319&#34;
  alt=&#34;透過 WakaTime 幫助來紀錄自己做了哪些事，並製作獨特的 GitHub Profile&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;article-image&#34;&gt;
&lt;/p&gt;</description>
    </item>
    <item>
      <title>KDE Neon 使用心得與踩雷紀錄</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/kde_neon_experience/</link>
      <pubDate>Sun, 04 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/kde_neon_experience/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;年初為了 &lt;a href=&#34;https://arc.net/&#34;&gt;arc browser&lt;/a&gt; 裝了一台 Hackintosh，因為原因又花了點時間裝了 &lt;a href=&#34;https://neon.kde.org/&#34;&gt;KDE Neon&lt;/a&gt;，這邊紀錄一下使用心得與踩雷紀錄。時間線大概是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;快快樂樂使用 wsl2&lt;/li&gt;
&lt;li&gt;wsl 中踩了不少坑，想要嘗試 unix liked 的系統&lt;/li&gt;
&lt;li&gt;好心人提供 arc browser 的邀請，萌生了裝 Hackintosh 的念頭
&lt;ul&gt;
&lt;li&gt;在 HP Z2 G4 上裝了 Hackintosh，但是沒有事前做足功課，內顯圖形記憶體(P630)始終是 7mb&lt;/li&gt;
&lt;li&gt;買了張 amd WX4100 督上去，大幅提昇圖形性能，卻也沒再花時間繼續深入&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;嘗試在 windows 主機上雙系統 (windows + linux):
&lt;ul&gt;
&lt;li&gt;一開始直接選擇熟悉的 ubuntu，安裝了 ubuntu desktop 版本，由於是 nvidia 顯示卡，很快的遇到了硬體解碼問題&lt;/li&gt;
&lt;li&gt;開始嘗試 &lt;a href=&#34;https://github.com/elFarto/nvidia-vaapi-driver&#34;&gt;nvidia-vaapi-driver&lt;/a&gt;，但是遇到了很多問題，最後放棄&lt;/li&gt;
&lt;li&gt;想換到 amd 顯示卡，但是又不想花錢，於是想說看看其他發布版是否能解決&lt;/li&gt;
&lt;li&gt;從 Linux Mint, Manjaro, KEO Neon 中選擇了同樣是 ubuntu 底，卻是 KDE 團隊維護團隊的 KDE Neon&lt;/li&gt;
&lt;li&gt;不出意外的一樣遇到了 nvidia 驅動問題，雖然 firefox 已經可以順利硬體加速，但是 chromium 等仍然無法硬體加速&lt;/li&gt;
&lt;li&gt;這時候已經花了不少時間在這個問題上，於是決定換到 amd 顯示卡(內顯)&lt;/li&gt;
&lt;li&gt;在 Minisforum UM560 上安裝了 KDE Neon，一切順利，驅動毫無問題，硬體加速也正常&lt;/li&gt;
&lt;li&gt;嘗試裝了 ventura theme，讓他稍微好看一點&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;持續與 wayland 相處，走一步是一步&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;❯ neofetch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;..---+/---..&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;                raiven@um560
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;---.&lt;span style=&#34;color:#e6db74&#34;&gt;``&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;``&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.---.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;            ------------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      .--.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;``&lt;/span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;-:-.         OS: KDE neon 5.27 x86_64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;:/:     &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.----//----.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;     :/-        Host: UM560
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   .:.    &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;---&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;--.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;    .:&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;      Kernel: 5.19.0-43-generic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .:&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;--&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;                .:-    &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;:.     Uptime: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; hour, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; mins
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;/    &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;:.      &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.-::-.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;      -:&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;/&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;    Packages: &lt;span style=&#34;color:#ae81ff&#34;&gt;1924&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;dpkg&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;snap&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; /.    /.     &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;:++++++++:&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;     .:    .:    Shell: zsh 5.8.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;/    .:     &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;+++++++++++/      /&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;+&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;   Resolution: 2560x1440
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/+&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;   --     .++++++++++++&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;     :.   .+:   DE: Plasma 5.27.5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;/    .:     &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;+++++++++++/      /&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;+&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;   WM: kwin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; /&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;    /.     &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;:++++++++:&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;     .:    .:    Theme: &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Plasma&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, Colloid-Dark &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;GTK2/3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ./    &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;:.      &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.:::-.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;      -:&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;/&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;    Icons: Cupertino-Ventura &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Plasma&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, Cupertino-Ventura &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;GTK2/3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .:&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;--&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;                .:-    &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;:.     Terminal: konsole
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   .:.    &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;---&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;          &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;--.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;    .:&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;      CPU: AMD Ryzen &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt; 5625U with Radeon Graphics &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;12&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; @ 2.300GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;:/:     &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.----//----.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;     :/-        GPU: AMD ATI 04:00.0 Barcelo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      .-:.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;``&lt;/span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;-:-.         Memory: 6265MiB / 31519MiB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;---.&lt;span style=&#34;color:#e6db74&#34;&gt;``&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;``&lt;/span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.---.&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;..---+/---..&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;post-install-kde-neon&#34;&gt;Post Install KDE Neon&lt;/h2&gt;
&lt;h3 id=&#34;解決-key-過舊&#34;&gt;解決 key 過舊&lt;/h3&gt;
&lt;p&gt;當使用 &lt;code&gt;sudo apt update&lt;/code&gt; 時可能會發生&lt;/p&gt;</description>
    </item>
    <item>
      <title>golang 樂觀鎖、悲觀鎖 學習筆記與實驗</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/golang_lock_practice/</link>
      <pubDate>Sun, 14 May 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/golang_lock_practice/</guid>
      <description>&lt;h2 id=&#34;介紹&#34;&gt;介紹&lt;/h2&gt;
&lt;p&gt;改變數值的三個步驟&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;取出&lt;/li&gt;
&lt;li&gt;修改&lt;/li&gt;
&lt;li&gt;保存&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;但這三者間的時間差在不同 process、不同 thread、不同 corutine/goroutine 中會造成競爭危害(race condition)。&lt;/p&gt;
&lt;p&gt;可以使用多種發法確保並行(concurrency)處理時保持資料的一致性，這裡介紹的是最常使用的悲觀鎖與樂觀鎖。&lt;/p&gt;</description>
    </item>
    <item>
      <title>讓 BOOX 也使用繁體中文辭典</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/mdx_dictionary_sc_to_tc/</link>
      <pubDate>Thu, 04 May 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/mdx_dictionary_sc_to_tc/</guid>
      <description>&lt;p&gt;由於最近讀原文書讀得挺辛苦，邊用電子閱讀器看書，騰不出手用手機查字典，內建的辭典又只有英文翻譯簡體中文，在網上衝浪也找不到繁體中文的 mdx 英漢辭典可以直接使用。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何優雅地批次安裝 Nerd font 字型</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/install_fonts/</link>
      <pubDate>Wed, 03 May 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/install_fonts/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/ryanoasis/nerd-fonts&#34;&gt;fonts repo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;接觸 wsl/ubuntu 的這幾年，經常會需要安裝 zsh 以及字型，因此誕生了 &lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2022/zsh-cheat-sheet&#34;&gt;cheat sheet&lt;/a&gt;，久而久之連下載-&amp;gt;解壓縮-&amp;gt;安裝這個過程，都懶了。&lt;/p&gt;
&lt;p&gt;於是寫了一個批次下載並安裝最新版本的 Nerd Fond 字型的 shell script，讓 wsl 可以安裝 windows 的字型，linux 可以安裝 linux 字型。&lt;/p&gt;</description>
    </item>
    <item>
      <title>golang 中使用 Line LIFF 實作 Single Sign-On</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/line_verify/</link>
      <pubDate>Sat, 22 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/line_verify/</guid>
      <description>&lt;p&gt;文章中的程式碼放在&lt;a href=&#34;https://github.com/omegaatt36/line-verify-id-token&#34;&gt;https://github.com/omegaatt36/line-verify-id-token&lt;/a&gt;中。&lt;/p&gt;
&lt;h3 id=&#34;requirements&#34;&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://developers.line.biz/zh-hant/&#34;&gt;Line Login Channel&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;channel id&lt;/li&gt;
&lt;li&gt;channel secret&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/line/line-liff-v2-starter&#34;&gt;Line LIFF APP&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;用 liff.getIDToken() 獲取 &lt;a href=&#34;https://developers.line.biz/en/docs/line-login/verify-id-token/#get-an-id-token&#34;&gt;ID Token&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在現代網站中，單一登錄 (Single Sign-On, SSO) 已經成為了一個普遍存在的功能，它能夠讓使用者在不同的應用程式和服務之間自動地登錄，而不需要再輸入帳號和密碼。這樣可以方便使用者的使用，並且也能夠增加安全性，減少帳號密碼被盜用的風險。&lt;/p&gt;</description>
    </item>
    <item>
      <title>跟風寫了個使用 OpenAI API 的 Telegram Chat Bot</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/openai_telegram_chat_bot/</link>
      <pubDate>Fri, 17 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/openai_telegram_chat_bot/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;放在最前面 &lt;a href=&#34;https://github.com/omegaatt36/chatelegram&#34;&gt;Github repo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原本打算使用別人寫好的 bot，免費的版本均是透過儲存 cookies 的方式，直接透過 ChatGPT 網頁建立新的 「Chat」。好景不常，OpenAI 馬上把登入頁面到聊天頁面中間安插了類似 reCaptcha，來驗證是否為真人。看到有好心人提供了 go 版本的 OpenAi API，就打算自己寫一寫，順便當作 &lt;a href=&#34;https://www.tenlong.com.tw/products/9789864342945&#34;&gt;《Clean Architecture》&lt;/a&gt; 的讀後作業。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Logitech Media Server 遷移紀錄：從 Bare Metal 到 Docker 再到 Podman</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/logitech_media_server_migration/</link>
      <pubDate>Fri, 24 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/logitech_media_server_migration/</guid>
      <description>&lt;p&gt;2021 年公司開始實施 322 WFH，少了通勤的時間，在家的時間也多了，就想在上班時也能好好對待自己，雖然是木耳但始終會想知道，網路上說的獨立訊源減少雜訊是有多重要，亦或只是玄學?於是誕生了&lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2021/picoreplayer/&#34;&gt;Raspberry pi 4 + piCorePlayer 7.0.0 折騰筆記&lt;/a&gt;這篇筆記，到現在這個部落格的累積曝光最高的也是因為這篇吧。
&lt;img src=&#34;https://www.omegaatt.com/blogs/develop/2023/logitech_media_server_migration/images/bb4cgPLT2m.webp&#34; srcset=&#34;https://www.omegaatt.com/blogs/develop/2023/logitech_media_server_migration/images/bb4cgPLT2m_hu_1f4dc30cc2fbcd34.webp 360w, https://www.omegaatt.com/blogs/develop/2023/logitech_media_server_migration/images/bb4cgPLT2m.webp 576w&#34; sizes=&#34;(max-width: 760px) calc(100vw - 40px), 720px&#34;
  width=&#34;576&#34; height=&#34;585&#34;
  alt=&#34;Logitech Media Server 遷移紀錄：從 Bare Metal 到 Docker 再到 Podman&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;article-image&#34;&gt;
&lt;/p&gt;</description>
    </item>
    <item>
      <title>WSL2 中使用 systemd 管理 podman 的 container</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/wsl2_systemd_podman/</link>
      <pubDate>Mon, 13 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/wsl2_systemd_podman/</guid>
      <description>&lt;p&gt;原本使用 &lt;a href=&#34;https://github.com/nullpo-head/wsl-distrod&#34;&gt;wsl-distrod&lt;/a&gt; 來作為 wsl 中 systemd 的實現方式，後來 &lt;a href=&#34;https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/&#34;&gt;microsoft 宣布 wsl 支持 systemd&lt;/a&gt; 後，distrod 等等 repo 就沒有在更新了呢，是巧合嗎?我不這麼認為。&lt;/p&gt;
&lt;p&gt;這篇簡略紀錄 wsl2 中啟用 systemd 作為 process 管理工具以及配合紅帽推出的 &lt;a href=&#34;https://podman.io/&#34;&gt;podman&lt;/a&gt; 來取代(斷捨離)docker desktop。&lt;/p&gt;</description>
    </item>
    <item>
      <title>gin 搭配 html/template 包實現動態生成 HTML 文件</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/gin_embed_practice/</link>
      <pubDate>Thu, 26 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/gin_embed_practice/</guid>
      <description>&lt;h2 id=&#34;起因&#34;&gt;起因&lt;/h2&gt;
&lt;p&gt;在網站註冊流程中，若是用信箱驗證，網站會寄送一封驗證信到指定的電子信箱。信中可能含有 verify token 或是直接是寫好的 verify URL。至於實作方面我們可以透過 Go 1.16 推出的 Embedding Files 搭配 html/template，實現動態生成 HTML 信件，用以寄送至指定信箱。&lt;/p&gt;</description>
    </item>
    <item>
      <title>後端工程師用 Golang 在 WSL 中寫 GUI 是不是搞錯了甚麼 - 安裝篇</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/golang_gui_fyne_bme280/</link>
      <pubDate>Thu, 26 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/golang_gui_fyne_bme280/</guid>
      <description>&lt;p&gt;由於先前將 raspberry pi 4b 給賣掉了，&lt;a href=&#34;https://github.com/omegaatt36/bmx280/tree/main/raspberrypi&#34;&gt;bmx280&lt;/a&gt; 中基於 bme280 而產生的 exporter 因此失去戰鬥能力，藉此玩玩 &lt;a href=&#34;https://tinygo.org/&#34;&gt;tinygo&lt;/a&gt;，透過 serial port 透過 raspberry pi pico 對 bme280 讀取溫溼度。在開發過程中發現，WSL 中，command line 輸入:&lt;/p&gt;</description>
    </item>
    <item>
      <title>解決 VM 關機時等待容器關閉</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/k3s_kill_all/</link>
      <pubDate>Wed, 11 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/k3s_kill_all/</guid>
      <description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[     *] A stop job is running for libcontainer container xxxxxxxx (10s / 1m30s)_
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;過去 kubernetes 還跟 docker-shim 手牽手時，在關閉 k8s node vm 時常常出現等待 &lt;code&gt;docker-shim&lt;/code&gt; 關閉，直到一分三十秒被 time out 才正確關機。若是開發機就當作去尿尿的時間就好，但若是重要的環境停機備份，或是斷電時靠 UPS 提供電源等待系統關機，那浪費時間就不好了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2023 展望</title>
      <link>https://www.omegaatt.com/blogs/develop/2023/2023_outlook/</link>
      <pubDate>Sun, 01 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2023/2023_outlook/</guid>
      <description>在工作的挫折與學習之間，試著接受不完美的起點。寫下對工程師這個身分的反思，與新一年的期待。</description>
    </item>
    <item>
      <title>在 AWS 上使用 EC2 建立 FRP 玩玩內網穿透</title>
      <link>https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/</link>
      <pubDate>Sat, 19 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;TL;DR&lt;/p&gt;
&lt;p&gt;2022 年上旬熱衷於軟路由，在 Raspberry Pi 4b 上裝了 openWRT 來玩，使用 USB 網卡作為 LAN NIC，雖然使用上完全沒有問題，但透過 USB 始終有個芥蒂，「就不能多個 pci-e 來接網卡嗎」，於是衝動順勢買了 Mikrotik RB5009UG+S+IN。&lt;/p&gt;</description>
    </item>
    <item>
      <title>zsh &amp; oh-my-zsh &amp; tmux install cheat sheet on ubuntu 22.04</title>
      <link>https://www.omegaatt.com/blogs/develop/2022/zsh-cheat-sheet/</link>
      <pubDate>Sun, 30 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2022/zsh-cheat-sheet/</guid>
      <description>&lt;h2 id=&#34;oh-my-zsh--power-lever-10k&#34;&gt;oh my zsh &amp;amp; power lever 10k&lt;/h2&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;
&lt;p&gt;install deps&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install git curl -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install zsh&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install zsh -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;check is installed&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/shells | grep zsh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# raiven@k3s:~$ cat /etc/shells | grep zsh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /bin/zsh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /usr/bin/zsh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install &lt;a href=&#34;https://github.com/ohmyzsh/ohmyzsh#basic-installation&#34;&gt;oh-my-zsh&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sh -c &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install &lt;a href=&#34;https://github.com/romkatv/powerlevel10k#oh-my-zsh&#34;&gt;powerlevel10k&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone --depth&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; https://github.com/romkatv/powerlevel10k.git &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;ZSH_CUSTOM&lt;span style=&#34;color:#66d9ef&#34;&gt;:-&lt;/span&gt;$HOME/.oh-my-zsh/custom&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;/themes/powerlevel10k
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;install fonts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wsl:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bash -c &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;curl -fsSL https://raw.githubusercontent.com/omegaatt36/dotfiles/main/install_fonts.sh&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; --windows
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;linux:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bash -c &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;curl -fsSL https://raw.githubusercontent.com/omegaatt36/dotfiles/main/install_fonts.sh&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;change login shell(must logout and login again)&lt;/p&gt;</description>
    </item>
    <item>
      <title>proxmox ve shrink vm disk size</title>
      <link>https://www.omegaatt.com/blogs/develop/2022/pve-shrink-vm-disk/</link>
      <pubDate>Sun, 04 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2022/pve-shrink-vm-disk/</guid>
      <description>&lt;p&gt;由於 zpool 吃超過 80%，故將其中一個 VM(k8s-worker) 的硬碟縮小(200GB=&amp;gt;100GB)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pve: 7.2.7&lt;/li&gt;
&lt;li&gt;zfs:
&lt;ul&gt;
&lt;li&gt;zfs-2.1.5-pve1&lt;/li&gt;
&lt;li&gt;zfs-kmod-2.1.5-pve1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;確認 vm disk 剩餘空間&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ df -h
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Filesystem      Size  Used Avail Use% Mounted on
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/dev/vda1        197G   14G   178G  7% /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vm 關機&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下載 &lt;a href=&#34;https://sourceforge.net/projects/gparted/&#34;&gt;gparded iso&lt;/a&gt; 到 pve&lt;/p&gt;</description>
    </item>
    <item>
      <title>CentOS 7 kubernetes &#43; containerd &#43; calico basic installation tutorial</title>
      <link>https://www.omegaatt.com/blogs/develop/2022/centos-7-kubernetes-install/</link>
      <pubDate>Sun, 20 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2022/centos-7-kubernetes-install/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;鑒於最近接到 1 CentOS master + 2 Gentoo node k8s cluster 建置雜事，被自己不熟系統雷到，做個筆記紀錄一下，未來敲敲指令就可以了&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                 ..                    root@master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               .PLTJ.                  -----------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;                 OS: CentOS Linux &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Core&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; x86_64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     KKSSV&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; 4KKK LJ KKKL.&amp;#39;&lt;/span&gt;VSSKK        Host: KVM/QEMU &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Standard PC &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;i440FX + PIIX, 1996&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; pc-i440fx-6.1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     KKV&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; 4KKKKK LJ KKKKAL &amp;#39;&lt;/span&gt;VKK        Kernel: 5.4.180-1.el7.elrepo.x86_64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     V&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;VKKKK LJ KKKKV&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;V        Uptime: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; mins
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     .4MA.&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;VKK LJ KKV&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;.4Mb.        Packages: &lt;span style=&#34;color:#ae81ff&#34;&gt;359&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;rpm&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   . KKKKKA.&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;V LJ V&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;.4KKKKK .      Shell: bash 4.2.46
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; .4D KKKKKKKA.&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; LJ &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;.4KKKKKKK FA.    Terminal: /dev/pts/0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;QDD ++++++++++++  ++++++++++++ GFD&amp;gt;   CPU: Common KVM processor &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; @ 3.493GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;VD KKKKKKKK&amp;#39;&lt;/span&gt;.. LJ ..&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;KKKKKKKK FV     Memory: 97MiB / 16015MiB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;   &amp;#39;&lt;/span&gt; VKKKKK&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;. .4 LJ K. .&amp;#39;&lt;/span&gt;KKKKKV &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      &amp;#39;&lt;/span&gt;VK&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;. .4KK LJ KKA. .&amp;#39;&lt;/span&gt;KV&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     A. . .4KKKK LJ KKKKA. . .4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     KKA. &amp;#39;&lt;/span&gt;KKKKK LJ KKKKK&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; .4KK
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;     KKSSA. VKKK LJ KKKV .4SSKK
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;              &amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;               &amp;#39;&lt;/span&gt;MKKM&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                 &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此篇 CentOS 寄宿於 PVE 下，kernel 已升級為 &lt;code&gt;5.4.180-1.el7.elrepo.x86_64&lt;/code&gt;
使用 containerd 作為 cri
使用 calico 作為 cni，並使用 host 唯一的網卡，不做其他進階設定。&lt;/p&gt;</description>
    </item>
    <item>
      <title>CentOS 7 upgrade kernel</title>
      <link>https://www.omegaatt.com/blogs/develop/2022/centos-7-upgrade-kernel/</link>
      <pubDate>Sun, 20 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2022/centos-7-upgrade-kernel/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;查看目前 kernel 版本&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; uname -a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Linux R350-1 3.10.0-1160.53.1.el7.x86_64 &lt;span style=&#34;color:#75715e&#34;&gt;#1 SMP Fri Jan 14 13:59:45 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加 ELRepo 公鑰&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安裝 ELRepo yum 來源&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看可用的 kernel&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum --disablerepo&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt; --enablerepo&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;elrepo-kernel&amp;#34;&lt;/span&gt; list available
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安裝最新的 kernel，挑一個安裝，這邊選擇 kernel-lt&lt;/p&gt;</description>
    </item>
    <item>
      <title>改善 Proxmox VE/Debian 始終跑在最高頻率</title>
      <link>https://www.omegaatt.com/blogs/develop/2022/pve_power-save/</link>
      <pubDate>Sun, 09 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2022/pve_power-save/</guid>
      <description>&lt;p&gt;這幾天把便宜撿到的 Threadripper 2950X 平台也上 Proxmox VE 玩玩了，裝完系統後才發現自己太習慣於 windows 下的電源管理，一直都沒發現 linux 下 CPU 頻率都是拉滿的狀態，找了&lt;a href=&#34;https://forum.proxmox.com/threads/fix-always-high-cpu-frequency-in-proxmox-host.84270/&#34;&gt;debian 下進行電源管理的電源計畫設定教學&lt;/a&gt;達到降溫省電，順便做做紀錄。&lt;/p&gt;</description>
    </item>
    <item>
      <title>logitech media server 搭配 docker 實現雙機分離</title>
      <link>https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/</link>
      <pubDate>Sat, 04 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;雖然&lt;a href=&#34;https://docs.picoreplayer.org/releases/&#34;&gt;官方 releases 頁面&lt;/a&gt;似乎還沒發布，不過前一陣子把 piCorePlayer 升級到 8.1.0，看起來似乎還是 &lt;a href=&#34;https://forums.slimdevices.com/showthread.php?113353-Players-don-t-play-!-After-upgrading-8-0-1-to-8-1-0&#34;&gt;unstable&lt;/a&gt;，懶得倒版回去 8.0.0，趁這個機會把一直想玩的雙機留兜起來。&lt;/p&gt;
&lt;p&gt;雙機顧名思義為 client 與 server 分開在兩台機器上，piCorePlayer 的 client 為 Squeezelite，server 則為 Logitech Media Server，事實上在 windows 上也有 client &lt;a href=&#34;https://www.microsoft.com/zh-tw/p/squeezelite-x/9pbhmtnp9037&#34;&gt;Squeezelite-X&lt;/a&gt;可以玩，預期中的最終成品將會是「三機流」吧 XD&lt;/p&gt;</description>
    </item>
    <item>
      <title>A=B 遊完心得、解法</title>
      <link>https://www.omegaatt.com/blogs/develop/2021/a_equals_to_b/</link>
      <pubDate>Wed, 13 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2021/a_equals_to_b/</guid>
      <description>&lt;p&gt;Steam 上推出了一款 &lt;a href=&#34;https://store.steampowered.com/app/1720850/AB/&#34;&gt;A=B&lt;/a&gt;，稍微玩了一下，下面提供自己的解法。&lt;/p&gt;
&lt;p&gt;小試了一下，這個迷你語言每一行由左側、等號&lt;code&gt;=&lt;/code&gt;、右側組成，左側會被取代成右側，並且每次取代完都會從第一行重新開始，有點像在寫遞迴。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes 學習筆記 - Ubuntu kubeamd 建置 cluster</title>
      <link>https://www.omegaatt.com/blogs/develop/2021/kubeadm-init/</link>
      <pubDate>Sun, 19 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2021/kubeadm-init/</guid>
      <description>&lt;h2 id=&#34;環境&#34;&gt;環境&lt;/h2&gt;
&lt;p&gt;物理機: 2278G/16G DDR4 ECC*4/1T MX500
OS: - master: Ubuntu server 20.04 - node: Ubuntu server 20.04&lt;/p&gt;
&lt;h2 id=&#34;安裝-dockerkubeadmkubeletkubectl&#34;&gt;安裝 docker、kubeadm、kubelet、kubectl&lt;/h2&gt;
&lt;h3 id=&#34;安裝-docker&#34;&gt;安裝 docker&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo add-apt-repository &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; stable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io -y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo usermod -aG docker $USER
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;登出再登入&lt;/p&gt;</description>
    </item>
    <item>
      <title>Prometheus 學習筆記 - 基本架構與資料結構</title>
      <link>https://www.omegaatt.com/blogs/develop/2021/promethues-overview/</link>
      <pubDate>Sat, 18 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2021/promethues-overview/</guid>
      <description>&lt;h1 id=&#34;prometheus-overview&#34;&gt;Prometheus Overview&lt;/h1&gt;
&lt;iframe width=&#34;100%&#34; height=&#34;512&#34; src=&#34;https://www.youtube.com/embed/h4Sl21AKiDg&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;架構&#34;&gt;架構&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://prometheus.io/assets/architecture.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;Exporter: 要被採集的目標 job 中曝露 metrics 的組件，負責轉換資訊成 prometheus 可解讀的格式。由於某些早於 prometheus 的 service 因為某些原因，不想主動在服務中曝露 metrics，故可以用一些額外的 exporter 將這些 service 中的 metrics 轉成 prometheus 格式，並曝露埠。
&lt;ul&gt;
&lt;li&gt;node exporter&lt;/li&gt;
&lt;li&gt;mysql exporter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Push Gateway: 由於有些任務時間太短，可能不到 prometheus pull 的週期，可讓這些 jobs 主動把 metrics push 到這個 push gateway，好讓 premetheus server 可以 pull。&lt;/li&gt;
&lt;li&gt;Prometheus Server
&lt;ul&gt;
&lt;li&gt;Retrieval(retrieval system): 主要負責 pull 指定的 target
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /etc/prometheus/prometheus.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;scrape_configs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;job_name&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;prometheus&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;static_configs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;targets&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;localhost:9090&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;job_name&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;node_exporter&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;static_configs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;targets&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;localhost:9100&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;TSDB: 時間序列資料庫，存放 pull 到的 metrics&lt;/li&gt;
&lt;li&gt;HTTP Server: 為 PromeQL 查詢提供接口&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Service Discovery:
&lt;ul&gt;
&lt;li&gt;kubernetes: 自動發現 k8s 中 pod 增加減少以及 probe 異動等等&lt;/li&gt;
&lt;li&gt;file_sd: 通過 config 實現服務的自動發現&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Alert Manager: 當 prometheus server 發現某某某 job 已經達到設定好的通知閾值進行通知的 service。&lt;/li&gt;
&lt;li&gt;PromeQL: 無論是自帶 web UI 或是串接 Grafana，都是通過 http 進行 PromeQL 查詢後做視覺化處理 TSDB 中的時間序列資料。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;資料結構&#34;&gt;資料結構&lt;/h2&gt;
&lt;p&gt;下面範例中會有更詳細說明&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raspberry pi 4 &#43; piCorePlayer 7.0.0 折騰筆記</title>
      <link>https://www.omegaatt.com/blogs/develop/2021/picoreplayer/</link>
      <pubDate>Sun, 02 May 2021 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2021/picoreplayer/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;鑒於想要剛好逛到 Raspberry pi 4 出了(2019)，剛好手邊又有兩顆閒置的喇叭，於是產生了做一套&lt;strong&gt;網路串流音樂撥放器&lt;/strong&gt;。用到的硬體如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.raspberrypi.org/products/raspberry-pi-4-model-b/&#34;&gt;Raspberry pi 4b 4G ver 1.2&lt;/a&gt;
樹莓派的部分選用 4G 版本，由於 4G 跟 8G 版本差價有點大，僅作為多媒體撥放器，應該不需要那麼大量的記憶體，故降梯成本僅選用 4G 版本。
至於 1.2 版本差在哪裡可以參考&lt;a href=&#34;https://www.raspberrypi.com.tw/30359/news-raspberry-pi4-new-version-fixes-usb-type-c-problem&#34;&gt;這篇文章&lt;/a&gt;，主要修正了 type-C 供電問題。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.argon40.com/argon-one-m-2-case-for-raspberry-pi-4.html&#34;&gt;Argon ONE m.2&lt;/a&gt;
由於 pi 4b 的 cpu 較 3b+ 升級很多，同時&lt;a href=&#34;https://www.reddit.com/r/raspberry_pi/comments/cbqt19/raspberry_pi_4_heatsink_testing/&#34;&gt;發熱量也提升&lt;/a&gt;了，故得選用一個同時具有散熱、美觀、擴充的外殼，剛好手邊有汰換下來的 m.2 SATA SSD，於是選擇了 Argon ONE m.2。&lt;/li&gt;
&lt;li&gt;直流電源供應器
儘管線性電源如 Keces P3 或便宜一點 ifi iPower X 或是老虎魚都是很好的穩定 5V 直流電源供應器，但由於使用樹莓派就是不想花大錢，用比系統本身還高價如此多的周邊，似乎有點本末倒置，魚是只用了手機的 type-C 5V/3A 變壓器作為電源供應器。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;硬體安裝&#34;&gt;硬體安裝&lt;/h1&gt;
&lt;p&gt;硬體安裝部分不在這次探討範圍，由於每個人使用的外殼均不相同，文章中就假設是裸機設定。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 學習筆記 Day 0 - Why Golang &amp; 安裝篇</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/golang_learning_day0/</link>
      <pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/golang_learning_day0/</guid>
      <description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;免責聲明，此篇為個人學習筆記，非正式教學文，僅供參考感謝指教，有任何內容錯誤歡迎發 issue。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;https://miro.medium.com/max/2946/1*TArmNwMaoXjR1MegmucwyQ.png&#34; alt=&#34;image source: https://medium.com/nordcloud-engineering/how-to-build-pluggable-golang-application-and-benefit-from-aws-lambda-layers-154c8117df9b&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;why-golang&#34;&gt;Why Golang&lt;/h2&gt;
&lt;p&gt;    在高中時期，除了一年級上學期是用 C 打開程式大門之外，大家都知道的，畫金字塔、 &lt;code&gt;cin&lt;/code&gt; 、 &lt;code&gt;cout&lt;/code&gt; 等等基本的邏輯觀念，一年級下學期開始就是 C#、HTML、PHP，也玩轉在 CPLD、Arduino、焊三角錐、兩根同軸焊接，總之就是全部吃掉就對了，雖然都是皮毛但不至於完全沒印象。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Golang 學習筆記 Day 1 - Getting started</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/golang_learning_day1/</link>
      <pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/golang_learning_day1/</guid>
      <description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;免責聲明，此篇為個人學習筆記，非正式教學文，僅供參考感謝指教，有任何內容錯誤歡迎發 issue。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在前一天介紹了為何要使用 golang、安裝過程以及基本的 hello world，這天將重點放在最基本的 golang 程式碼特徵。&lt;/p&gt;
&lt;h2 id=&#34;packages&#34;&gt;packages&lt;/h2&gt;
&lt;p&gt;正如昨天關於 hello world 的解析中提到的，每個程式都是由一到多個 packages 組成的，也就是 &lt;code&gt;.go&lt;/code&gt; 中必須宣告該檔案是哪個 package，且同一個資料夾中僅接受 &lt;code&gt;xxx&lt;/code&gt; 以及 &lt;code&gt;xxx_test&lt;/code&gt; 兩種 package名稱，也就是該 package 的名稱以及測試檔的「測試包」。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RESTful server based on golang</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/restful-api-with-go/</link>
      <pubDate>Thu, 19 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/restful-api-with-go/</guid>
      <description>&lt;p&gt;很高興有個機會製作面試前的測試作業，也就趁這個機會做個筆記以及學習紀錄。&lt;/p&gt;
&lt;h2 id=&#34;前置作業&#34;&gt;前置作業&lt;/h2&gt;
&lt;p&gt;先點列一下項目需求：&lt;/p&gt;
&lt;h3 id=&#34;基本需求&#34;&gt;基本需求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;based on golnag&lt;/li&gt;
&lt;li&gt;The API interface you provide can be any of the following：RESTful、json rpc、gRPC&lt;/li&gt;
&lt;li&gt;At least two sources&lt;/li&gt;
&lt;li&gt;When a source is unavailable, the result of its last successful ask is returned&lt;/li&gt;
&lt;li&gt;Use git to manage source code&lt;/li&gt;
&lt;li&gt;Write readme.md and describe what features, features, and TODO which have been implemented&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;額外可選&#34;&gt;額外可選&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Traffic limits, including the number of times your server queries the source, and the number of times the user queries you&lt;/li&gt;
&lt;li&gt;Good testing, annotations, and git commit&lt;/li&gt;
&lt;li&gt;An additional websocket interface is provided to automatically send the latest information whenever the market changes&lt;/li&gt;
&lt;li&gt;Users can choose to use an automatic source determination, the latest data source, or manually specify the source of the data&lt;/li&gt;
&lt;li&gt;Package it as a Dockerfile, docker-compose file, or kubernetes yaml&lt;/li&gt;
&lt;li&gt;There is a simple front-end or cli program that displays the results&lt;/li&gt;
&lt;li&gt;The API you provide has a corresponding file, such as a swagger, or simply a markdown file&lt;/li&gt;
&lt;li&gt;Other features not listed but that you thought would be cool to implement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這邊就必須要先打預防針了，&lt;strong&gt;這篇僅為學習筆記&lt;/strong&gt;，並非正式教學。且，我只是 Golang 初學者，所以這篇內也不會出現什麼高等級的解法，甚至也是第一次實作介接 API 呢 (笑)。而 DB 以及 redis 都是直接以方便使用去寫 dbi 而已並無用抽象曾去封裝，也進而導致 unit test 十分困難先擱置了，有空才會再針對性重構，而此次就先將目標專注在 API 介接。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Codewars Find X II in golang</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/codewars_find_x_ii/</link>
      <pubDate>Tue, 03 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/codewars_find_x_ii/</guid>
      <description>&lt;p&gt;想不到一眨眼半個月過去了，自從面試趨勢之後整個人彷彿被電到失去信心，在離職與等待面試消息期間，也只好振作補足不足的地方繼續向前。&lt;/p&gt;
&lt;p&gt;而 docker 學習心得何時會產出呢？在學習過程中發現除了一般操作(day1 內容)外，底層或多 container 溝通都是大量的網路觀念與知識，需要更多知識量才能整理成筆記，不急不急。&lt;/p&gt;</description>
    </item>
    <item>
      <title>威康生命遊戲 in PHP</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/codewars_game_of_life/</link>
      <pubDate>Thu, 23 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/codewars_game_of_life/</guid>
      <description>&lt;h1 id=&#34;威康生命遊戲-in-php&#34;&gt;威康生命遊戲 in PHP&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/embed/GQNREcMVPHY&#34; title=&#34;生命遊戲：另一種計算機 |混亂博物館&#34;&gt;&lt;img src=&#34;https://i.ytimg.com/vi/GQNREcMVPHY/hqdefault.jpg&#34; alt=&#34;生命遊戲：另一種計算機 |混亂博物館&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;生命遊戲，無論在程式、哲學、生命探討上都十分有趣，在生命遊戲中甚至出現永動機。而在 Codewars 中也有生命遊戲的 &lt;a href=&#34;https://www.codewars.com/kata/52423db9add6f6fc39000354&#34;&gt;題目&lt;/a&gt;，規則也十分簡單，以下為維基百科的內容：&lt;/p&gt;</description>
    </item>
    <item>
      <title>VScode SFTP 快速同步文件到 Server</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/vscode_sftp/</link>
      <pubDate>Mon, 20 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/vscode_sftp/</guid>
      <description>&lt;p&gt;當 Server 環境使用白名單搭配 Reverce-Proxy 時，或是 dev、test 環境不供外部使用時，或許會將部分 code 存在只能靠內網連線的主機上，並透過 OpenSSH 供內部遠端操作。&lt;/p&gt;
&lt;p&gt;而 PHP 快速部屬的便捷在於替換單一檔案不須重啟 Server (前提是並非把檔案載進 Memory 或轉化守護進程)，此時可以依靠 FTP 上傳單一檔案即好。但每次改個 code 還要想辦法上傳程式碼實在是太浪費時間了，如標題所述，如何快速同步 code 到 Server 上呢。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Evaluate mathematical expression in PHP</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/codewars_evaluate_mathematical_expression/</link>
      <pubDate>Thu, 16 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/codewars_evaluate_mathematical_expression/</guid>
      <description>&lt;p&gt;四則運算，不多，不就是加減乘除而已嗎，怎麼會在 &lt;a href=&#34;https://www.codewars.com/kata/52a78825cdfc2cfc87000005&#34;&gt;Codewars 中被標記為 2 kyu 的題目&lt;/a&gt;呢?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i.ytimg.com/vi/KTpd-CEJahw/maxresdefault.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;
&lt;p&gt;總覺得這篇標題應該改為「Codewars 從入坑道棄坑，只需要一題就搞定」。首先我是在 2019 年底才接觸 Codewars，這種打怪練功的感覺讓我一下就上癮了，每天都在想今天能不能再拚一階，或是這題用另外一個語言會不會比較省時間。直到遇到了這題，足足卡了一整天。下面就來介紹一下四則運算在 PHP 中的解法吧。&lt;/p&gt;</description>
    </item>
    <item>
      <title>PHP ENUM 偽實現</title>
      <link>https://www.omegaatt.com/blogs/develop/2020/php_enum/</link>
      <pubDate>Wed, 15 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/blogs/develop/2020/php_enum/</guid>
      <description>&lt;p&gt;&lt;code&gt;Enumerations&lt;/code&gt; 又可簡稱為 &lt;code&gt;Enum&lt;/code&gt; ，在眾多語言中都可以讓程式碼更高效簡潔，例如我們可以在 python 中這麼宣告，並且用 &lt;code&gt;requests&lt;/code&gt; 模組打一個 request，即可透過 &lt;code&gt;Enum&lt;/code&gt; 來模組化 Response&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; enum
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; request
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;HTTPResponsecode&lt;/span&gt;(enum&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Enum)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    OK &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    BAD_REQUEST &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    NOT_FOUND &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;404&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://omegaatt.com/&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(r&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;status_code &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; HTTPResponsecode&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;OK)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是在 PHP 中原生是沒有內建 &lt;code&gt;Enum&lt;/code&gt; 的，必須安裝 &lt;code&gt;perl&lt;/code&gt; 的 &lt;a href=&#34;https://stackoverflow.com/questions/57885011/error-class-splenum-not-found-in-php-7&#34;&gt; &lt;code&gt;SplEnum&lt;/code&gt; &lt;/a&gt; 類套件庫，方能直接使用 &lt;code&gt;Enum&lt;/code&gt; 的功能。或是可以透過以下的方式達到接近的效果。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Resume</title>
      <link>https://www.omegaatt.com/resume/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/resume/</guid>
      <description>&lt;object data=&#34;https://resume.omegaatt.com/resume.pdf&#34; type=&#34;application/pdf&#34; width=&#34;100%&#34; height=&#34;800px&#34;&gt;
    &lt;p&gt;can&#39;t display PDF？&lt;a href=&#34;https://resume.omegaatt.com/resume.pdf&#34;&gt;Download&lt;/a&gt;&lt;/p&gt;
&lt;/object&gt;</description>
    </item>
    <item>
      <title>關於</title>
      <link>https://www.omegaatt.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.omegaatt.com/about/</guid>
      <description>&lt;img src=&#34;https://www.omegaatt.com/avatar.jpeg&#34; alt=&#34;Raiven Kao&#34; width=&#34;120&#34; height=&#34;120&#34; style=&#34;display: block; border-radius: 2px; margin: 0 0 28px;&#34;&gt;
&lt;p&gt;軟體工程師，平常寫 Golang，家裡跑一套自架的 k3s。這裡放工作和自架時的筆記。&lt;/p&gt;
&lt;h3 id=&#34;部落格內容&#34;&gt;部落格內容&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Golang: 每個版本的新特性、專案架構、API 設計、TUI 與桌面 App。&lt;/li&gt;
&lt;li&gt;自架與 Homelab: k3s、FluxCD、Traefik、Proxmox Backup Server、RouterOS、Bitwarden。&lt;/li&gt;
&lt;li&gt;容器: Docker、Colima、Helm、Dev Container。&lt;/li&gt;
&lt;li&gt;LLM 與開發: 用 LLM 寫程式時的心得與取捨。&lt;/li&gt;
&lt;li&gt;其他: Obsidian、各種小工具、旅遊與年度回顧。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;聯絡我&#34;&gt;聯絡我&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Email: &lt;a href=&#34;mailto:raiven.kao@gmail.com&#34;&gt;raiven.kao@gmail.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&#34;https://github.com/omegaatt36&#34;&gt;github.com/omegaatt36&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href=&#34;https://cv.omegaatt.com&#34;&gt;cv.omegaatt.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
