<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>indieveloper</title><link>http://indie.tw/</link><description>Recent content on indieveloper</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>&lt;a rel="license" href="http://creativecommons.org/licenses/by/4.0/">&lt;img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" />&lt;/a>&lt;br />This work is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License&lt;/a>.</copyright><lastBuildDate>Tue, 22 Jul 2025 13:52:10 +1000</lastBuildDate><atom:link href="http://indie.tw/index.xml" rel="self" type="application/rss+xml"/><item><title>Local-First - 即時協作 + 所有權，下一個世代的軟體開發典範</title><link>http://indie.tw/docs/local-first/</link><pubDate>Tue, 22 Jul 2025 13:52:10 +1000</pubDate><guid>http://indie.tw/docs/local-first/</guid><description>&lt;figure>&lt;img src="./cover.jpg"
alt="Cover image">&lt;figcaption>
&lt;p>墨爾本的街道。自攝&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>我在網路上看到獨立實驗室 &lt;a href="https://www.inkandswitch.com/">Ink &amp;amp; Switch&lt;/a> 2019 年刊登的文章《&lt;a href="https://www.inkandswitch.com/essay/local-first/">Local-first software: You own your data, in spite of the cloud&lt;/a>》。看完大受感動與啟發，在這裡做簡單的摘要與分享。&lt;/p>
&lt;p>放眼現代軟體生態，會發現跟十年以前已經完全不同。取代安裝在電腦上的應用程式，越來越多的軟體改成以網頁服務的方式提供。大部分用電腦的時間，幾乎都待在瀏覽器中。&lt;/p>
&lt;p>在過去的十幾年，軟體行業經歷了一次典範轉移。從傳統的桌面軟體，轉變成網頁服務。這帶來了更好的跨平台支援，免安裝直接使用，以及流暢的跨裝置體驗，最重要的，它使得&lt;strong>多人即時協作&lt;/strong>可行。&lt;/p>
&lt;p>指標性的案例，例如 Microsoft Word、PowerPoint、Adobe Illustrator，逐漸被 Google Docs、Canvas、Figma 所取代。這些服務支援多人即時協作，省下了 email 往返的心力，更重要的，讓多個人能同時修改而不會出現衝突。&lt;/p>
&lt;p>然而，從桌面軟體變成網頁服務也帶來了以下問題：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>速度&lt;/strong>：所有的操作都需要跟遠端的資料中心互動，就算只是勾一個選項，也需要等待網路延遲&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>依賴網路運作&lt;/strong>：不論是你的資料還是操作它的軟體，唯一的「正本」都是存放在遠端資料中心，不論是當你失去網路連線，或是伺服器故障，你都沒有辦法繼續使用&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>失去所有權&lt;/strong>：你不再&lt;strong>擁有&lt;/strong>你的檔案，你只是有著一組能&lt;strong>存取&lt;/strong>它們的帳密，而服務提供者隨時能收回&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>截取文章中的精闢總結：&lt;/p>
&lt;blockquote>
&lt;p>The cloud gives us collaboration, but old-fashioned apps give us ownership. Can’t we have the best of both worlds?&lt;/p>
&lt;p>雲端帶來協作，而桌面軟體給我們所有權。我們有沒有辦法結合兩個世界的優點？&lt;/p>
&lt;/blockquote>
&lt;p>這樣的軟體，就是這篇文章所提出的 &lt;strong>local-first software&lt;/strong>。&lt;/p>
&lt;h2 id="local-first-的七項指標">Local-First 的七項指標&lt;/h2>
&lt;p>文中將 local-first 定義為：優先使用本機儲存空間與內部網路，讓使用者有完整所有權，然而仍然能享受雲端服務的使用者體驗。&lt;/p>
&lt;p>其中提出了七項具體指標&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>速度&lt;/strong>：你的資料就在你的裝置上，所有操作都是即時完成，在背景中與其他裝置同步&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>跨裝置&lt;/strong>：你的資料要能夠在多個裝置上操作&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>離線使用&lt;/strong>：在網路不能使用時，還是要能完整使用單機功能&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>即時協作&lt;/strong>：能夠與他人同時操作，並能避免或解決衝突&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>可持續性&lt;/strong>：在這間公司倒閉後，使用者還能不能開他的資料？過了 100 年後，這些資料還有沒有辦法被讀取？&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>安全與隱私&lt;/strong>：使用者資料預設只存在使用者自己的裝置，避免資料集中在中心化伺服器，帶來的監控、駭客攻擊與資料遭不當利用的問題&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>所有權&lt;/strong>：你能不能完整擁有你的資料。如果帳號被公司或法院停權，你還能不能使用？&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>以下節錄文中以這七項指標對現有軟體、服務、技術所做的評量&lt;/p>
&lt;p>✓符合 — 部份符合 ✗ 不符合&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>速度&lt;/th>
&lt;th>跨裝置&lt;/th>
&lt;th>離線使用&lt;/th>
&lt;th>即時協作&lt;/th>
&lt;th>可持續性&lt;/th>
&lt;th>隱私&lt;/th>
&lt;th>所有權&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>檔案 + email 附件&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>✗&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>檔案 + 雲端同步&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✗&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Google Docs&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✗&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Web apps&lt;/td>
&lt;td>✗&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>✗&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>✗&lt;/td>
&lt;td>✗&lt;/td>
&lt;td>✗&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>多數手機應用&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>✗&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✗&lt;/td>
&lt;td>✗&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Git+GitHub&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓&lt;/td>
&lt;td>—&lt;/td>
&lt;td>✓&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>檔案 + email / 雲端同步&lt;/strong>：其實已經很好用了。你有完整檔案的所有權，在自己的電腦上流暢的操作。就只是當要與他人協作時，需要往復的寄送檔案，還必須不斷修改命名（&lt;code>報告_1.docs&lt;/code> &lt;code>報告_2.docx&lt;/code> &lt;code>報告_final_4.docx&lt;/code>）。&lt;br>
雲端同步稍微解決了寄送檔案的困擾，但當兩地同時修改了一個檔案，發生衝突時，就會非常難解決。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Google Docs / 一般網頁程式&lt;/strong>：可以跨裝置使用與多人協作，然而沒網路就什麼也做不了。你也需要擔心是否會因為帳號被停權等原因而失去你的作品。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>多數手機應用&lt;/strong>：雖然是下載在手機裡的程式，但大多數功能卻都要依賴伺服器的功能。沒有網路，連自己發的影片都打不開。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Git+GitHub&lt;/strong>：Git 是軟體業界用來管理程式碼版本和多人協作的首選工具。它幾乎完美符合了軟體開發的需求，然而主要是設計給純文字檔案（程式碼），同時學習門檻過高，不適合讓一般人日常使用。&lt;/p>
&lt;p>但它的設計，尤其是其中每一個端點都有完整資料，以及透過編輯歷史來做衝突比較與復原的功能，非常值得借鑑。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>究竟什麼樣的技術能夠符合這七項條件的每一項呢？在文中，實驗室團隊發現一種很有潛力作為基礎的技術：&lt;a href="https://zh.wikipedia.org/zh-tw/%E6%97%A0%E5%86%B2%E7%AA%81%E5%A4%8D%E5%88%B6%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B">無衝突複製資料類型（Conflict-free Replicated Data Types, CRDTs）&lt;/a>。以下就簡稱為 CRDTs。&lt;/p>
&lt;h2 id="理解-crdts">理解 CRDTs&lt;/h2>
&lt;p>CRDTs 於 2011 年在一個&lt;a href="https://pages.lip6.fr/Marc.Shapiro/papers/RR-7687.pdf">電腦科學期刊&lt;/a>中提出，是一種能讓多台電腦協作，又能自動解衝突的資料結構。CRDTs 不只保存資料的最終狀態，也保存了完整的變更歷史，並且只要重播（replay）歷史，就能得到一樣的最終狀態。&lt;/p>
&lt;p>以文字編輯為例，假如原始字串如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">1234567890
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A 在 3 後面插入了一個 0&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">1230456789
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>B（從原始字串）移除了 8&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">12345679
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>當電腦要合併這兩項操作時，會發現 123 後面的字一個也對不起來。傳統上我們會使用更高級的字串比對演算法來解決，但如果我們知道修改的歷史，我們就只要將它們各自應用，就能得到解決衝突後的結果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plaintext" data-lang="plaintext">&lt;span class="line">&lt;span class="cl">123456789 -&amp;gt; 原始字串
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1230456789 -&amp;gt; 在 3 後面插入了一個 0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">123045679 -&amp;gt; 移除了 8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果是真的不能自動解決的衝突，CRDTs 也能夠提供更準確和小範圍的比較訊息，讓應用程式或使用者來解決。&lt;/p>
&lt;p>在這個簡單的案例中可能還看不出價值，但使用過雲端檔案同步功能的人都知道，當遇到兩台電腦修改了同一個檔案，那是多麼麻煩和棘手的情況。僅基於結果的比對是困難的，這也就是為什麼不能夠以簡單的檔案/狀態同步來實現 local-first。&lt;/p>
&lt;p>因此，以 CRDTs 作為基礎，我們就能夠解決跨裝置的資料衝突問題，開發出既能離線運作，又能與他人進行協作的系統。&lt;/p>
&lt;h2 id="案例研究heptabase">案例研究：Heptabase&lt;/h2>
&lt;figure>&lt;img src="./heptabase.webp"
alt="Heptabase Screenshot">&lt;figcaption>
&lt;p>Heptabase 產品照片，取自官網&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>&lt;a href="https://heptabase.com/">Heptabase&lt;/a> 是一個由台灣人創辦的訂閱制筆記與知識庫軟體，致力於讓&lt;strong>任何人都能有效的對任何事建立深度理解&lt;/strong>。我已經使用了一年半，非常喜愛。它深深的改變了我學習的方式，也幫助我建立更有持續性與深刻的知識系統。&lt;/p>
&lt;p>我在使用 Heptabase 時，最享受的是它流暢的使用者體驗，每個裝置都能獨立運作，跨裝置同步也不會有衝突，今年更加入了即時多人協作。&lt;/p>
&lt;p>我以前使用 Notion，最受不了每次開啟都要等待好久的載入速度。後來回歸了純文字 markdown 的懷抱，用 Nextcloud 同步 markdown 檔案，然而電腦檔案的樹狀架構並不適合建立複雜知識系統。直到我發現 Heptabase，才找到真正適合自己的工具。&lt;/p>
&lt;p>我也是以 Heptabase 的架構為原型，在研究如何開發這樣的系統時，才發現了 local-first 這個概念。我不確定這是不是當初他們的設計理念之一，但在我的使用體驗上，它滿足了其中非常多項指標。&lt;/p>
&lt;p>以下我使用 local-first 的七項指標來評估 Heptabase&lt;/p>
&lt;p>✓符合 — 部份符合 ✗ 不符合&lt;/p>
&lt;ol>
&lt;li>
&lt;p>✓ &lt;strong>速度&lt;/strong>：單機擁有完整資料，打開立即開啟（不到 2 秒）&lt;/p>
&lt;/li>
&lt;li>
&lt;p>✓ &lt;strong>跨裝置&lt;/strong>：電腦、手機、平板、網頁都能跨裝置使用&lt;/p>
&lt;/li>
&lt;li>
&lt;p>✓ &lt;strong>離線使用&lt;/strong>：離線仍然能完整存取並修改所有資料，包含撰寫卡片，編輯白板等&lt;/p>
&lt;/li>
&lt;li>
&lt;p>✓ &lt;strong>即時協作&lt;/strong>：支援跟他人同時編輯同一個白板&lt;/p>
&lt;/li>
&lt;li>
&lt;p>— &lt;strong>可持續性&lt;/strong>：Heptabase 是專有的訂閱制軟體，不付費就不能使用。但資料以 markdown 與 JSON 格式每日備份於自己裝置，仍然可以使用其他軟體解析。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>— &lt;strong>安全與隱私&lt;/strong>：Heptabase 會在伺服器端保存一份你的資料，以利於同步功能，目前沒有端到端加密保護。使用者也可以選擇不啟用同步，但就無法享受跨裝置功能。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>— &lt;strong>所有權&lt;/strong>：使用者有 markdown 和 JSON 的所有資料，但少了 Heptabase 這套軟體，沒有那麼容易使用，但是技術上能夠自己解析的。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>總合來說，Heptabase 展現了 local-first 架構如何被實現在一個擁有良好使用者體驗的產品上，並使它成為產品核心賣點之一。&lt;/p>
&lt;h2 id="下個時代的來臨">下個時代的來臨&lt;/h2>
&lt;p>網際網路從一開始 web1 的單向傳遞，到使用者生產內容的 web2，直到現在將所有權歸還使用者的 web3 運動。然而應用開發卻還是以伺服器中心的 Web Apps 作為主流。&lt;/p>
&lt;p>Local-first 與 CRDTs 的架構，能夠在保有使用者主權的情況下，加入多人協作與跨裝置的功能。不論是家庭相簿、筆記、記帳、健身記錄，都能用更隱私而安全的方式與他人協作。這樣的應用程式，就如同是 &lt;strong>app3&lt;/strong>，將會是在未來世代的應用開發典範。&lt;/p></description></item><item><title>寫程式如何才能真正享受？三個我親身實踐的方法</title><link>http://indie.tw/blog/enjoy-programming-3-methods/</link><pubDate>Mon, 24 Mar 2025 11:26:50 +0800</pubDate><guid>http://indie.tw/blog/enjoy-programming-3-methods/</guid><description>&lt;p>你有沒有想過，為什麼有些人寫程式充滿樂趣，有些人卻充滿挫折？那些最頂尖的開發者，往往都是對寫程式充滿熱情的人，他們是怎麼做到的？&lt;/p>
&lt;p>我自從小六的時候在學校電腦課接觸到了圖像式程式設計工具 Scratch，就此開始了我程式設計的生涯。我一直都很嚮往「創作」，程式設計對我來說有如這個時代的魔法，讓我能實現我的任何想法。&lt;/p>
&lt;p>但對我身邊的其他朋友來說，似乎並非如此。程式設計對他們而言是一段充滿挫折的過程，能做出來就不錯了，何談樂趣。在有更多工作經驗後，我也開始體會到，寫程式並非總是令人開心的體驗。那我就開始好奇，到底是怎麼樣的經驗，能讓寫程式變得愉悅？&lt;/p>
&lt;p>我們可以從觀察寫程式的經驗開始：&lt;/p>
&lt;p>😄 &lt;strong>開心時刻&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>程式按預期執行&lt;/p>
&lt;/li>
&lt;li>
&lt;p>功能成功完成&lt;/p>
&lt;/li>
&lt;li>
&lt;p>寫出漂亮、乾淨的程式&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>😣 &lt;strong>痛苦時刻&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Debug 很久找不到問題&lt;/p>
&lt;/li>
&lt;li>
&lt;p>迷失於陌生框架&lt;/p>
&lt;/li>
&lt;li>
&lt;p>機械式的照本宣科&lt;/p>
&lt;/li>
&lt;li>
&lt;p>有時間壓力時&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="成就感的來源實現你腦袋中的想法">成就感的來源：實現&lt;strong>你&lt;/strong>腦袋中的想法&lt;/h2>
&lt;p>為什麼學校的程式課那麼無聊？&lt;/p>
&lt;p>在學習過程中，我們容易陷入單純的照做教學範本。你沒有自己的想法，那就算實現出來也不會有成就感。&lt;/p>
&lt;p>照著別人的指示去做，並不是創作。&lt;/p>
&lt;p>寫程式之所以能帶來快樂，最主要就是**「將想法實現」所帶來的滿足感**。寫程式的過程就是&lt;strong>創作&lt;/strong>的過程，正如同人們享受畫畫、創作音樂一般。&lt;/p>
&lt;p>&lt;img src="./mind-graph.png" alt="Notepad46_1.png">&lt;/p>
&lt;p>所以我們應該最大化「將你的想法實踐出來」的過程，並且盡量減少這段過程會遭遇的阻力，就能體驗到最大的快樂與成就感。&lt;/p>
&lt;p>對此，我有三點建議，能夠幫助你增加開心的時刻，與減少痛苦的時刻。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>將任務分解&lt;/p>
&lt;/li>
&lt;li>
&lt;p>在使用前&lt;strong>先熟悉工具&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>一次只學習一項概念&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="一將任務分解">一、將任務分解&lt;/h2>
&lt;p>&lt;img src="./imagination.png" alt="無法想像的事物就無法實現">&lt;/p>
&lt;p>當你開始進行專案，如果在沒有做好構想的情況下就開始寫，也容易會變成不知道現在自己在做什麼，累積了一堆更動都無法 commit 的窘境。&lt;/p>
&lt;p>因此我現在在開始寫程式前，會先開始規畫這個系統的架構。我會使用 Heptabase 在白板上先開始設計系統架構、流程圖。我甚至先寫一些虛擬碼，這能使我更早注意到原先沒有考慮到的問題。&lt;/p>
&lt;p>接著，我會挑出其中最簡單的部分，開始一件一件實現。你在一個時刻只會聚焦在完成一件小任務，而每當你完成一件任務，你都能感受到一次實現你想法的滿足感。這同時也能避免出現複雜難解的 bug，因為每次的更動的侷限在一個很小的範圍。&lt;/p>
&lt;p>&lt;img src="./heptabase.png" alt="Heptabase 專案規劃">&lt;/p>
&lt;p>然而，「如何將問題有效地拆解成小任務」本身就需要足夠的經驗。如果你發現自己很難進行拆解，可以問問自己：「我是不是還不夠熟悉解決這個問題所需的工具與概念呢？」這時，就會進入第二個重點：&lt;/p>
&lt;h2 id="二在使用前先熟悉工具">二、在使用前先熟悉工具&lt;/h2>
&lt;p>不知道你有沒有過這樣的經驗：要開始使用一個新的框架，但是沒寫幾行程式，就得要一直去查文件，後來甚至發現你設計的架構和框架不合要重做。&lt;/p>
&lt;p>學習和寫程式，一個是輸入，另一個是輸出。我們無法邊吸氣邊唱歌，我們也無法在邊學習工具邊使用它。&lt;/p>
&lt;p>我在一部&lt;a href="https://www.youtube.com/watch?v=_XRj9aYbOP0">志祺訪談軟體工程師的影片&lt;/a>中看到了對寫程式時的心境非常生動的比喻：&lt;/p>
&lt;blockquote>
&lt;p>寫程式時就像是在潛水。越困難的問題，你就需要花時間潛到很深的地方去尋找解法。一旦中間被打斷，你就得浮到水面上，再重新潛下去。&lt;/p>
&lt;/blockquote>
&lt;p>因此，當你發現花了超過 80% 的時間都是在學習怎麼使用工具，而非寫出你要的功能時，你應該先放下手上的專案，開一個新工作區，熟悉一下你需要使用的工具。可以是走一遍網站上的 Quick Start、Example，或是把你的專案要用的功能先操作一遍。&lt;/p>
&lt;p>在我們寫專案的過程中，環境往往是複雜的。有時你很難確認問題到底出在你的程式邏輯，還是工具與你預期的不同。透過一個獨立的新環境，單純測試工具的功能，能驗證你對工具的了解，並減少未來除錯的表面積。&lt;/p>
&lt;p>更重要的是，在熟悉工具後，它們才會「進入你的腦袋」變成你思考的一部分。利用它們開發程式，才會讓人享受。&lt;/p>
&lt;h2 id="三一次只學一個概念">三、一次只學一個概念&lt;/h2>
&lt;p>正如同我們要在使用前先熟悉工具，一個專案牽涉的概念（或是所謂領域知識 domain knowledge）則是思維的工具。當寫程式的過程有太多你不熟悉的概念，你最好先停一下，一步步熟悉各自的概念之後，再開始開發。&lt;/p>
&lt;p>舉我女朋友學習程式的例子：初學者該學習什麼語言，最常見的說法是 Python，但實際還是要看對方有沒有一些具體需求。我當時認為 JavaScript 作為現在幾乎無所不能的語言，其動態型別也有較低的門檻，學習過程還可以製作互動網頁等專案，有比較高的成就感，同時在業界也有很多職缺，應該會是個好選項。因此我們選擇從一個零基礎的網頁全端線上課作為起點。&lt;/p>
&lt;p>但她在上了一陣子後發現，網頁全端這個領域有太多概念，光是前端就有三種語言 HTML、CSS、JavaScript，後端的 NodeJS 和瀏覽器的執行環境又有所不同，後端處理請求又有 routing, middleware, template 等不同概念。我這時才理解到，在沒有計算機與網路的基礎下，是幾乎沒有辦法理解這整套架構的。&lt;/p>
&lt;p>回顧我的程式學習歷程，我也從來不是像這樣一次被灌輸整個全端開發的所有知識，而是每個階段都只專注在一個概念：用 Scratch 學邏輯和遊戲設計，用 Python 學習程式語言與網路協定，用 Go 學習後端系統開發，用 JavaScript 學習前端開發。&lt;/p>
&lt;p>當你一次要掌握太多不同的概念，就會造成認知負擔，沒有辦法好好的運用他們去實現你的想法。&lt;/p>
&lt;p>所以一次聚焦一樣目標，如果你要從零開始學習寫程式，就從 Python 開始吧！等你掌握了「寫程式」這件事，學習別的應用才會順利許多。&lt;/p>
&lt;hr>
&lt;p>&lt;img src="./enjoy-learning.png" alt="Enjoy Learning">&lt;/p>
&lt;p>將任務分解、在使用前&lt;strong>先熟悉工具&lt;/strong>、限制一次需要學習的概念數量，這三個方法，不論你是什麼階段的開發者，都能夠受用，讓你更享受寫程式的過程。&lt;/p>
&lt;p>有經驗的開發者，就是累積了大量使用工具的經驗，與不同的領域知識，使得他們能夠活用這些知識與經驗，去解決眼前的問題。&lt;/p>
&lt;p>不論你現在正處於學習階段，還是已經有一定經驗，希望這三個方法能幫助你享受程式設計的美好時光，一起在創作中獲得更多樂趣！&lt;/p></description></item><item><title>租主機也是別人的電腦？實體伺服器已經過時？ | 頻道內容規畫 &amp; 回應留言</title><link>http://indie.tw/blog/schedule/</link><pubDate>Tue, 07 Feb 2023 16:34:38 +0800</pubDate><guid>http://indie.tw/blog/schedule/</guid><description>&lt;p>我要謝謝大家的支持，在上集影片我得到許多的回饋，我原本以為這是個很小眾的主題，所以很驚訝頻道在短時間就突破 2000 訂閱，知道有非常多人喜歡給了我很大的動力。同時也要請大家包容，由於我是一個人製作，更新速度會比較慢。這兩週來，我也一直在煩腦頻道內容取向的問題，我知道很多人想看操作教學，但如果只拍教學，只有本來就對此有興趣的人會想看，而達不到我希望推廣給更多人的初衷。但如果只拍介紹，有興趣的人可能也找不到方法入門。這兩種觀看情境基本上完全相反。因此我規畫將介紹跟實戰分成兩部影片，一集介紹影片會搭配一集實戰影片。介紹影片會以講故事、介紹知識為主，適合你配飯吃。而實戰影片就會盡可能短，不講廢話，適合你一邊看一邊操作。&lt;/p>
&lt;p>再來要回覆一些上集收到的留言。我在上集影片提到，如果你的環境不允許，可以租別人的主機來當作伺服器，有人質疑說租主機也是別人的電腦，我完全同意，但跟完全沒有主機相比，有一台主機還是比較好，因為你可以自己選擇要安裝什麼軟體，你的檔案要怎麼存，根據你的需求客製化調整。同時主機商之間的替換性也很高，如果你的主機商變貴或是變邪惡了，你要換到另一台主機商，基本上只要把資料遷移過去再設定一下系統，不會有什麼大問題。相對的，如果你都是使用別人提供的服務，很多時候光是把自己的檔案帶走都非常困難。&lt;/p>
&lt;p>此外我也有看到許多留言有提到說：現在是雲端的時代，企業在部署通常是用容器化管理，一鍵就能擴展，架實體伺服器已經過時了。對此我想回應一下：我這個頻道的並不是針對企業，而是個人使用的伺服器，也就是說使用者基本上只會有你跟你的家人、朋友，因此流量、擴展性都不是大問題，但資安這塊，如同很多朋友提醒，仍然是需要謹慎處理的。&lt;/p>
&lt;p>我認為架伺服器如果類比成做菜，我們這樣手工架實體伺服器就像是手作料理，而雲端容器化管理就像是工廠大量生產食品。這個時代你用手工作一定比不贏別人工廠大量生產，如果今天你要開公司，當然要去用雲端。但我們並不是要開公司，只是要做菜給自己和家人吃，在這樣的情況下，自己做菜還是非常有價值的，相對的為此去開一整條產線就有些 overkill 了。&lt;/p>
&lt;p>如同現代人長期外食，而造成許多慢性病一樣，我們長期依賴科技公司而對自己的資料毫無掌控權，也會得到資訊的慢性病，等你有一天發現時，自己已經病入膏肓。我頻道的目的，是讓每個人都能學會基本的做菜技術，讓你能選擇要吃些什麼，而不會只能吃工廠生產出來的東西。如果有一天這些工廠變得邪惡，你才有能力照顧好自己跟家人。&lt;/p></description></item><item><title>實戰 Ubuntu Server 安裝</title><link>http://indie.tw/tutorials/ubuntu-server/</link><pubDate>Fri, 03 Feb 2023 09:43:34 +0800</pubDate><guid>http://indie.tw/tutorials/ubuntu-server/</guid><description>&lt;h2 id="事前準備">事前準備&lt;/h2>
&lt;ul>
&lt;li>一台用來操作的電腦&lt;/li>
&lt;li>一台用來安裝的電腦（會清空所有資料）&lt;/li>
&lt;li>一個 USB（會清空所有資料）&lt;/li>
&lt;li>兩台電腦能同時使用一個網路（以太網路、WiFi），最後才能從內網連線&lt;/li>
&lt;/ul>
&lt;h2 id="製作開機-usb">製作開機 USB&lt;/h2>
&lt;h3 id="下載-iso">下載 ISO&lt;/h3>
&lt;p>ISO 檔你可以想像是把一個硬碟封裝在一個檔案裡，裡面包含了一整個作業系統，我們開機時選用灌入這個 ISO 檔的 USB，就能夠進入 Ubuntu 的安裝程序了。&lt;/p>
&lt;p>首先，我們到 &lt;a href="https://ubuntu.com/download/server">ubuntu&lt;/a> 官網下載 ISO 檔，我們選擇 Server 版本，下載 Ubuntu Server 22.04 LTS 長期支援版。&lt;/p>
&lt;p>&lt;img src="./download-ubuntu.jpg" alt="download ubuntu">&lt;/p>
&lt;h3 id="ventoy">Ventoy&lt;/h3>
&lt;p>因為 ISO 目前是存在我們電腦的硬體裡，沒辦法直接拿來開機，因此我們要將 ISO 放到 USB 中，我會使用的燒錄程式是 &lt;a href="https://ventoy.net">Ventoy&lt;/a>，Ventoy 可以讓你在一個 USB 存入多個 ISO 檔，完整利用你的儲存空間，方便你試用不同的發行版。到 &lt;a href="https://github.com/ventoy/Ventoy/releases">Ventoy 下載頁面&lt;/a>，選擇你&lt;strong>正在使用的作業系統&lt;/strong>下載。&lt;/p>
&lt;p>Mac 使用者可以參考 Ubuntu 的&lt;a href="https://ubuntu.com/tutorials/create-a-usb-stick-on-macos#1-overview">官方文件&lt;/a>&lt;/p>
&lt;p>&lt;img src="./download-ventoy.jpg" alt="download ventoy">&lt;/p>
&lt;p>插入你的 USB，解壓縮後執行 Ventoy2Disk，選擇你的 USB 裝置（&lt;strong>注意不要選到你的硬碟！&lt;/strong>），按 Install。&lt;/p>
&lt;p>&lt;img src="./use-ventoy-1.jpg" alt="use ventoy">&lt;/p>
&lt;p>接著從你的檔案管理員，打開這個 USB（它應該會叫作 Ventoy），把剛剛下載的 ISO 檔複製到 USB 裡，完成後請一定要按退出，不然可能會沒寫入成功。這樣子我們就完成開機 USB 了。（圖片中有很多 ISO 檔是我其他時候存的）&lt;/p>
&lt;p>&lt;img src="./use-ventoy-2.jpg" alt="use ventoy">&lt;/p>
&lt;h2 id="開機設定">開機設定&lt;/h2>
&lt;p>接著我們將 USB 插入到要拿來當伺服器的電腦，按下開機，在開機時會有一個很快的畫面，上面會告訴你選擇開機裝置的快捷鍵，在我這台電腦上是 F12。&lt;/p>
&lt;p>&lt;img src="./boot-shortcut.jpg" alt="boot shortcut">&lt;/p>
&lt;p>請快速的按這個快捷鍵（可以多按幾下），就會打開一個開機選單，選擇你的 USB 按 Enter 開機。接著就會進到 Ventoy 的畫面，裡面會列出所有在你 USB 中的 ISO 檔，選擇 Ubuntu Server 按 Enter。&lt;/p>
&lt;p>&lt;img src="./boot-menu.jpg" alt="boot menu">&lt;/p>
&lt;p>&lt;img src="./ventoy-menu.jpg" alt="ventoy menu">&lt;/p>
&lt;p>&lt;details>
&lt;summary>我叫不出開機選單怎麼辦？&lt;/summary>
你需要上網查詢你的電腦型號使用的開機選單快捷鍵是什麼。另外從 Windows 10 開始，開機選單預設是被關閉的，你需要進到 Windows 的&lt;code>設定/復原/進階重新啟動&lt;/code>來選擇你的 USB 開機。
&lt;/details>
&lt;details>
&lt;summary>開機選單中沒有我的 USB&lt;/summary>
你可能需要進到 BIOS 設定中，將 Secure Boot 關閉，再重試一次。
&lt;/details>&lt;/p>
&lt;h2 id="安裝-os">安裝 OS&lt;/h2>
&lt;p>接著我們要開始作業系統的安裝，為了讓你能看得更清楚，我會改用虛擬機的安裝畫面。首先要選擇語言，我們用 English，它問你要不要更新安裝程序，我們選不要，鍵盤佈局保留預設，安裝選項保留預設。&lt;/p>
&lt;p>&lt;img src="./os-1.jpg" alt="os">&lt;/p>
&lt;h3 id="設定網路">設定網路&lt;/h3>
&lt;p>設定網路這裡如果你是用以太網路，那它就會自動連線了，這邊我建議你可以先設定一個靜態 IP，讓你之後要連線到伺服器有個固定的位址。&lt;/p>
&lt;p>&lt;img src="./os-network.jpg" alt="os network">&lt;/p>
&lt;p>請看它給你的 IP 地址，以我的為例：&lt;code>192.168.1.103/24&lt;/code>，這邊 &lt;code>/&lt;/code> 前面的 &lt;code>192.168.1.103&lt;/code> 是你的 IP 地址，而後面的 &lt;code>24&lt;/code> 則是子網路遮罩，代表前 24 位元是你的網路位址（一個 IP 有 32 位元，前 24 位元就是前 3 個數字），也就是 &lt;code>192.168.1&lt;/code>，請記下這個網路位址。&lt;/p>
&lt;p>&lt;img src="./os-network-ip.jpg" alt="os network ip">&lt;/p>
&lt;p>接著我們 Edit IPv4，選擇手動 Manual，在 Subnet 填入 &lt;code>[你剛剛的網路位址].0/[子網路遮罩]&lt;/code>，以我的為例就是 &lt;code>192.168.1.0/24&lt;/code>，在 Address 填入在你的網路位址底下一個沒有人用、好記的 IP，在這裡我用 &lt;code>192.168.1.10&lt;/code>。Gateway 在一般家用伺服器多半就是 &lt;code>[網路位址].1&lt;/code>，以我為例是 &lt;code>192.168.1.1&lt;/code>，DNS 伺服器我習慣使用 Cloudflare &lt;code>1.1.1.1,1.0.0.1&lt;/code>。Search Domain 這欄我們先留空。點擊 OK 完成。&lt;/p>
&lt;p>&lt;img src="./os-network-manual.jpg" alt="os network setting">&lt;/p>
&lt;p>代理伺服器留空，鏡像伺服器保持預設。&lt;/p>
&lt;p>&lt;details>
&lt;summary>我手動設定後連線失敗了&lt;/summary>
如果你在手動設定網路後連線失敗了，可能你的路由器強制要使用自動分配的 IP，或是你的某些參數設定錯誤，那你可以先調整回自動 &lt;code>Automatic (DHCP)&lt;/code>，並記下自動分配的 IP，稍後到路由器設定 IP 綁定。但這個方法不太建議，我以前一開始也是這樣設，但後來換了一台路由器，所有機器的 IP 都跑掉，帶來一場災難。
&lt;/details>
&lt;details>
&lt;summary>我用手機網路&lt;/summary>
如果你是用手機分享網路，從 Android 8 開始，都會使用隨機的網路位址跟閘道，因此你沒辦法設定靜態 IP，只能使用自動分配，這在未來也會給你帶來很多管理上的麻煩，因此不太建議。
&lt;/details>&lt;/p>
&lt;h3 id="硬碟分割">硬碟分割&lt;/h3>
&lt;p>接著進到硬碟分割，我預設你這邊只使用一顆硬碟。我們選擇 &lt;code>Use an entire disk&lt;/code>，並取消勾選 &lt;code>Set up this disk as an LVM group&lt;/code>，LVM 是一個邏輯分割硬碟的系統，但有些複雜，因此除非你知道你在做什麼，否則我們先取消它。&lt;/p>
&lt;details>
&lt;summary>我有多顆硬碟&lt;/summary>
&lt;p>Linux 跟 Windows 不一樣，並沒有所謂 C 槽或 D 槽，所有檔案都是位在根目錄 &lt;code>/&lt;/code> 底下，而我們可以將硬碟掛載到根目錄下的任何一個目錄，因此你在存檔案時也不用特別將檔案存到不同的其他地方。在伺服器上。
當你有多顆硬碟，你可以選擇將其掛載在不同的資料夾，在伺服器上 &lt;code>/var&lt;/code> 是儲存應用程式的資料的地方，如你的 database、使用者上傳的檔案；此外 &lt;code>/home&lt;/code> 是使用者的家目錄資料夾，也可以考慮。此外，如果你是有兩顆一樣的硬碟，也可以考慮組成磁碟陣列 RAID，但這比較進階。&lt;/p>
&lt;p>Ubuntu Server 上的硬碟分割可以參考 Ubuntu &lt;a href="https://ubuntu.com/server/docs/install/storage">官方文件&lt;/a>&lt;/p>
&lt;/details>
&lt;p>&lt;img src="./os-disk.jpg" alt="disk partition">&lt;/p>
&lt;p>最後進入確認，你硬碟上原有的所有資料都會被刪除，請確保你有備份重要資料。&lt;/p>
&lt;p>接下來設定你的使用者名稱，主機名稱（在未來可以修改），選擇你的 username，這邊要全部英文小寫，設定一個密碼，請儘量使用高強度密碼。&lt;/p>
&lt;p>&lt;img src="./os-username.jpg" alt="username">&lt;/p>
&lt;p>再來要勾選 &lt;code>Install OpenSSH Server&lt;/code>，我們才能從別台電腦連線上來操作。&lt;code>Import SSH indentity&lt;/code> 跳過。&lt;/p>
&lt;p>&lt;img src="./os-ssh.jpg" alt="ssh">&lt;/p>
&lt;p>接下來可以選你要裝哪些 Snap 軟體，全部留空按 Done，我們就會開始安裝。&lt;/p>
&lt;p>等待安裝完成，點擊 &lt;code>Reboot Now&lt;/code>，等待出現 &lt;code>Please remove the installation medium, then press ENTER:&lt;/code>，拔掉 USB，按 Enter，完成重開機，我們的安裝就完成了。&lt;/p>
&lt;p>&lt;img src="./os-reboot.jpg" alt="os reboot">&lt;/p>
&lt;h2 id="測試-ssh-登入">測試 SSH 登入&lt;/h2>
&lt;p>接著我們要從別台電腦連入伺服器，打開你的終端機（在 Windows 上叫作 cmd），輸入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">ssh &lt;span class="o">[&lt;/span>你的使用者名稱&lt;span class="o">]&lt;/span>@&lt;span class="o">[&lt;/span>你的伺服器 IP&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以我為例，就是&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">ssh indie@192.168.1.10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>輸入密碼後就能夠登入到伺服器中。&lt;/p>
&lt;p>&lt;img src="./ssh-login.jpg" alt="ssh login">&lt;/p>
&lt;hr>
&lt;p>以上就是今天的 Ubuntu Server 安裝教學，如果你在安裝時有任何問題，歡迎到我們的論壇提問。如果這樣的影片有幫助到你，歡迎到我們的官網 indie.tw，訂閱我們的電子報，讓你不受演算法控制，掌握自由最新情報。我們下集見！&lt;/p></description></item><item><title>一場版權官司如何改變軟體產業：Linux 的稱霸之路</title><link>http://indie.tw/docs/linux-history/</link><pubDate>Tue, 31 Jan 2023 16:31:37 +0800</pubDate><guid>http://indie.tw/docs/linux-history/</guid><description>&lt;p>作業系統，一個我們既熟悉又陌生的存在，它好像很重要，卻又不完全清楚它究竟做了什麼。在今日，桌面電腦的作業系統由 Windows 與 Mac OS 所把持，然而伺服器卻完全是另外一番風景，超過 90% 的伺服器都是運作在一個你可能沒聽過的作業系統——Linux，而 Linux 甚至還是免費的！今天我要告訴你 Linux 是如何掘起，成為伺服器的霸主。&lt;/p>
&lt;h2 id="linux-簡史">Linux 簡史&lt;/h2>
&lt;p>作業系統（Operating System，簡稱 OS），是運行在電腦上，負責主管應用程式與硬體之間溝通的系統。為什麼需要作業系統呢？我們每個人的電腦都不一樣，有著不同的 CPU、記憶體、硬碟、網路卡，如果說沒有作業系統，寫程式的人就得要自己去控制所有硬體，那只要使用者換了新的硬體，你舊的程式就沒辦法跑。因此作業系統誕生了，我們由作業系統去連接所有的硬體，並提供系統呼叫（System Call）來讓應用程式跟硬體互動。這樣一來，當有新的硬體出現，只要作業系統支援，應用程式不用修改就可以直接在新硬體上運作。&lt;/p>
&lt;p>從 1940 年代第一台電腦的發明以來，電腦領域就是非常熱門的發展重點。1969 年，貝爾實驗室發明了 UNIX 作業系統，UNIX 由於其優秀的系統設計與多人、多工能力，成為了大型主機的主流系統，直至今日，工程師仍相當推崇「UNIX 哲學」。在當時 AT&amp;amp;T 以低廉的許可將 UNIX 程式碼授權給美國的大學使用，而各大學也在 UNIX 的原始碼上做了許多擴充與改進，成為了「UNIX 變種」，其中最著名的就是柏克萊加州大學所開發的 BSD。然而 AT&amp;amp;T 後來意識到了 UNIX 的商業價值，便不再授權給學術機構，還對 BSD 等 UNIX 變種進行版權宣告，後來演變成了一場長期的官司。&lt;/p>
&lt;p>1983 年，Richard Stallman 發起了 GNU 計畫及自由軟體運動，希望打造一個能不受限制的自由作業系統，希望不要再有像 UNIX 的事發生。你說 GNU 是什麼意思？GNU 是 GNU is Not UNIX 的縮寫，其中的 GNU 是 GNU is Not UNIX 的縮寫……GNU 計畫開始後，開發了許多系統的重要組件，好比編輯器、編繹器（將程式碼轉換成執檔的程式）、以及 shell，唯獨缺了一個系統核心。當時 BSD 仍在跟 AT&amp;amp;T 打官司，而 GNU 的核心開發又遇到許多困難而停滯不前。&lt;/p>
&lt;p>到了 1991 年，芬蘭赫爾辛基大學的一位電腦科學學生 Linus Torvalds，因為不滿當時沒有一個可以自由使用的作業系統，於是就參考 UNIX 的架構，著手自己寫了一個核心（是個狠人），並將原始碼發佈在網路上，取名為 Linux。Stallman 在知道此事之後，便找上 Torvalds，邀請他將 Linux 以 GNU 提出的 GPL 自由軟體授權發佈，Linux 也使用 GNU 開發好的各種組件，組成了一個完整的作業系統，因此 Linux 的又叫作 GNU/Linux，但為求方便，我們一樣將其簡稱為 Linux。&lt;/p>
&lt;p>歷經 30 年的發展，如今 Linux 已經取代 UNIX 成為伺服器的主流，以及各種小型電腦，如手機和路由器，都廣泛的使用 Linux。同時，自由軟體運動的發展也深深的改變了整個軟體產業，如今已成為了軟體開發的主流。工程師不再需要從頭開發所有功能，可以使用大量的自由軟體來完成，而這些自由軟體也在大家的共同努力下不斷進步，讓軟體產業成為了一個充滿創新且進展飛速的領域。&lt;/p>
&lt;h2 id="linux-與它的發行版">Linux 與它的發行版&lt;/h2>
&lt;p>當我們說「我在使用 Linux」時，其實是指「我在使用 Linux 發行版」（distribution）。Linux 本身只是一個核心，還需要搭配許多軟體才能構成完整的作業系統。因為 Linux 自由且開放的性質，任何人都可以建立自己的發行版，如今世界上有超過 600 個針對不同目的與需求開發的發行版，而 Linux 發行版也可能因為需求而包含一些專有軟體。&lt;/p>
&lt;p>三大重要的發行版家族：&lt;/p>
&lt;ol>
&lt;li>Debian：由社群開發的發行版，特色是自由穩定，每個版本會有五年的支援期，軟體倉庫嚴格的區分自由軟體與專有軟體。當今最主流的發行版 Ubuntu 就是屬於 Debian 家族，而 Linux Mint、Pop!_OS 等發行版則又是基於 Ubuntu 之上。&lt;/li>
&lt;li>Red Hat：由紅帽公司所開發的發行版 Red Hat Enterprise Linux，特色是有商業支援的服務，常被企業伺服器所採用。其中針對個人使用的發行版為 Fedora。此外採用 RPM 包管理系統的還有 CentOS、openSUSE 等發行版。&lt;/li>
&lt;li>Arch Linux：同樣為社群開發的發行版，跟 Debian 不同的是，Arch Linux 採取滾動式更新，並沒有「版本」，直接從上游開發者取得最新的程式碼，並且對專有軟體比較寬鬆，可以直接從軟體倉庫安裝專有軟體。軟體更新最快，但你知道的……新軟體 bug 會比較多，你也需要自己解決比較多的問題。對比較有經驗的使用者而言，很可能是最適合桌面使用的發行版。現在很流行的發行版 Manjaro 跟 EndeavourOS 都是基於 Arch Linux。&lt;/li>
&lt;/ol>
&lt;p>世界上並沒有所謂「最好的發行版」，不同的發行版有不同的特色，在你有不一樣的需求、技術實力，或甚至在不同的人生階段，都會有一個最適合你當下的選擇，像極了愛情。「哪個發行版最好」，十個工程師，你大概會得到 12 個答案。光是我和夥伴內部討論，就吵了一整個星期，我不希望在第二部影片就開戰，但遺憾的是我終究還是得選一個開始。考量穩定性、熱門度、使用體驗的多個面向，在往後的教學我會使用 Ubuntu Server 作為伺服器的作業系統。&lt;/p>
&lt;p>我自從 2017 年，在我家的一台老電腦上安裝了我的第一台 Ubuntu，從此踏入了 Linux 與 self-hosting 的圈子，後來也一路嘗試了各式各樣的不同發行版，最頻繁的時期甚至兩個月就換一個發行版。我不認為 Ubuntu 是最好的發行版，但它確實適合入門，不會讓你在第一次使用，還懵懵懂懂時就被嚇壞而不敢再嘗試。當你有了基礎後，我相信你自然而然會去尋找更合你胃口的發行版。&lt;/p>
&lt;p>除了伺服器以外，Linux 也非常適合在桌面環境中使用，我自己從 2017 年以來也完全使用 Linux 作為我的桌面系統。關於 Linux 桌面環境，我們也會在未來的影片介紹。&lt;/p>
&lt;p>在下一篇文章是 Ubuntu Server 實體電腦安裝教學，準備好你的舊電腦，我們下次見！&lt;/p></description></item><item><title>為什麼你應該架自己的伺服器</title><link>http://indie.tw/docs/intro/</link><pubDate>Tue, 13 Dec 2022 08:40:00 +0800</pubDate><guid>http://indie.tw/docs/intro/</guid><description>&lt;h2 id="我的檔案在哪裡">我的檔案在哪裡&lt;/h2>
&lt;p>你知道你的手機，到底把你的檔案都存在哪嗎？在使用手機的世代，我們似乎已經失去了管理檔案的習慣。你的檔案，並不是存在你的手機裡，而是在各個「App」、「雲端服務」之中，手機裡的檔案反而只是一份「快取」，沒有整理又殘缺不全，「反正要找的時候再重新下載就好了嘛」。&lt;/p>
&lt;p>現代的手機，已經淪為雲端服務的終端，而不再是一部獨立的設備。科技公司在設計產品時以「簡化操作」之名，一點一滴的偷走你的掌控權。當你今天沒有了網路連線、或是 Google、Apple 刪除了你的帳號，你手上的這支手機不論再高階也無法使用。&lt;/p>
&lt;p>網際網路在這十年來，經歷了非常糟糕的發展。科技巨頭們逐漸地控制著使用者，使人無法離開它們的產品。我們可以預期，若照這個發展持續下去，未來的人們將會連「檔案」是什麼都不知道，一輩子深陷於科技公司的控制，成為資訊世代的奴隸。&lt;/p>
&lt;h2 id="網路本是自由的">網路本是自由的&lt;/h2>
&lt;p>網際網路原本在設計的時候，就是一個去中心化而自由的系統。任何人都可以用自己的電腦去架設網站、提供服務。在網際網路初期，人們用自己的電腦架設部落格，造訪朋友的網站，那就是被我們稱作 Web 1 的時代。這是個美好的時代，沒有一個主宰一切的中心，網站之間用超連結彼此連接著，沒有演算法在控制你能看到什麼。然而這樣的時代，有著較高的技術門檻，同時人們也渴望更多的互動。因此出現了社群網站，使用者從自己的網站，改到一個特定的網站上去發內容，人與人之間的互動因此變得更加緊密，使用者也不再需要自己管理網站。&lt;/p>
&lt;p>然而社群網站為了商業利益，希望使用者都集中在自己的平台上，因此開始變得封閉，不再支援標準協議，想透過網路效應，來逼所有人都得用它。&lt;/p>
&lt;p>到了手機的年代，情況變得更加惡化。手機有限的硬體，使得它不能像電腦長時間開著，也不能儲存大量的檔案，因此需要「雲端服務」，手機變成只是個操作的終端。而「雲端」說白了就是別人的電腦，你將資料交給別人幫你儲存，讓你可以隨時隨地透過網路存取。&lt;/p>
&lt;p>使用別人的電腦，等同交出了自己的主控權，你得任憑對方改變服務條款、收費，養套殺的技倆隨處可見。當這些科技公司成長到幾十億人的規模，它們也不在乎損失幾十萬個客戶，因為演算法偵測到「違法內容」而被刪除帳號的事件每年都有幾萬起，也不會有真人客服為你處理冤枉的案件。&lt;/p>
&lt;p>現在的使用者，已經淪為如中世紀的農奴一般，在封閉的莊園內，為領主生產資料，然而自己的所有財產都被人把持。&lt;/p>
&lt;h2 id="自己來架伺服器">自己來架伺服器&lt;/h2>
&lt;p>現在社會大量依賴行動裝置，因此幾乎無法避免去使用雲端服務，那最好的作法，就是&lt;strong>擁有自己的伺服器&lt;/strong>。我們講「雲端」是別人的電腦，那其實所謂「伺服器」也就只是一台「開著的電腦」。你只要放一台電腦在可以被網路連到的地方，安裝一些適當的軟體，它就可以作為一台伺服器，就是這麼簡單。&lt;/p>
&lt;p>一部個人使用的伺服器，因為不需要驅動螢幕及跑很耗資源的程式，需要的規格其實比你一般在用的電腦還要低。只要拿一台十年內的舊電腦，或是買一台 3000 塊樹梅派，就能當作你的伺服器。如果你家中沒有穩定的網路，也可以考慮租主機，最低只要每個月 5 美元就能開始。&lt;/p>
&lt;p>你可能會想：我有硬體了，那軟體該怎麼辦？該不會要會寫程式吧？恭喜你，在 21 世紀，世界上已經有著成千上萬、由志願者們共同開發的自由軟體。自由軟體是開放原始碼，允許你自由的使用、編輯、再發佈的軟體。說白話就是這些軟體你都可以免費用，不會有廣告、追蹤器，你覺得不好用還可以自己改，改完還可以發表你的修訂版到網路上。自由軟體就是透過這樣開放的性質，讓全世界的開發者們一同協作，在幾十年間，創造了許多偉大的作品。其中最重要的，莫過於自由的作業系統——Linux。Linux 和 Windows、Mac OS 一樣，都是一種作業系統，但它全部由自由軟體所組成。全世界超過 90% 的伺服器都是運行在 Linux 上，我們手上所拿的 Android 手機，背後也是基於 Linux，還有你家裡的路由器、公車上的刷卡機等等，也通通是在 Linux 上運行的。&lt;/p>
&lt;p>所以架伺服器會很花錢嗎？一點也不會，只要拿家裡的舊硬體，搭配上先進又安全的自由軟體，就能有一台完全由你掌控的伺服器！&lt;/p>
&lt;h2 id="我們會架些什麼">我們會架些什麼&lt;/h2>
&lt;p>最一開始，要先讓你拿回自己的檔案。我會介紹 Nextcloud 這套自由的雲端硬碟系統。Nextcloud 有著像 Google Drive、iCloud 一般的介面，讓你可以上傳檔案、分享給別人，不論在電腦或手機上都可以使用。更厲害的是，Nextcloud 還可以安裝各式各樣的 App，讓你能管理行事曆、通訊錄、建立表單、寫筆記、收發 email，甚至可以在上頭傳訊息跟開視訊會議！只要有 Nextcloud，馬上就能幫你換掉一大堆專有服務。&lt;/p>
&lt;p>再來我也會教你怎麼「做個自己的網站」。在這個時代，經營個人品牌越來越重要，有沒有個人網站對你的形象有著非常大的差別。我會教你怎麼使用 Hugo 這套工具，自己建立一個靜態網站，讓你有個載入飛快、輕量的網站，而且能像數位發展部一樣，部署到當今最潮的去中心化網路 IPFS 上，讓你的網站不怕對岸的 DDoS 攻擊。&lt;/p>
&lt;p>我還會教你如何架設自己的 Email 伺服器、視訊會議系統 Jitsi、端到端加密的即時通訊軟體 Matrix、自己的搜尋引擎 SearX 讓你的搜尋記錄不再被監視。&lt;/p>
&lt;hr>
&lt;p>在這個時代，我們深深的依賴著科技巨頭，被演算法決定能看到什麼，雖然情況看起來糟透了，但我們也有了最強的武器——自由軟體。因為有 Richard Stallman 等人從 1980 年代開始的自由軟體運動，到了 2022 年，我們已經有許多成熟、功能更勝於專有軟體的自由軟體。&lt;/p>
&lt;p>為什麼我會開始架伺服器，除了為了更好的隱私、獨立性，其實最大的原因是很好玩！架這些軟體，你不需要會寫程式，只要幾分鐘的時間，你就可以自己跑一個很厲害的系統給自己用，你會發現，其實生活裡要用到的大部分服務，都可以自己來跑！這個過程就像是在慢慢蓋一棟自己的房子，但是裡面的家具通通不用錢！&lt;/p>
&lt;p>你也心動了嗎？那就跟我一起來架伺服器吧！讓我們靠著自由軟體，成為網路時代屹立不搖的獨立個體。&lt;/p></description></item></channel></rss>