<?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>Open_source on omegaatt</title>
    <link>https://www.omegaatt.com/tags/open_source/</link>
    <description>Recent content in Open_source on omegaatt</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>zh-TW</language>
    <managingEditor>raiven.kao@gmail.com (Raiven Kao)</managingEditor>
    <webMaster>raiven.kao@gmail.com (Raiven Kao)</webMaster>
    <copyright>Raiven Kao 2020 - 2026</copyright>
    <lastBuildDate>Fri, 01 Nov 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.omegaatt.com/tags/open_source/index.xml" rel="self" type="application/rss+xml" />
    <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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <guid>https://www.omegaatt.com/blogs/develop/2024/the_double_edged_sword_of_open_source_software.md/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;setup-0&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/the_double_edged_sword_of_open_source_software.md/images/20241102_142051.webp&#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;
&lt;h2 id=&#34;一開源軟體的普及與迷思&#34;&gt;一、開源軟體的普及與迷思&lt;/h2&gt;
&lt;p&gt;說到開源軟體，不外乎就是 free 或是 freedom 的軟體，可以說是免費的軟體，也可以說是自由的軟體。&lt;/p&gt;
&lt;p&gt;早期的 &lt;a href=&#34;https://en.wikipedia.org/wiki/LAMP_(software_bundle)&#34;&gt;LAMP Stack&lt;/a&gt; 相較於 Microsoft 的 Windows Server、IBM 或是 Oracle 付費的服務，每個組件都是免費的，廣泛受到 Geek 到大中小型企業的使用&lt;/p&gt;
&lt;p&gt;同時，開源軟體顧名思義是開放原始碼，在授權許可下可以自由使用、修改、分享，許多人將開源與安全劃上等號。&lt;/p&gt;
&lt;h2 id=&#34;二開源軟體的安全現況&#34;&gt;二、開源軟體的安全現況&lt;/h2&gt;
&lt;h3 id=&#34;多雙眼睛的侷限&#34;&gt;多雙眼睛的侷限&lt;/h3&gt;
&lt;p&gt;即便開放原始碼，所有人都能查看開放原始碼，如果有任何 bug 或是安全漏洞，都「應該」會被發現。
我使用「應該」一詞，正因為許多人（包含我）在安裝開源軟體時，就如同安裝閉源軟體一樣，並不會查看全部的程式碼，確認安全後才進行安裝。而是做一個「大家都看過了，應該很安全」的假設。
例如當你想用 Nginx 取代 Apache 時，可能僅會比較兩者的 feature 與 benchmark，並不會查看內部 tcp socket 是如何管理等等，或是 buffer overflow 時的錯誤處理機制。&lt;/p&gt;
&lt;h3 id=&#34;開源是否暴露更多漏洞&#34;&gt;開源是否暴露更多漏洞？&lt;/h3&gt;
&lt;p&gt;####安全問題的挑戰&lt;/p&gt;
&lt;p&gt;當我們將軟體開源，等於是將所有安全問題也給暴露了出來。&lt;/p&gt;
&lt;p&gt;舉例來說，假如我們 self-hosted 一個 NAS 服務，這個 NAS 使用指定的 port 進行 web 與 API 的存取，例如 &lt;code&gt;:8787&lt;/code&gt;。
當一個 Hacker 看到該 NAS 的 Auth 並沒有任何 rate limit，就可以直接在 NAS 內進行 port scan 或是 brute force 攻擊，取得這個 NAS 服務的控制權。&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;p&gt;這就是 zoxide 的用武之地。zoxide 是一個由 Rust 編寫的「更聰明的 cd 命令」，靈感來自 z 和 autojump。它會記住你最常使用的目錄，讓你只需輸入幾個字符就能快速跳轉。&lt;/p&gt;
&lt;h2 id=&#34;zoxide-的主要特性&#34;&gt;zoxide 的主要特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;自動匹配: 不需要輸入完整路徑，zoxide 會根據輸入自動匹配最相關的目錄：&lt;/li&gt;
&lt;li&gt;自動紀錄過去的目錄: zoxide 會記住你最常使用的目錄，讓你只需輸入幾個字符就能快速跳轉。這些資料可以使用 &lt;code&gt;zoxide query&lt;/code&gt; 來查詢，或是 &lt;code&gt;zoxide edit&lt;/code&gt; 來管理。&lt;/li&gt;
&lt;li&gt;互動式選擇: 結合 fzf，可以互動式地選擇目標目錄&lt;/li&gt;
&lt;li&gt;輕量快速: 用 Rust 編寫，啟動迅速，幾乎不會影響 shell 的啟動時間&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;安裝與配置&#34;&gt;安裝與配置&lt;/h2&gt;
&lt;p&gt;zoxide 的安裝可以參考 &lt;a href=&#34;https://github.com/ajeetdsouza/zoxide?tab=readme-ov-file#installation&#34;&gt;官方文件&lt;/a&gt;，我們就不多贅述了。&lt;/p&gt;
&lt;p&gt;安裝完成後，我們需要在 shell 的配置文件中添加初始化命令。以 zsh 為例，在 &lt;code&gt;~/.zshrc&lt;/code&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;&#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;eval &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;zoxide init zsh&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;p&gt;重新打開終端或執行 &lt;code&gt;source ~/.zshrc&lt;/code&gt; 後，zoxide 就可以使用了。&lt;/p&gt;
&lt;h2 id=&#34;使用方法&#34;&gt;使用方法&lt;/h2&gt;
&lt;p&gt;zoxide 的基本用法非常直觀，經過自動執行 &lt;code&gt;zoxide init zsh&lt;/code&gt; 後，我們可以使用 &lt;code&gt;z&lt;/code&gt; 和 &lt;code&gt;zi&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&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;&#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;❯ ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  boo bar baz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;❯ z bo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;❯ pwd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  /home/raiven/boo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&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;&#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;❯ pwd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  /home/raiven/dev/omegaatt-blog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;❯ z
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;❯ pwd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  /home/raiven
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;❯ z blog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;❯ pwd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  /home/raiven/dev/omegaatt-blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&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;&#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;❯ zi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~ &amp;lt; 98/98&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;0&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;296.0 /home/raiven/dev/omegaatt-blog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;124.0 /home/raiven/dev/bookly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 50.0 /home/raiven/dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 24.0 /home/raiven/dev/test
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 12.0 /home/raiven/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這裡的 &lt;code&gt;z&lt;/code&gt; 命令就像一個更聰明的 &lt;code&gt;cd&lt;/code&gt;，而 &lt;code&gt;zi&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;p&gt;這篇會專注在使用 Bitwarden 客戶端搭配輕量級的 Vaultwarden 後端。&lt;/p&gt;
&lt;h1 id=&#34;使用-bitwarden-來管理密碼&#34;&gt;使用 Bitwarden 來管理密碼&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://bitwarden.com/products/personal/&#34;&gt;&lt;img alt=&#34;Bitwarden_logo&#34; loading=&#34;lazy&#34; src=&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Bitwarden_logo.svg/1200px-Bitwarden_logo.svg.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bitwarden 是一款流行且功能強大的密碼管理工具，它提供了一個安全的方法來存儲和管理所有密碼。作為一個開源產品，Bitwarden 允許用戶選擇自行托管其服務，這意味著用戶可以在自己的服務器上運行 Bitwarden，從而更好地控制自己的數據安全。&lt;/p&gt;
&lt;h2 id=&#34;bitwarden-的特點&#34;&gt;Bitwarden 的特點&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;bitwarden-demo&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/bitwarden_with_self_hosted_password_backend/images/Screenshot_20240901_101852.webp&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;安全性&lt;/strong&gt;: Bitwarden 使用端到端加密，確保只有您可以訪問您的密碼。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台支持&lt;/strong&gt;: 支持 Windows、macOS、Linux、Android 和 iOS。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易於使用&lt;/strong&gt;: 提供直觀的用戶界面和簡單的操作流程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;開源&lt;/strong&gt;: 開源，增加了透明度和安全性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bitwarden 同時&lt;a href=&#34;https://bitwarden.com/help/authenticator-keys/&#34;&gt;支援基於時間的一次性密碼&lt;/a&gt;，讓 TOTP 也能自動填入。也能透過 &lt;a href=&#34;https://github.com/scito/extract_otp_secrets&#34;&gt;github.com/scito/extract_otp_secrets&lt;/a&gt; 來提取 Google Authenticator 內的 2FA 資訊，儲存進 Bitwarden 中。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/bitwarden&#34;&gt;Bitwarden 開源了 client 與 server&lt;/a&gt;，在 server 端的選擇有以下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 Bitwarden 提供的官方服務，又分為免費跟付費，但這個選擇就跟 1p 沒太多區別。&lt;/li&gt;
&lt;li&gt;自架 Bitwarden 提供的 &lt;a href=&#34;https://github.com/bitwarden/server&#34;&gt;open source server&lt;/a&gt;，由於是使用 C# 與 mssql，吃的記憶體著實太多。&lt;/li&gt;
&lt;li&gt;自架 Bitwarden 相容的後端，我採用的是 rust 實做的 &lt;a href=&#34;https://github.com/dani-garcia/vaultwarden&#34;&gt;Vaultwarden&lt;/a&gt;，搭配 sqlite，記憶體使用量與官方的 C# 不是一個量級的。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;bitwarden-架構&#34;&gt;Bitwarden 架構&lt;/h2&gt;
&lt;p&gt;bitwarden 的 local storage 都是儲存加密後的密碼資料，不會使用明碼儲存，故上傳到 server 上的也僅僅是加密後的密碼資料。&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;p&gt;我並非一個 &lt;a href=&#34;https://github.com/sudhakar3697/awesome-electron-alternatives&#34;&gt;anti-Electron&lt;/a&gt; 或是 &lt;a href=&#34;https://www.reddit.com/r/degoogle/&#34;&gt;deGoogle&lt;/a&gt; 的人，但試圖找到其他解決方案正式樂趣之所在。&lt;/p&gt;
&lt;h2 id=&#34;pwaprogressive-web-app&#34;&gt;PWA(Progressive Web App）&lt;/h2&gt;
&lt;p&gt;詳盡的 PWA 技術可以到 mozilla 的&lt;a href=&#34;https://developer.mozilla.org/zh-TW/docs/Web/Progressive_web_apps&#34;&gt;文件&lt;/a&gt;中查看，對我來說只要可以達到目的：可以在 Windows、Mac、Linux 上封裝成 Desktop Aplication 即可。&lt;/p&gt;
&lt;h2 id=&#34;官方支援&#34;&gt;官方支援&lt;/h2&gt;
&lt;p&gt;mozilla 官方有一個文件針對「安裝網頁應用到桌面環境」的歷史講解，可以參考&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Installing&#34;&gt;官方文件&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;文中提到過去將網址「儲存」在桌面上的類似「書籤」的方法(SSB)，以及與 PWA 的不同之處：PWA 的使用者資料是儲存在桌面環境中。&lt;/p&gt;
&lt;h2 id=&#34;pwa-add-on&#34;&gt;PWA Add-on&lt;/h2&gt;
&lt;p&gt;上述文件內有提到需要使用 Fan-maded 的 PWA Add-on 來安裝 PWA：&lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/pwas-for-firefox/&#34;&gt;Progressive Web Apps for Firefox by Filip Štamcar&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;他是一個開源的 Firefox 擴充套件(&lt;a href=&#34;https://github.com/filips123/PWAsForFirefox&#34;&gt;filips123/PWAsForFirefox&lt;/a&gt;)，具有&lt;a href=&#34;https://pwasforfirefox.filips.si/&#34;&gt;完整的文件&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&#34;安裝過程&#34;&gt;安裝過程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在 Firefox 瀏覽氣上安裝 &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/pwas-for-firefox/&#34;&gt;PWA Add-on&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;瀏覽器會自動跳到設定頁面，首先會需要同意 EULA
&lt;img alt=&#34;setup-0&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-0.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;接著會需要安裝 connector，需要透過該 connector 才能連結瀏覽器本身與 extension。
connector 由 Rust 編寫，使該 extension 可以在跨平台的桌面環境中管理 firefox 設定檔、runtime 等等未開放給 extension 存取的資源。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Windows:
Windows 的 connector 除了手動安裝外，也推薦使用 &lt;a href=&#34;https://github.com/microsoft/winget-cli&#34;&gt;winget&lt;/a&gt; 來安裝，類似於 apt/yum 的套件管理工具。
&lt;img alt=&#34;connector installation windows&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-1.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;Linux
Linux 的 connector 可以到 &lt;a href=&#34;https://github.com/filips123/PWAsForFirefox/releases&#34;&gt;github release&lt;/a&gt; 上找到，例如我的作業系統是 OpenSUSE Tumbleweed，則可以下載 .rpm 檔案。
&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;&#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;sudo zypper in ./firefoxpwa-2.12.1-1.x86_64.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Debian/Ubuntu(DEB):
&lt;img alt=&#34;connector installation deb&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-2.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;Redhat/Fedora/OpenSUSE(RPM):
&lt;img alt=&#34;connector installation rpm&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-3.webp&#34;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;接著會需要安裝不同於原生 Firefox 的 runtime，根據描述，會下載並由 connector 自動修改成支援 PWA 的 runtime。
&lt;img alt=&#34;runtime installation&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-4.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;到這邊已經完成 PWA extension 的安裝，可以嘗試使用 PWA 的方式來安裝 web app to desktop app。&lt;/li&gt;
&lt;li&gt;首先需要打開你想要安裝成 Desktop App 的網頁，如果在不同的網頁嘗試設定，extension 會自動判斷該網頁 CORS Error，即便是 &lt;code&gt;https://www.notion.so&lt;/code&gt; 與 &lt;code&gt;https://notion.so&lt;/code&gt; 也屬於不同的 Origin。
接著點擊 PWAForFirefox 的圖示，可以看到已經安裝好的 extension。
&lt;img alt=&#34;extension icon&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-5.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;接著一步一步的跟著指引設定好該 PWA 的設定。
&lt;img alt=&#34;add pwa&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-6.webp&#34;&gt;
&lt;img alt=&#34;add pwa&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-7.webp&#34;&gt;
&lt;img alt=&#34;add pwa&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-8.webp&#34;&gt;
&lt;img alt=&#34;add pwa&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-9.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;完成，可以在應用程式選單內找到剛剛建立的 PWA 應用程式。
&lt;img alt=&#34;pwa at menu&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-10.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;開啟後可以自動開啟網頁應用程式，並具有獨立的設定檔。
&lt;img alt=&#34;open pwa&#34; loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/pwa_on_firefox/images/setup-11.webp&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;使用感受&#34;&gt;使用感受&lt;/h2&gt;
&lt;p&gt;三四年前在 Windows 上習慣使用 Notion Desktop 版本，在 Linux 上反而已經習慣要用網頁來打開，這次嘗試使用 PWA 後倒是經常忘記有將它安裝成 Desktop Application。&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;h2 id=&#34;在-truenas-scale-上建立備份任務&#34;&gt;在 Truenas Scale 上建立備份任務&lt;/h2&gt;
&lt;h3 id=&#34;建立-ssh-pair&#34;&gt;建立 SSH Pair&lt;/h3&gt;
&lt;p&gt;首先到 Credentials -&amp;gt; Backup Credentials 的頁面&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2024/backup_from_truenas_scale_to_pbs/images/20240519_163627.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;點擊 SSH Configurations 中的 Add&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;p&gt;因緣際會，在 Ubuntu 24.04 LTS 發布之際，我決定從 KDE Neon distro hopping 到 OpenSUSE Tumbleweed，這是一個由 SUSE 公司推出的滾動式發行版，軟體包在 SUSE 測試過後便會推送到 OpenSUSE 的 Repo（其他 OpenSUSE 的功能省略）。這次的轉換主要是為了獲得最前沿的 Linux 體驗。OpenSUSE Tumbleweed 的滾動更新模式能確保我始終使用最新的軟體和技術，這對我來說是一個有趣的選擇，即便有可能收到有問題的 xz 更新 XD。&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;&#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;❯ fastfetch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                     ......             raiven@raiven-suse
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     .,cdxxxoc,.               .:kKMMMNWMMMNk:.         ------------------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cKMMN0OOOKWMMXo. A        ;0MWk:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;      &amp;#39;&lt;/span&gt;:OMMk.      OS: openSUSE Tumbleweed &lt;span style=&#34;color:#ae81ff&#34;&gt;20240517&lt;/span&gt; x86_64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ;WMK;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;       &amp;#39;&lt;/span&gt;lKMMNM,     :NMK&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;             &amp;#39;&lt;/span&gt;OMW;     Host: FMV UH-X
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; cMW;             WMMMN   ,XMK&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;                 oMM.    Kernel: 6.8.9-1-default
&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;.MMc             &amp;#39;&amp;#39;^*~l. xMN:                    KM0    Uptime: 1 hour, 14 mins
&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;MM.                   .NMO                      oMM    Packages: &lt;span style=&#34;color:#ae81ff&#34;&gt;3211&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 style=&#34;color:#ae81ff&#34;&gt;37&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;flatpak&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;.MM,                 .kMMl                       xMN    Shell: zsh 5.9
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; KM0               .kMM0&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; .dl&amp;gt;~,.               .WMd    DE: KDE Plasma 6.0.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; &amp;#39;&lt;/span&gt;XM0.           ,OMMK&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;    OMMM7&amp;#39;&lt;/span&gt;              .XMK     WM: KWin &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Wayland&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;   *WMO:.    .;xNMMk&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;       NNNMKl.          .xWMx      WM Theme: Nordic
&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;     ^ONMMNXMMMKx;          V  &amp;#39;&lt;/span&gt;xNMWKkxllox0NMWk&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;       Theme: Breeze (NordicDarker) [QT], Breeze-Dark [GTK2], Breeze [GTK3]
&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;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;:dOOXXKOxl&amp;#39;&lt;/span&gt;          Icons: Zafiro-Nord-Dark-Black &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;QT&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, Zafiro-Nord-Dark-Black &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;GTK2/3/4&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;                                                        Font: Noto Sans &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;10pt&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;QT&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;, Noto Sans &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;10pt&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;GTK2/3/4&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;                                                        Cursor: Nordic &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;24px&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;                                                        Terminal: tmux 3.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                                        CPU: 13th Gen Intel&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;R&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Core&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; i5-1335U &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;12&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; @ 4.60 GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                                        GPU: Intel Iris Xe Graphics @ 1.25 GHz &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Integrated&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;                                                        Memory: 9.86 GiB / 15.27 GiB &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;65%&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;                                                        Swap: 677.00 MiB / 2.00 GiB &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;33%&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;                                                        Disk &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;/&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: 88.81 GiB / 1.82 TiB &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; - btrfs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;即便是已經足夠穩定的 OpenSUSE，也是可以很輕易的被搞的不穩定，正如 debian 在 &lt;a href=&#34;https://wiki.debian.org/DontBreakDebian&#34;&gt;DontBreakDebian&lt;/a&gt; 一文中提到的：&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/pulse/running-vm-container-ramesh-kumar&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/kubernetes_with_frp_tunnel_and_cert_manager/images/1596892531951.webp&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;會需要這麼麻煩還不是為了省一點點 GKE 的成本（即便可能沒省到），但在自家建一個 lab 環境而不用計算由時間計價的 infra 成本，還是挺省腦袋的。&lt;/p&gt;
&lt;p&gt;過去僅是將 service 使用 nodePort 來讓家裡面的其他裝置可以連線，或是使用 &lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2023/wireguard_easy&#34;&gt;wireguard 作為 VPN&lt;/a&gt; 來從遠端連線，就是沒有動力處理好 http service 與 TLS，趁這個假日剛好需要把 &lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2023/bitwarden_with_self_hosted_password_backend&#34;&gt;自架 vaultwarden 後端&lt;/a&gt; 給 expose 出來，便誕生了這篇。&lt;/p&gt;
&lt;p&gt;在當前的雲端運算時代，許多開發者和 IT 專業人員都面臨著一個共同的挑戰：如何有效地將位於不同網絡環境中的服務整合並暴露給公眾。特別是對於那些希望將家用網絡中的服務有效連接到公共雲端（如 GCP,AWS,Azure,OCI）的用戶來說，這一挑戰尤為突出。文內主要講述通過在 GCP VM 上部署 FRP（Fast Reverse Proxy）服務器，結合家中的 kubernetes cluster 上配置的 FRP 客戶端，來實現一個高效且安全的服務部署流程。&lt;/p&gt;
&lt;p&gt;透過此方式，我們不僅可以利用 GCP VM 作為公共 IP 的代理，實現從互聯網到家庭網絡的無縫連接，還能藉助 kubernetes 的強大功能進行快速的服務部署和管理。同時，利用 ingress-nginx 作為 ingress 控制器和 cert-manager 進行 TLS 設定，我們能夠確保服務的安全性和可靠性。&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;h2 id=&#34;遇到了什麼問題&#34;&gt;遇到了什麼問題&lt;/h2&gt;
&lt;p&gt;在使用 wireguard 來搭建 VPN 前，我是使用 &lt;a href=&#34;https://www.zerotier.com/&#34;&gt;zerotier&lt;/a&gt; 搭配 Mikrotik RB5009 所執行的 RouterOS 7.x 版本，讓外網可以連回家裡的網路環境&lt;/p&gt;
&lt;p&gt;但 zerotier 的網路拓樸是存在他們官方伺服氣上，與其相信 zerotier，我想在 vps 上建立虛擬機，並只許特定 ip 登入，可能更加可靠（？&lt;/p&gt;
&lt;h2 id=&#34;解決方法&#34;&gt;解決方法&lt;/h2&gt;
&lt;p&gt;於是我在 frp tunnel VM 上建立了 wireguard 節點，作為外網與內網溝通的橋樑。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.wireguard.com/&#34;&gt;wireguard&lt;/a&gt; 是一個高效的現代化 VPN，目標是比 IPsec 更快。在 2020 年時正式推出 1.0.0 版本。&lt;/p&gt;
&lt;p&gt;wireguard 的拓樸實際上是 peer2peer，甚至可以達到 full mesh，但礙於錢錢不夠，單一個節點作為 server side 就足夠了。&lt;/p&gt;
&lt;h3 id=&#34;server&#34;&gt;server&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用 docker-compose 能快速部署 wireguard 服務，我們使用的是 &lt;a href=&#34;https://github.com/wg-easy/wg-easy&#34;&gt;wg-easy&lt;/a&gt;
簡單換掉一些參數:&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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 loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-1.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;記憶力不佳，過去常常無法想起某段時間做了哪些專案，甚至 daily standup 前忘記昨天做了什麼，發現了 wakatime 可以透過 vscode 插件、terminal 插件來查看自己在哪些時間變更了哪些專案、檔案，甚至可以紀錄下過得指令（僅 binary 的部份，不含參數不會洩漏資料）。&lt;/p&gt;
&lt;p&gt;在使用 WakaTime 前，先到 &lt;a href=&#34;https://wakatime.com&#34;&gt;WakaTime 官網&lt;/a&gt;上註冊並登入，取得最重要的 API Key(API Token)：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-2.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;安裝相應的客戶端插件。&lt;a href=&#34;https://wakatime.com/plugins&#34;&gt;wakatime 支援的插件、編輯器&lt;/a&gt;包括但不限於：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;Vim&lt;/li&gt;
&lt;li&gt;Excel&lt;/li&gt;
&lt;li&gt;Terminal
&lt;ul&gt;
&lt;li&gt;zsh&lt;/li&gt;
&lt;li&gt;bash&lt;/li&gt;
&lt;li&gt;fish&lt;/li&gt;
&lt;li&gt;iTerm2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;舉例來說我們可以安裝 &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=WakaTime.vscode-wakatime&#34;&gt;vscode 插件&lt;/a&gt;，並跟著 Installation 輸入完 API Key 就可以開始寫點東西了。&lt;/p&gt;
&lt;h2 id=&#34;查看報告&#34;&gt;查看報告&lt;/h2&gt;
&lt;p&gt;使用了一段時間後，可以回到官網查看 &lt;a href=&#34;https://wakatime.com/dashboard&#34;&gt;dashboard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;查看自己上週、前兩週、前一個月每天花了（浪費）了多少時間，以前三十天的圖為例：
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-3.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;或是 YoY 的活動圖
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-6.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;以此 blog 的 repo 來作為舉例，可以查看某個 project 的細節&lt;/p&gt;
&lt;p&gt;在該專案花了多少時間、什麼語言：
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-4.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;檔案、分支的時間分配：
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/wakatime_experience/images/wakatime_dashboard_official-5.webp&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;費用&#34;&gt;費用&lt;/h2&gt;
&lt;p&gt;免費版本的功能已經十分完整了，&lt;a href=&#34;https://wakatime.com/pricing?utm_source=magic-panda-engineer&#34;&gt;完整費用方案在此&lt;/a&gt;。
透過學生帳號可以申請教育折扣，年度付費 Premium 方案的話一年只要 59 美元，就可以享有完整的 WakaTime 服務。
雖然付費方案的功能幾乎都可以透過免費版本就有的 API 來完成，但仍可以花點小錢支持團隊，或是開啟公司計畫。&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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 loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2023/logitech_media_server_migration/images/bb4cgPLT2m.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;雖然說現在已經出到 &lt;a href=&#34;https://docs.picoreplayer.org/downloads/&#34;&gt;8.2.0&lt;/a&gt;，但也已經是 2022 年六月的版本了，起初因為 raspberry pi 4b 便宜而使用 piCorePlayer，後來也因 raspberry pi 4b 漲價(漲幅超過 100%)進而不使用 piCorePlayer，不知道官方後來沒更新了是因為樹莓派太穩定，還是真的太貴了&amp;hellip;。&lt;/p&gt;
&lt;h2 id=&#34;從-bare-metal-到-docker&#34;&gt;從 Bare Metal 到 Docker&lt;/h2&gt;
&lt;p&gt;當時在學習 HomeLab，首先是從 &lt;a href=&#34;https://www.portainer.io/&#34;&gt;portainer&lt;/a&gt; 開始玩，也因此誕生了 &lt;a href=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker&#34;&gt;logitech media server 搭配 docker 實現雙機分離&lt;/a&gt;。後來也用著同樣的 &lt;a href=&#34;https://hub.docker.com/r/lmscommunity/logitechmediaserver&#34;&gt;image&lt;/a&gt; 將 lms 建在 k8s cluster 內，遇到的比較髒的問題是 nginx 的 port &lt;a href=&#34;https://github.com/omegaatt36/lab/blob/main/k8s/ingress-nginx/tcp-services-config-map.yaml&#34;&gt;用非正式的方式解決&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;這時候其實已經不在乎 logitech media server 是否帶來更好的音質了，也沒有連動 NAS 的音樂，主要是使用 &lt;a href=&#34;https://github.com/philippe44/LMS-YouTube&#34;&gt;Youtube Plugin&lt;/a&gt; 播放 Youtube 上的內容(即便有訂閱 Youtube Premium)。以及使用 &lt;a href=&#34;https://mysqueezebox.com/appgallery/Podcasts&#34;&gt;Podcast Plugin&lt;/a&gt; 收聽 podcast。&lt;/p&gt;
&lt;p&gt;使用 docker 的好處不外乎一個字，省，於是我把 raspberry pi 4b 也給賣了。&lt;/p&gt;
&lt;h2 id=&#34;從-docker-到-podman-與-lxc&#34;&gt;從 Docker 到 Podman 與 LXC&lt;/h2&gt;
&lt;p&gt;2022 年台灣疫情大爆發，公司也從 322 變成全遠端，但也在 2022 下半年恢復 322，於 2023 年正式恢復正常進辦公室。在這期間發現 logitech media server 使用 docker 做為執行環境，除了省物理機的錢(相較 bare metal)，更省顯示卡資源。&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;h2 id=&#34;環境&#34;&gt;環境&lt;/h2&gt;
&lt;p&gt;wsl2 + ubuntu 22.04&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;&#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;❯ neofetch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .-/+oossssoo+/-.               raiven@raiven
&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;:+ssssssssssssssssss+:&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;      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 22.04.1 LTS on Windows &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; x86_64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .ossssssssssssssssssdMMMNysssso.       Kernel: 5.10.43.3-microsoft-standard-WSL2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   /ssssssssssshdmmNNmmyNMMMMhssssss/      Uptime: &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; hours, &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; mins
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  +ssssssssshmydMMMMMMMNddddyssssssss+     Packages: &lt;span style=&#34;color:#ae81ff&#34;&gt;2005&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; /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Shell: zsh 5.8.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Theme: Adwaita &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;GTK3&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;+sssshhhyNMMNyssssssssssssyNMMMysssssss+   Icons: Adwaita &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;GTK3&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;ossyNMMMNyMMhsssssssssssssshmmmhssssssso   Terminal: Windows Terminal
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ossyNMMMNyMMhsssssssssssssshmmmhssssssso   CPU: AMD Ryzen &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt; 5900X &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;24&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; @ 3.700GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+sssshhhyNMMNyssssssssssssyNMMMysssssss+   GPU: dbac:00:00.0 Microsoft Corporation Device 008e
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Memory: 1427MiB / 15966MiB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  +sssssssssdmydMMMMMMMMddddyssssssss+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   /ssssssssssshdmNNNNmyNMMMMhssssss/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .ossssssssssssssssssdMMMNysssso.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      -+sssssssssssssssssyyyssss+-
&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;:+ssssssssssssssssss+:&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;            .-/+oossssoo+/-.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;wsl2-中啟用-systemd&#34;&gt;wsl2 中啟用 systemd&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;請確保 wsl2 的版本是 version 2，可以在 cmd/powershell 中查看&lt;/p&gt;</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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;p&gt;&lt;a href=&#34;https://mikrotik.com/product/rb5009ug_s_in&#34;&gt;RB5009G&lt;/a&gt; 為 arm64(ARMv8)，系統為 RouterOS v7，透過 &lt;a href=&#34;https://help.mikrotik.com/docs/display/ROS/ZeroTier&#34;&gt;ZeroTier&lt;/a&gt; 插件可以實現內網穿透以及 VPN，一直以來可在外連回家裡做事，連 Jellyfin 使用起來都很順。&lt;/p&gt;
&lt;p&gt;事出必有因，ZeroTier 的服務器在未知的地方，VPN 的設定也是在網頁上設定，即便不需要太過擔心，但若是 ZeroTier 被攻擊，那自己的內網也危險了。後來又遇到一次，在某處透過 Windows rdp 連回家開 VScode 做事，但敲鍵盤會有一到兩秒的延遲，加劇了需要替換掉 ZeroTier 的想法。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/fatedier/frp&#34;&gt;frp&lt;/a&gt; 是一個由 golang 寫出來的 reverse proxy&amp;hellip;，其他的到 github 看比較清楚 XD。&lt;/p&gt;
&lt;p&gt;這篇文章主要是透過 frp 建立內網穿透，雖然大部分都在建立 AWS EC2 instance，frp 的建立實在是非常簡單，VPN (maybe WireGuard?)的實現會另外再寫一篇。&lt;/p&gt;
&lt;h1 id=&#34;事前準備&#34;&gt;事前準備&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;一個 AWS 帳號&lt;/li&gt;
&lt;li&gt;一台 linux 主機作為 frp client&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;建立-amazon-ec2&#34;&gt;建立 Amazon EC2&lt;/h1&gt;
&lt;h2 id=&#34;建立執行個體&#34;&gt;建立執行個體&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;建立好帳號後，進入 &lt;a href=&#34;https://console.aws.amazon.com/console/&#34;&gt;AWS console&lt;/a&gt;，點擊 EC2。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_lk5fqYZhYL.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;點擊啟動執行個體
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_H0uFz5vH3y.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;取名為 frp-tunnel
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_I3wkK7askV.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;選用自己習慣的 linux distro，這邊我習慣使用 ubuntu，故選 ubuntu 22.04。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_z5KPS18q6J.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;執行個體類型選 t2.micro，金鑰由於安全因素，請建立新的金鑰對(key pair)
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_8Cfa1EOR9c.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;由於我使用 ubuntu 22.04，故使用 ED25519 來加密(RSA 已被淘汰)。下載下來的 pem or ppk 需要好好保存，未來不能再下載。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_VzVIcfHUg0.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;網路設定的部分，ssh 的 source 使用&lt;code&gt;我的IP&lt;/code&gt;，不要一開機就被陌生人打穿。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_Qx4K4tK1jT.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;設定存儲的部分，若是使用 AWS Linux 的話可以預設 8GB 沒問題，我自己的 ubuntu vm 習慣 20GB，所以設成 20GB。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_Pu7Weq1NXU.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;最後確認一下右邊的摘要，就可以點擊啟動執行個體。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_dJxs8LK4lG.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;建立完成後就會轉跳至完成頁面。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_TRIPSPPEva.webp&#34;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ssh-連線至-ec2&#34;&gt;ssh 連線至 EC2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在 console 頁可以看到剛剛建立的 EC2 instance，點擊可以進入 instance 頁面。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2022/frp-tunnel/images/chrome_JuQsMOCLAR.webp&#34;&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;h1 id=&#34;lms-解決方案&#34;&gt;LMS 解決方案&lt;/h1&gt;
&lt;p&gt;採用 &lt;a href=&#34;https://hub.docker.com/u/lmscommunity&#34;&gt;lms community&lt;/a&gt; 的 docker image &lt;a href=&#34;https://hub.docker.com/r/lmscommunity/logitechmediaserver&#34;&gt;lmscommunity/logitechmediaserver&lt;/a&gt; 作為這次 server 端的 service。&lt;/p&gt;
&lt;h1 id=&#34;安裝流程&#34;&gt;安裝流程&lt;/h1&gt;
&lt;p&gt;此篇文章使用 portainer 作為 GUI 方便演示，若熟悉 docker 與 k8s 的可以自行下指令安裝。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先我把我的音樂都存放在 NAS 上，先將 music 資料夾給共享出來
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_eeCPLxdAc7.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;接著到 portainer 中建立三個 volume
a. lms-music
輸入在 NAS 分享出來的目錄與使用者、密碼，建立一個 cifs mounted volume
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_ldBeP6Fxh9.webp&#34;&gt;
b. lms-config
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_OWW2NmHnVl.webp&#34;&gt;
c. lms-playlist
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_yfoLywNeFT.webp&#34;&gt;&lt;/li&gt;
&lt;li&gt;接著到 stack 中，複製貼上官方的 &lt;a href=&#34;https://hub.docker.com/r/lmscommunity/logitechmediaserver&#34;&gt;docker-compose&lt;/a&gt;，若 portainer 已經佔用了 port &lt;code&gt;9000&lt;/code&gt;，則需要更改暴露的 port &lt;code&gt;port:port/tcp&lt;/code&gt; 並追加環境變數 &lt;code&gt;HTTP_PORT=port&lt;/code&gt;，我最終的 stack 設定為:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;lms:
    image: lmscommunity/logitechmediaserver
    volumes:
      - lms-config:/config:rw
      - lms-music:/music:ro
      - lms-playlist:/playlist:rw
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    ports:
      - 9002:9002/tcp
      - 9090:9090/tcp
      - 3483:3483/tcp
      - 3483:3483/udp
    environment:
      - HTTP_PORT=9002
    restart: always
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;點下 &lt;code&gt;Deploy the stack 後就完成了&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以到 container 下看是否已經啟動完成了，並稍微記一下 container 的 hash，在稍後 windows 的設定中會出現。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_mGOfrPb43k.webp&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;picoreplayer-設定&#34;&gt;piCorePlayer 設定&lt;/h1&gt;
&lt;p&gt;進入到 piCorePlayer web 中的 &lt;code&gt;Squeezelite Settings&lt;/code&gt; 設定頁面，並在 &lt;code&gt;LMS IP&lt;/code&gt; 中輸入 portainer 的 ip 位置後點擊 Save，大功告成。
&lt;img loading=&#34;lazy&#34; src=&#34;https://www.omegaatt.com/blogs/develop/2021/logitech_media_server_with_docker/images/chrome_YFvgpVIpxs.webp&#34;&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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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 loading=&#34;lazy&#34; src=&#34;https://prometheus.io/assets/architecture.png&#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;&#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><author>raiven.kao@gmail.com (Raiven Kao)</author>
      <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;
&lt;h1 id=&#34;系統選擇&#34;&gt;系統選擇&lt;/h1&gt;
&lt;p&gt;由於是第一次接觸 Raspberry pi as audio player，一開始是看到 Volumio 與 Moode 等等，也實際安裝了一次 Volumio，但由於慧根不夠(X)，或是不知道撞到了什麼，只要不小心設定錯音訊，便會導致系統無法撥音樂，也懶得 debug 了，於是想說乾脆來挑戰看看 piCorePlayer。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
