<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>艾德的部落格天空</title>
	<atom:link href="https://edblog.net/feed" rel="self" type="application/rss+xml" />
	<link>https://edblog.net</link>
	<description>在 AI、App 與生活之間，記錄每一次實驗</description>
	<lastBuildDate>Wed, 03 Jun 2026 05:54:44 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
<site xmlns="com-wordpress:feed-additions:1">113526021</site>	<item>
		<title>我用 Vibe Coding 開發 App 半年的真實心得</title>
		<link>https://edblog.net/archives/3875</link>
					<comments>https://edblog.net/archives/3875#respond</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Sun, 31 May 2026 15:44:42 +0000</pubDate>
				<category><![CDATA[AI 開發筆記]]></category>
		<category><![CDATA[AI 寫程式]]></category>
		<category><![CDATA[AI 開發]]></category>
		<category><![CDATA[Android 開發]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[App 開發]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Codex]]></category>
		<category><![CDATA[Flutter]]></category>
		<category><![CDATA[Flutter App]]></category>
		<category><![CDATA[Gemini]]></category>
		<category><![CDATA[GitHub Copilot]]></category>
		<category><![CDATA[Google Play]]></category>
		<category><![CDATA[iOS 開發]]></category>
		<category><![CDATA[Vibe Coding]]></category>
		<category><![CDATA[個人開發者]]></category>
		<category><![CDATA[獨立開發]]></category>
		<category><![CDATA[程式開發心得]]></category>
		<category><![CDATA[雙平台 App]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3875</guid>

					<description><![CDATA[大約從生成式 AI 開始普及之後，我在工作上就逐漸習慣使用 AI 協助開發。 當時應該還沒有「Vibe Cod ... <a title="我用 Vibe Coding 開發 App 半年的真實心得" class="read-more" href="https://edblog.net/archives/3875" aria-label="Read more about 我用 Vibe Coding 開發 App 半年的真實心得">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>大約從生成式 AI 開始普及之後，我在工作上就逐漸習慣使用 AI 協助開發。</p>
<p>當時應該還沒有「Vibe Coding」這個說法，但實際上的做法已經很接近：先用文字說明需求，讓 AI 協助規劃與撰寫程式，再由自己進行測試、驗收與修正。</p>
<p>過去一年多，我在 Web 前後端開發上已經大量採用這種模式。</p>
<p>到了去年九月，我開始嘗試把相同的方法用在 Flutter App 開發。</p>
<p>半年過去，陸續完成了幾款工具 App、休閒遊戲、網站與後端服務，也曾經挑戰過超出自己能力範圍的遊戲專案。</p>
<p>有些作品大約一週就能完成並上架，也有專案投入兩個月後，最後還是選擇暫停。</p>
<p>這篇文章不是要討論 AI 能不能取代工程師，而是單純記錄我實際使用 Vibe Coding 開發 App 半年之後，對這種開發方式的理解。</p>
<h2 id="%e5%be%9e%e4%b8%80%e6%ac%be%e9%a1%9e%e4%bc%bc-2048-%e7%9a%84%e5%b0%8f%e9%81%8a%e6%88%b2%e9%96%8b%e5%a7%8b">從一款類似 2048 的小遊戲開始</h2>
<p>我第一款使用 Flutter 製作的遊戲，是一款玩法類似 2048 的休閒遊戲。</p>
<p>由於規則不算複雜，主要就是處理方塊移動、數值合併、分數計算與基本畫面呈現。</p>
<p>在 AI 協助之下，從建立專案、完成主要功能、調整畫面，到最後上架 Google Play，大約花了一週左右。</p>
<p>這次經驗讓我產生了一個有點危險的錯覺：</p>
<p><strong>既然簡單的遊戲可以完成，那麼複雜一點的遊戲，應該也只是多花一點時間而已吧？</strong></p>
<p>後來證明，事情完全沒有這麼簡單。</p>
<h2 id="%e5%89%9b%e8%b5%b0%e5%87%ba%e6%96%b0%e6%89%8b%e6%9d%91%ef%bc%8c%e5%b0%b1%e7%9b%b4%e6%8e%a5%e6%8c%91%e6%88%b0%e9%ad%94%e7%8e%8b">剛走出新手村，就直接挑戰魔王</h2>
<p>接下來，我開始規劃一款單機大富翁玩法的生存遊戲。</p>
<p>玩家可以擲骰子、在地圖上移動、觸發事件，也能加入多人聊天等功能。</p>
<p>一開始看起來，只要把每個功能拆開，逐步交給 AI 開發，似乎就有機會完成。</p>
<p>但真正開始製作後，我才發現遊戲開發和一般工具 App 完全不同。</p>
<p>除了功能本身，還需要處理：</p>
<ul>
<li>遊戲狀態管理</li>
<li>角色移動與地圖系統</li>
<li>畫面更新與動畫</li>
<li>事件觸發邏輯</li>
<li>操作手感</li>
<li>效能與裝置適配</li>
<li>遊戲 UI</li>
<li>美術資源</li>
<li>整體遊戲節奏</li>
</ul>
<p>Unity、Cocos Creator 或其他遊戲框架，也各自有一套需要理解的觀念。</p>
<p>後來我嘗試使用 Flutter 搭配 Flame 繼續製作，每天晚上花時間調整功能、修正錯誤與重新規劃。</p>
<p>大約持續兩個月之後，我決定先把專案停下來。</p>
<p>這次經驗讓我理解一件很重要的事：</p>
<p><strong>AI 可以協助你寫程式，但不會自動補上你缺少的領域經驗。</strong></p>
<p>如果連自己都還不清楚遊戲架構應該怎麼設計、哪些功能應該優先處理，AI 只會更快地幫你製造出一堆需要重構的程式碼。</p>
<p>自己重新造輪子，真的很可怕。</p>
<h2 id="%e5%be%8c%e4%be%86%e6%94%b9%e6%88%90%e5%85%88%e5%81%9a%e5%b0%8f%e5%9e%8b-app">後來改成先做小型 App</h2>
<p>遊戲專案暫停之後，我重新調整了開發方向。</p>
<p>與其一開始就挑戰龐大的系統，不如先從需求清楚、功能單純的小工具開始。</p>
<p>這些 App 不一定很複雜，但每一款都可以讓我熟悉不同問題：</p>
<ul>
<li>Flutter 的畫面與狀態管理</li>
<li>Android 與 iOS 的差異</li>
<li>多語系處理</li>
<li>內購與廣告</li>
<li>通知提醒</li>
<li>資料儲存</li>
<li>API 串接</li>
<li>Google Play 與 App Store 上架流程</li>
</ul>
<p>我也逐漸建立出比較適合自己的開發方式。</p>
<h2 id="%e6%88%91%e7%8f%be%e5%9c%a8%e4%bd%bf%e7%94%a8%e7%9a%84-vibe-coding-%e6%b5%81%e7%a8%8b">我現在使用的 Vibe Coding 流程</h2>
<p>目前我不太會直接叫 AI「幫我做一款 App」。</p>
<p>比較常用的方式是把專案拆成幾個階段。</p>
<h3 id="%e7%ac%ac%e4%b8%80%e6%ad%a5%ef%bc%9a%e5%85%88%e7%a2%ba%e8%aa%8d-app-%e8%a6%81%e8%a7%a3%e6%b1%ba%e4%bb%80%e9%ba%bc%e5%95%8f%e9%a1%8c">第一步：先確認 App 要解決什麼問題</h3>
<p>我會先整理最基本的需求：</p>
<ul>
<li>這款 App 是給誰使用？</li>
<li>它要解決什麼問題？</li>
<li>最重要的功能是什麼？</li>
<li>哪些功能可以晚一點再做？</li>
<li>第一個版本做到什麼程度就可以上架？</li>
</ul>
<p>這個階段很重要。</p>
<p>因為如果自己沒有想清楚，AI 也只會根據模糊的描述，做出一個看起來功能很多，但實際上很難使用的版本。</p>
<h3 id="%e7%ac%ac%e4%ba%8c%e6%ad%a5%ef%bc%9a%e5%85%88%e6%95%b4%e7%90%86%e6%96%87%e4%bb%b6%ef%bc%8c%e5%86%8d%e9%96%8b%e5%a7%8b%e5%af%ab%e7%a8%8b%e5%bc%8f">第二步：先整理文件，再開始寫程式</h3>
<p>確定方向後，我會先使用 ChatGPT 整理功能文件與開發順序。</p>
<p>接著再把文件交給 GitHub Copilot 或其他程式工具，讓 AI 先理解專案背景，再逐步進行開發。</p>
<p>比起每次臨時輸入一句指令，先準備一份相對完整的需求文件，通常會穩定很多。</p>
<h3 id="%e7%ac%ac%e4%b8%89%e6%ad%a5%ef%bc%9a%e6%8b%86%e6%88%90%e5%b0%8f%e5%8a%9f%e8%83%bd%ef%bc%8c%e9%80%90%e6%ad%a5%e5%ae%8c%e6%88%90">第三步：拆成小功能，逐步完成</h3>
<p>我不會一次要求 AI 完成整個專案。</p>
<p>通常會拆成：</p>
<ol>
<li>建立基礎專案架構</li>
<li>完成主要畫面</li>
<li>加入核心功能</li>
<li>處理資料儲存</li>
<li>加入次要功能</li>
<li>進行錯誤修正</li>
<li>準備上架</li>
</ol>
<p>一次處理一個階段，比較容易知道問題出在哪裡。</p>
<p>如果一次改太多東西，最後很容易連 AI 自己都不知道是哪個步驟造成錯誤。</p>
<h3 id="%e7%ac%ac%e5%9b%9b%e6%ad%a5%ef%bc%9a%e6%af%8f%e5%80%8b%e9%9a%8e%e6%ae%b5%e9%83%bd%e8%87%aa%e5%b7%b1%e6%b8%ac%e8%a9%a6">第四步：每個階段都自己測試</h3>
<p>這是我目前最重視的部分。</p>
<p>AI 很常會告訴你：</p>
<p>「功能已經完成。」</p>
<p>但實際測試之後，可能會發現：</p>
<ul>
<li>正常流程可以使用，但特殊情境會出錯</li>
<li>畫面看起來正常，但資料沒有正確儲存</li>
<li>Android 可以執行，但 iOS 出現問題</li>
<li>舊資料升級後無法讀取</li>
<li>按鈕可以點擊，但操作流程不符合直覺</li>
</ul>
<p>所以，即使 AI 已經寫完程式，我還是會自己逐一測試。</p>
<p>簡單來說，就是因為我信不過 AI。XD</p>
<h2 id="%e7%9b%ae%e5%89%8d%e4%bd%bf%e7%94%a8%e7%9a%84-ai-%e5%b7%a5%e5%85%b7">目前使用的 AI 工具</h2>
<h3 id="chatgpt-%e4%bb%98%e8%b2%bb%e7%89%88">ChatGPT 付費版</h3>
<p>ChatGPT 主要用來處理前期規劃、需求討論、文件整理、問題分析，以及圖片素材。</p>
<p>我也會使用它製作 App 內的圖片，以及 Google Play、App Store 上架時需要的視覺素材。</p>
<h3 id="vs-code-github-copilot-%e4%bb%98%e8%b2%bb%e7%89%88">VS Code + GitHub Copilot 付費版</h3>
<p>實際撰寫程式時，我主要使用 VS Code 搭配 GitHub Copilot。</p>
<p>一開始使用每月 20 美元的方案，後來升級到每月 39 美元的方案。</p>
<p>通常會先讓 Copilot 讀取文件與現有程式碼，再透過多輪對話逐步完成各項功能。</p>
<h3 id="gemini-%e4%bb%98%e8%b2%bb%e7%89%88">Gemini 付費版</h3>
<p>Gemini 主要作為備用工具。</p>
<p>當 ChatGPT 的回答不夠理想，或是希望比較不同模型的處理方式時，我會改用 Gemini 測試。</p>
<p>另外，有些圖片素材也會使用 Gemini 產出。</p>
<h3 id="codex-%e6%a1%8c%e9%9d%a2%e7%89%88">Codex 桌面版</h3>
<p>今年四月開始，我也加入 Codex 桌面版作為開發工具。</p>
<p>目前部分規劃、程式修改與問題排查，會直接交給 Codex 處理。</p>
<h3 id="claude-%e6%a1%8c%e9%9d%a2%e7%89%88">Claude 桌面版</h3>
<p>今年三月曾經試用 Claude 桌面版。</p>
<p>整體品質不錯，但額度消耗速度比較快，因此目前沒有作為主要工具。</p>
<h2 id="%e8%bf%91%e5%8d%8a%e5%b9%b4%e5%ae%8c%e6%88%90%e4%ba%86%e5%93%aa%e4%ba%9b%e4%bd%9c%e5%93%81%ef%bc%9f">近半年完成了哪些作品？</h2>
<p>近半年製作的作品，大多使用 Flutter 開發，並以支援 Android 與 iOS 雙平台為目標。</p>
<p>目前包含：</p>
<h3 id="clockwise%ef%bc%9a%e4%b8%96%e7%95%8c%e6%99%82%e9%90%98%e8%88%87%e6%9c%83%e8%ad%b0%e6%99%82%e9%96%93"><a href="https://edblog.net/archives/3816">Clockwise：世界時鐘與會議時間</a></h3>
<p>支援中文、英文、日文與韓文。</p>
<p>除了世界時鐘，也可以自訂時鐘顯示方式、調整時鐘速度，並比較多個地區的時間，方便安排跨時區會議。</p>
<h3 id="meetwhen">MeetWhen</h3>
<p>將跨時區會議安排功能獨立出來，製作成更單純的工具 App。</p>
<h3 id="%e4%b8%ad%e5%9c%8b%e8%b1%a1%e6%a3%8b"><a href="https://edblog.net/archives/3844">中國象棋</a></h3>
<p>支援中文與英文。</p>
<p>目前包含電腦對戰、雙人對弈、暗棋，以及不同難易度的殘局挑戰。</p>
<h3 id="%e5%90%b8%e8%a1%80%e9%ac%bc%e6%80%95%e6%80%95">吸血鬼怕怕</h3>
<p>這是最早完成的類 2048 休閒遊戲，也是我開始使用 Flutter 製作 App 的起點。</p>
<h3 id="%e5%85%94%e8%80%b3%e7%b5%b2%e6%97%a5%e5%b8%b8%e5%b7%a5%e5%85%b7%e5%b1%8b"><a href="https://edblog.net/archives/3860">兔耳絲日常工具屋</a></h3>
<p>支援中文、英文與日文，包含網站版與 App 版。</p>
<p>裡面收錄許多生活中可能會用到的小工具，例如今天吃什麼、誰去倒垃圾、今天誰洗碗、今天穿什麼，以及一些簡單的日常抽選功能。</p>
<p>網站版採用 Next.js，App 版則採用 Flutter。</p>
<p>雖然兩邊的功能類似，但因為技術架構不同，仍然需要分別重新實作。</p>
<h3 id="cyclenote%ef%bc%9a%e5%96%9d%e6%b0%b4%e8%88%87%e6%8f%90%e9%86%92%e7%b4%80%e9%8c%84"><a href="https://edblog.net/archives/3836">CycleNote：喝水與提醒紀錄</a></h3>
<p>支援中文、英文與日文。</p>
<p>這款 App 主要用來記錄喝水、定期事項，以及生活用品的更換與到期提醒。</p>
<h3 id="rootrees%ef%bc%9a%e5%ae%b6%e6%97%8f%e6%a8%b9%e8%88%87%e6%97%8f%e8%ad%9c%e7%b4%80%e9%8c%84"><a href="https://edblog.net/archives/3853">Rootrees：家族樹與族譜紀錄</a></h3>
<p>Rootrees 是目前規模較完整的一款 App。</p>
<p>它不只是手機 App，還包含後端 API、雲端資料同步與行銷網站。</p>
<p>這個專案也讓我遇到不少問題，尤其是家族關係、樹狀圖排列與 PDF 匯出。</p>
<p>由於先前已經另外寫過一篇完整的開發紀錄，這裡就不再重複介紹。</p>
<p>有興趣可以參考：</p>
<p><a href="https://edblog.net/archives/3853">Rootrees：我把家裡的舊族譜，做成一款家族樹 App</a></p>
<h3 id="abcb-studio">ABCB Studio</h3>
<p>ABCB Studio 是目前用來整理與介紹這些作品的網站：</p>
<p><a href="https://abcbstudio.cc/" target="_blank" rel="noopener">https://abcbstudio.cc/</a></p>
<p>網站一開始使用 WordPress 製作，後來重新規劃成 Next.js 版本，並部署在 Vercel。</p>
<p>從重新規劃到可以正常運作，大約花了半天時間。</p>
<p>這類需求清楚、架構相對單純的網站，也是 Vibe Coding 很適合發揮的場景。</p>
<h2 id="%e5%a4%9a%e8%aa%9e%e7%b3%bb%e8%88%87%e9%9b%99%e5%b9%b3%e5%8f%b0%ef%bc%8c%e6%af%94%e6%83%b3%e5%83%8f%e4%b8%ad%e8%8a%b1%e6%99%82%e9%96%93">多語系與雙平台，比想像中花時間</h2>
<p>完成 App 的主要功能之後，才會發現還有很多細節需要處理。</p>
<p>例如多語系。</p>
<p>一款 App 支援中文、英文與日文，不只是把文字丟給 AI 翻譯就結束。</p>
<p>還需要確認：</p>
<ul>
<li>翻譯是否符合當地常用說法</li>
<li>不同語言的文字長度是否影響排版</li>
<li>按鈕與畫面是否會超出範圍</li>
<li>App Store 與 Google Play 的介紹文案是否自然</li>
</ul>
<p>雙平台也有類似問題。</p>
<p>Flutter 可以讓 Android 與 iOS 共用大量程式碼，但不代表完成 Android 版本後，iOS 就能直接上架。</p>
<p>實際上，兩個平台的權限、登入方式、通知、內購、廣告與審核規範，都有不同的細節。</p>
<p>功能做完，只是第一步。</p>
<p>真正要讓 App 順利上架，還是需要逐項處理。</p>
<h2 id="vibe-coding-%e6%9c%80%e9%87%8d%e8%a6%81%e7%9a%84%e8%83%bd%e5%8a%9b%ef%bc%8c%e4%b8%8d%e5%8f%aa%e6%98%af%e4%b8%8b-prompt">Vibe Coding 最重要的能力，不只是下 Prompt</h2>
<p>使用 AI 開發一段時間後，我認為最重要的能力不是背誦多少 Prompt，也不是一次輸入多完整的指令。</p>
<p>真正重要的是：</p>
<ul>
<li>能不能把需求拆解清楚</li>
<li>能不能判斷 AI 的解法是否合理</li>
<li>能不能發現目前的架構已經開始失控</li>
<li>能不能知道哪些功能應該先做</li>
<li>能不能在錯誤方向投入太多時間之前，及時停下來</li>
</ul>
<p>有時候，AI 產出的程式可以正常執行，但架構並不好。</p>
<p>有時候，問題並不是程式碼寫錯，而是一開始的產品設計就不合理。</p>
<p>也有些時候，最好的選擇不是繼續叫 AI 修改，而是回到前一步，重新思考需求。</p>
<h2 id="%e7%9b%ae%e5%89%8d%e7%9a%84%e4%b8%8a%e6%9e%b6%e7%8b%80%e6%b3%81">目前的上架狀況</h2>
<p>目前 Google Play 上仍有七款 App：</p>
<p><a href="https://play.google.com/store/apps/dev?id=5436091753275953512" target="_blank" rel="noopener">Google Play 開發者頁面</a></p>
<p>iOS 設備是在今年五月取得，目前已經有五款 App 上架：</p>
<p><a href="https://apps.apple.com/us/developer/huichuan-lin/id1896711662" target="_blank" rel="noopener">App Store 開發者頁面</a></p>
<p>另外還有 App 正在送審，其他作品也會陸續處理 iOS 上架準備。</p>
<h2 id="%e7%b5%90%e8%aa%9e">結語</h2>
<p>回頭看這半年的開發過程，Vibe Coding 最大的價值，不是讓開發變成一件完全不用思考的事情。</p>
<p>它真正改變的，是驗證想法的成本。</p>
<p>以前想到一個 App，可能會因為時間、人力或技術問題，最後只停留在想法階段。</p>
<p>現在則可以先快速做出第一個版本，實際測試，再決定值不值得繼續投入。</p>
<p>但 AI 寫程式的速度越快，越需要知道自己要往哪裡走。</p>
<p>否則，很可能只是用更快的速度，製造更多需要修正的程式碼。</p>
<p>AI 可以幫忙寫程式。</p>
<p>但產品方向、需求拆解、測試驗收與最後的判斷，仍然需要自己負責。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3875/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3875</post-id>	</item>
		<item>
		<title>兔耳絲工具屋：當我突然不知道要開發什麼，就先做一個生活小工具集合</title>
		<link>https://edblog.net/archives/3860</link>
					<comments>https://edblog.net/archives/3860#respond</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Mon, 25 May 2026 14:39:55 +0000</pubDate>
				<category><![CDATA[App 開發實戰]]></category>
		<category><![CDATA[AI 開發]]></category>
		<category><![CDATA[Android App]]></category>
		<category><![CDATA[iOS App]]></category>
		<category><![CDATA[今天吃什麼]]></category>
		<category><![CDATA[兔耳絲工具屋]]></category>
		<category><![CDATA[實用 App]]></category>
		<category><![CDATA[獨立開發]]></category>
		<category><![CDATA[生活小工具]]></category>
		<category><![CDATA[選擇困難]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3860</guid>

					<description><![CDATA[使用 AI 協助開發一段時間之後，我曾經遇到一個有點意外的問題。 不是功能做不出來，也不是技術卡住。 而是突然 ... <a title="兔耳絲工具屋：當我突然不知道要開發什麼，就先做一個生活小工具集合" class="read-more" href="https://edblog.net/archives/3860" aria-label="Read more about 兔耳絲工具屋：當我突然不知道要開發什麼，就先做一個生活小工具集合">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>使用 AI 協助開發一段時間之後，我曾經遇到一個有點意外的問題。</p>
<p>不是功能做不出來，也不是技術卡住。</p>
<p>而是突然不知道下一個要做什麼。</p>
<p>前面幾個專案都有比較明確的原因。</p>
<p>CycleNote 是因為我常常忘記喝水、吃藥，也需要記錄一些定期更換的生活用品。</p>
<p>Rootrees 是因為家裡有早期留下來的族譜資料，想要做一個方便整理與匯出的家族樹 App。</p>
<p>中國象棋則是想嘗試切入休閒遊戲，從規則比較完整、容易理解的棋類遊戲開始。</p>
<p>但當這些專案陸續完成之後，我反而有一小段時間失去了目標。</p>
<p>加上白天工作已經長時間坐在電腦前面，回家之後偶爾也會想放鬆一下。打打遊戲、看看劇，其實也不錯。</p>
<p>於是，我決定先不要想得太複雜。</p>
<p>如果暫時沒有一個很大的產品題目，那就先做一些日常生活中可能會用到的小工具。</p>
<p>兔耳絲工具屋就是這樣開始的。</p>
<h3 id="%e4%b8%80%e9%96%8b%e5%a7%8b%e5%85%b6%e5%af%a6%e5%8f%aa%e6%98%af%e7%b6%b2%e7%ab%99%e7%89%88%e6%9c%ac">一開始其實只是網站版本</h3>
<p>兔耳絲工具屋最早不是 App，而是一個網站：</p>
<p><a href="https://rabbitears.cc/" target="_blank" rel="noopener">https://rabbitears.cc/</a></p>
<p>我想做一個簡單的生活小工具集合，讓使用者不需要登入，也不需要花時間研究操作方式，打開之後就可以直接使用。</p>
<p>有些工具只是幫忙做一個小決定，有些則是提供一點生活中的小樂趣。</p>
<p>它不是一個要解決重大問題的平台，也不是功能非常複雜的系統。</p>
<p>比較像是一個隨手可以打開的生活工具箱。</p>
<h3 id="%e7%82%ba%e4%bb%80%e9%ba%bc%e5%8f%ab%e5%81%9a%e5%85%94%e8%80%b3%e7%b5%b2%e5%b7%a5%e5%85%b7%e5%b1%8b%ef%bc%9f">為什麼叫做兔耳絲工具屋？</h3>
<p>一開始，我就不想讓它看起來像一個冷冰冰的工具網站。</p>
<p>很多工具類產品會使用比較正式的名稱與介面，但這個專案本來就不是為了工作效率，而是希望讓生活多一點輕鬆感。</p>
<p>因此，我幫它設計了一個兔耳角色。</p>
<p>當你不知道今天要吃什麼、想抽一個幸運數字，或只是需要有人幫忙做個決定時，就可以打開兔耳絲工具屋，看看兔耳絲會給你什麼答案。</p>
<p>這個角色也逐漸成為整個工具屋的核心。</p>
<p>工具本身可以持續增加，但整體風格仍然維持可愛、簡單，而且不需要學習成本。</p>
<p>&nbsp;</p>
<h3 id="%e5%b7%a5%e5%85%b7%e5%b1%8b%e8%a3%a1%e9%9d%a2%e6%9c%89%e5%93%aa%e4%ba%9b%e5%8a%9f%e8%83%bd%ef%bc%9f">工具屋裡面有哪些功能？</h3>
<p>兔耳絲工具屋目前收錄的功能，主要都來自一些生活中常見的小問題。</p>
<p>例如：</p>
<ul>
<li>今天吃什麼</li>
<li>飲料喝什麼</li>
<li>幫我決定</li>
<li>每日語錄</li>
<li>心情占卜</li>
<li>是或否</li>
<li>幸運物</li>
<li>幸運數字與幸運顏色</li>
<li>記分板</li>
<li>家事分配</li>
<li>今日穿搭</li>
<li>出遊點子</li>
</ul>
<p>有些功能偏實用，有些比較偏娛樂。</p>
<p>但共同點都是：不需要複雜設定，打開之後幾秒內就可以得到結果。</p>
<p><img data-recalc-dims="1"  fetchpriority="high"  decoding="async"  class="alignnone size-large wp-image-3861"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-01.png?resize=473%2C1024&#038;ssl=1"  alt=""  width="473"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-01-scaled.png?resize=473%2C1024&amp;ssl=1 473w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-01-scaled.png?resize=139%2C300&amp;ssl=1 139w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-01-scaled.png?resize=710%2C1536&amp;ssl=1 710w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-01-scaled.png?resize=946%2C2048&amp;ssl=1 946w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-01-scaled.png?resize=277%2C600&amp;ssl=1 277w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-01-scaled.png?w=1183&amp;ssl=1 1183w"  sizes="(max-width: 473px) 100vw, 473px" ></p>
<h3 id="%e3%80%8c%e4%bb%8a%e5%a4%a9%e5%90%83%e4%bb%80%e9%ba%bc%e3%80%8d%e5%8f%af%e8%83%bd%e6%98%af%e6%9c%80%e5%b8%b8%e8%a6%8b%e7%9a%84%e7%94%9f%e6%b4%bb%e9%9b%a3%e9%a1%8c">「今天吃什麼」可能是最常見的生活難題</h3>
<p>其中最實用的功能之一，就是「今天吃什麼」。</p>
<p>很多時候不是完全沒有想法，而是選項太多，最後反而不知道要吃什麼。</p>
<p>尤其到了中午或晚上，大家討論了半天，常常還是會回到同一句話：</p>
<p>「都可以。」</p>
<p>這時候，與其繼續陷入選擇困難，不如直接交給工具隨機決定。</p>
<p>使用者可以依照用餐時段與料理風格，快速抽出一個建議。</p>
<p>它不一定會給出最完美的答案，但至少可以讓你少花一點時間糾結。</p>
<p><img data-recalc-dims="1"  decoding="async"  class="alignnone size-large wp-image-3862"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-02.png?resize=473%2C1024&#038;ssl=1"  alt=""  width="473"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-02-scaled.png?resize=473%2C1024&amp;ssl=1 473w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-02-scaled.png?resize=139%2C300&amp;ssl=1 139w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-02-scaled.png?resize=710%2C1536&amp;ssl=1 710w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-02-scaled.png?resize=946%2C2048&amp;ssl=1 946w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-02-scaled.png?resize=277%2C600&amp;ssl=1 277w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-02-scaled.png?w=1183&amp;ssl=1 1183w"  sizes="(max-width: 473px) 100vw, 473px" ></p>
<h3 id="%e6%9c%89%e4%ba%9b%e5%b7%a5%e5%85%b7%e7%9a%84%e4%bd%9c%e7%94%a8%ef%bc%8c%e6%98%af%e8%ae%93%e7%94%9f%e6%b4%bb%e5%a4%9a%e4%b8%80%e9%bb%9e%e8%b6%a3%e5%91%b3">有些工具的作用，是讓生活多一點趣味</h3>
<p>除了比較實用的功能之外，工具屋裡也有一些比較輕鬆的內容。</p>
<p>例如每日語錄、心情占卜、幸運數字、幸運顏色與今日穿搭。</p>
<p>這些功能不需要太認真看待。</p>
<p>有時候只是早上打開手機，隨手抽一個結果，替一天增加一點小小的儀式感。</p>
<p>我覺得生活工具不一定都要提升效率。</p>
<p>偶爾讓人覺得有趣、可愛，或提供一個小小的驚喜，也是一種價值。</p>
<h3 id="%e6%9f%90%e4%b8%80%e5%a4%a9%ef%bc%8c%e6%88%91%e7%aa%81%e7%84%b6%e8%a6%ba%e5%be%97%e5%ae%83%e4%b9%9f%e6%87%89%e8%a9%b2%e6%9c%89-app">某一天，我突然覺得它也應該有 App</h3>
<p>網站版本完成之後，原本我沒有立刻打算做成 App。</p>
<p>畢竟這些功能透過瀏覽器就可以使用。</p>
<p>但某一天，我突然覺得：既然這些都是生活中偶爾會打開的小工具，那它其實很適合直接放在手機裡。</p>
<p>網站需要先打開瀏覽器、輸入網址或找到書籤。</p>
<p>App 則只要點一下圖示就能開啟。</p>
<p>這個差距看起來不大，但對於這種使用頻率不固定、每次只操作幾秒鐘的小工具來說，開啟速度與方便性很重要。</p>
<p>於是，我又把兔耳絲工具屋做成了 App 版本。</p>
<p><img data-recalc-dims="1"  decoding="async"  class="alignnone size-large wp-image-3864"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-04.png?resize=473%2C1024&#038;ssl=1"  alt=""  width="473"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-04-scaled.png?resize=473%2C1024&amp;ssl=1 473w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-04-scaled.png?resize=139%2C300&amp;ssl=1 139w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-04-scaled.png?resize=710%2C1536&amp;ssl=1 710w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-04-scaled.png?resize=946%2C2048&amp;ssl=1 946w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-04-scaled.png?resize=277%2C600&amp;ssl=1 277w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-04-scaled.png?w=1183&amp;ssl=1 1183w"  sizes="(max-width: 473px) 100vw, 473px" ></p>
<h3 id="%e7%b6%b2%e7%ab%99%e5%92%8c-app-%e4%b8%a6%e4%b8%8d%e6%98%af%e5%ae%8c%e5%85%a8%e7%9b%b8%e5%90%8c%e7%9a%84%e7%94%a2%e5%93%81">網站和 App 並不是完全相同的產品</h3>
<p>把網站轉成 App，不代表只要把原本的畫面直接搬進去就完成了。</p>
<p>手機使用者的操作方式不同，畫面空間也比較有限。</p>
<p>因此，App 版本需要重新調整介面，讓每個功能更容易找到，按鈕更適合手機操作，整體畫面也要保持簡單。</p>
<p>另外，網站可以透過連結快速分享，但 App 則更適合日常重複使用。</p>
<p>兩者的功能方向相似，但使用情境不完全一樣。</p>
<p>網站適合第一次接觸與快速體驗，App 則比較像是放在手機裡的一個小工具箱。</p>
<h3 id="%e9%80%99%e6%98%af%e4%b8%80%e5%80%8b%e5%8f%af%e4%bb%a5%e6%85%a2%e6%85%a2%e5%a2%9e%e5%8a%a0%e5%85%a7%e5%ae%b9%e7%9a%84%e5%b0%88%e6%a1%88">這是一個可以慢慢增加內容的專案</h3>
<p>和其他專案相比，兔耳絲工具屋沒有一開始就設定非常明確的終點。</p>
<p>它比較像是一個可以持續擴充的容器。</p>
<p>只要想到一個有趣、簡單，而且適合快速使用的小工具，就可以考慮加入。</p>
<p>不需要每次都做一個全新的 App，也不需要為了一個小功能重新建立完整產品。</p>
<p>這種開發方式也讓整個過程比較輕鬆。</p>
<p>有些點子未必適合成為大型專案，但放進工具屋裡，反而剛剛好。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3863"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-05.png?resize=473%2C1024&#038;ssl=1"  alt=""  width="473"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-05-scaled.png?resize=473%2C1024&amp;ssl=1 473w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-05-scaled.png?resize=139%2C300&amp;ssl=1 139w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-05-scaled.png?resize=710%2C1536&amp;ssl=1 710w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-05-scaled.png?resize=946%2C2048&amp;ssl=1 946w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-05-scaled.png?resize=277%2C600&amp;ssl=1 277w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/rabbitears-iphone-05-scaled.png?w=1183&amp;ssl=1 1183w"  sizes="auto, (max-width: 473px) 100vw, 473px" ></p>
<h3 id="%e4%b8%8d%e6%98%af%e6%af%8f%e4%b8%80%e5%80%8b%e4%bd%9c%e5%93%81%ef%bc%8c%e9%83%bd%e9%9c%80%e8%a6%81%e6%9c%89%e5%be%88%e5%a4%a7%e7%9a%84%e9%87%8e%e5%bf%83">不是每一個作品，都需要有很大的野心</h3>
<p>兔耳絲工具屋可能不是我功能最複雜的作品。</p>
<p>它沒有龐大的資料結構，也沒有非常困難的技術挑戰。</p>
<p>但它讓我重新思考了一件事。</p>
<p>做產品不一定每次都要解決很大的問題，也不一定要先想出一個完整的商業模式。</p>
<p>有時候，只是做一個自己覺得有趣、使用者也可能會喜歡的小東西，就已經足夠。</p>
<p>尤其是在 AI 協助開發的過程中，很多過去可能覺得不值得花時間製作的小工具，現在都更有機會被實現。</p>
<p>當開發成本下降之後，產品不一定只能追求功能更多、更複雜。</p>
<p>也可以更輕、更快，甚至更有趣。</p>
<h3 id="%e6%94%af%e6%8f%b4%e5%a4%9a%e8%aa%9e%e7%b3%bb%ef%bc%8c%e6%af%94%e6%83%b3%e5%83%8f%e4%b8%ad%e6%9b%b4%e8%8a%b1%e6%99%82%e9%96%93">支援多語系，比想像中更花時間</h3>
<p>兔耳絲工具屋的網站與 App 版本，目前都支援繁體中文、英文與日文。</p>
<p>一開始，我原本以為多語系主要就是把畫面上的文字翻譯完成。</p>
<p>但真正開始處理之後，才發現事情沒有那麼簡單。</p>
<p>每新增一個工具，不只是要把功能做出來，還要重新整理所有會顯示給使用者看的內容。</p>
<p>按鈕文字、標題、說明、抽選結果、提示訊息，甚至一些比較輕鬆的語句，都需要分別處理三種語言。</p>
<p>這也代表，原本只要完成一次的內容，加入多語系之後，往往需要多花一倍以上的時間確認。</p>
<p>而且，翻譯完成不代表真的適合使用。</p>
<p>現在 AI 翻譯已經很方便，可以快速產出英文與日文版本。</p>
<p>但我其實很難百分之百確定，翻譯結果是不是符合當地使用者平常會使用的說法。</p>
<p>尤其兔耳絲工具屋裡面有不少比較生活化、比較輕鬆，甚至帶一點可愛語氣的內容。</p>
<p>這些文字如果只是逐字翻譯，文法可能沒有問題，但讀起來還是可能有點生硬。</p>
<p>例如「今天吃什麼」、「幫我決定」或一些抽選結果，在不同語言裡，最自然的表達方式未必完全相同。</p>
<p>有些句子在中文裡看起來很可愛，翻成英文或日文之後，可能會變得太正式，或失去原本的語氣。</p>
<p>這也是多語系產品很現實的一個問題。</p>
<p>AI 可以協助加快翻譯速度，但它不一定能完全取代當地語感。</p>
<p>如果希望產品不只是「看得懂」，而是真的讓不同語言的使用者覺得自然，後續還是需要持續調整。</p>
<p>對一個人開發的專案來說，多語系會明顯增加維護成本，但如果希望讓更多人可以直接使用，這又是一個值得投入的方向。</p>
<h3 id="app-%e7%89%88%e6%9c%ac%e4%b8%8d%e6%98%af%e6%8a%8a%e7%b6%b2%e7%ab%99%e7%9b%b4%e6%8e%a5%e5%8c%85%e8%b5%b7%e4%be%86">App 版本不是把網站直接包起來</h3>
<p>兔耳絲工具屋的網站版本採用 Next.js 開發，App 版本則是使用 Flutter。</p>
<p>兩邊使用的是不同技術架構，也不是同一套程式碼。</p>
<p>因此，把網站做成 App，並不是將原本的網頁直接包進手機裡，也不是把畫面複製過去就完成。</p>
<p>很多功能都必須重新實作。</p>
<p>例如轉盤抽獎功能，在網站版本裡，需要依照瀏覽器環境處理畫面顯示、動畫效果與使用者操作。</p>
<p>到了 Flutter App 裡，則需要使用不同的方式重新製作轉盤、動畫與互動邏輯。</p>
<p>畫面看起來可能很接近，但背後其實是兩套不同的實作。</p>
<p>除了轉盤之外，按鈕操作、畫面切換、版面配置與手機尺寸適配，也都需要重新調整。</p>
<p>這也是我在開發 App 版本之後更明顯感受到的事情：</p>
<p><strong>網站與 App 可以共用產品概念，但不一定能直接共用程式碼。</strong></p>
<p>如果只是把網站硬塞進 App 裡，開發速度可能比較快，但操作體驗通常也會比較像網頁。</p>
<p>我希望 App 版本仍然有比較適合手機的操作方式，因此最後還是選擇用 Flutter 重新製作。</p>
<h3 id="%e7%95%b6%e4%b8%8d%e7%9f%a5%e9%81%93%e4%b8%8b%e4%b8%80%e5%80%8b%e8%a6%81%e5%81%9a%e4%bb%80%e9%ba%bc%e6%99%82%ef%bc%8c%e5%b0%b1%e5%85%88%e5%81%9a%e9%bb%9e%e5%a5%bd%e7%8e%a9%e7%9a%84">當不知道下一個要做什麼時，就先做點好玩的</h3>
<p>兔耳絲工具屋的誕生，其實沒有什麼非常偉大的故事。</p>
<p>單純就是在完成幾個專案之後，我突然不知道下一個要做什麼。</p>
<p>既然如此，那就先做一個生活小工具集合。</p>
<p>從網站開始，後來再延伸成 App。</p>
<p>它可能會慢慢增加更多功能，也可能會隨著新的想法持續調整。</p>
<p>但這也正是這個專案有趣的地方。</p>
<p>它沒有太多限制。</p>
<p>只要生活中又出現一個讓人猶豫、想抽籤，或需要一點靈感的小問題，兔耳絲工具屋就還有繼續擴充的空間。</p>
<p>想要體驗一下這款多樣性的工具，可以從雙平台下載或者從網站直接使用。</p>
<p>雙平台下載：<a href="https://apps.apple.com/us/app/%E5%85%94%E8%80%B3%E7%B5%B2%E6%97%A5%E5%B8%B8%E5%B7%A5%E5%85%B7%E5%B1%8B-%E7%94%9F%E6%B4%BB%E5%B0%8F%E5%B7%A5%E5%85%B7/id6773275443">AppStore</a> | <a href="https://play.google.com/store/apps/details?id=com.abcb.rabbitears">Google Play</a> | <a href="https://rabbitears.cc/">兔耳絲工具屋網站</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3860/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3860</post-id>	</item>
		<item>
		<title>Rootrees：我把家裡的舊族譜，做成一款家族樹 App</title>
		<link>https://edblog.net/archives/3853</link>
					<comments>https://edblog.net/archives/3853#respond</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Fri, 15 May 2026 13:27:07 +0000</pubDate>
				<category><![CDATA[App 開發實戰]]></category>
		<category><![CDATA[Android App]]></category>
		<category><![CDATA[iOS App]]></category>
		<category><![CDATA[PDF 匯出]]></category>
		<category><![CDATA[Rootrees]]></category>
		<category><![CDATA[Vibe Coding]]></category>
		<category><![CDATA[家族樹 App]]></category>
		<category><![CDATA[族譜整理]]></category>
		<category><![CDATA[族譜數位化]]></category>
		<category><![CDATA[獨立開發]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3853</guid>

					<description><![CDATA[我一直想做一款可以整理家族資料的 App。 這個想法不是突然出現的，而是來自一個很實際的需求：我手上有家裡族譜 ... <a title="Rootrees：我把家裡的舊族譜，做成一款家族樹 App" class="read-more" href="https://edblog.net/archives/3853" aria-label="Read more about Rootrees：我把家裡的舊族譜，做成一款家族樹 App">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>我一直想做一款可以整理家族資料的 App。</p>
<p>這個想法不是突然出現的，而是來自一個很實際的需求：我手上有家裡族譜的電子檔。</p>
<p>其中很多資料，是早期手寫族譜拍照後留下來的數位檔案。雖然資料有被保存下來，但閱讀、整理與分享都不算方便。</p>
<p>以前我曾經嘗試用 Photoshop 重新整理。</p>
<p>但家族成員一多，整張圖就會變得非常龐大。畫面需要不斷往左右延伸，修改關係也很麻煩。如果想輸出成紙本，還會遇到尺寸與排版問題。</p>
<p>這個想法一直放在心裡，只是遲遲沒有真正開始執行。</p>
<p>直到今年四月，我才正式把需求拿出來，開始和 ChatGPT 討論：能不能做一款可以在手機和平板上建立家族資料，並且匯出 PDF 的家族樹 App？</p>
<p>這就是 Rootrees 的起點。</p>
<h3 id="%e6%88%91%e7%9c%9f%e6%ad%a3%e9%9c%80%e8%a6%81%e7%9a%84%ef%bc%8c%e4%b8%8d%e5%8f%aa%e6%98%af%e4%b8%80%e5%bc%b5%e5%ae%b6%e6%97%8f%e6%a8%b9%e5%9c%96%e7%89%87">我真正需要的，不只是一張家族樹圖片</h3>
<p>一開始看起來，需求似乎很簡單。</p>
<p>只要讓使用者可以新增家族成員、設定彼此關係，然後產生家族樹狀圖就好了。</p>
<p>但仔細思考之後，就會發現真正需要的功能比想像中更多。</p>
<p>家族資料不只是姓名而已，還可能包含：</p>
<ul>
<li>出生日期與離世日期</li>
<li>性別</li>
<li>照片</li>
<li>備註與生平資料</li>
<li>配偶關係</li>
<li>父母與子女關係</li>
<li>不同世代之間的排列方式</li>
</ul>
<p>除了在 App 裡查看，我也希望資料可以匯出。</p>
<p>而且 PDF 不能只有一種形式。</p>
<p>有些時候，需要的是方便閱讀與保存的文字版本；有些時候，則需要可以一眼看出家族關係的樹狀版本。</p>
<p>因此，Rootrees 的 PDF 匯出功能分成兩種方向：</p>
<ul>
<li>家族成員資料的文字版 PDF</li>
<li>呈現世代與親屬關係的家族樹狀 PDF</li>
</ul>
<p>這兩種格式用途不同，也各自有不同的排版挑戰。</p>
<h3 id="%e5%be%9e%e8%a6%8f%e5%8a%83%e5%88%b0%e4%b8%8a%e6%9e%b6%ef%bc%8c%e5%a4%a7%e7%b4%84%e8%8a%b1%e4%ba%86%e4%b8%80%e5%80%8b%e6%9c%88">從規劃到上架，大約花了一個月</h3>
<p>Rootrees 的開發時程大致如下：</p>
<ul>
<li>四月第一週：開始整理需求與規劃產品方向</li>
<li>4 月 7 日：正式建立專案並進入開發</li>
<li>4 月底：完成主要功能與測試</li>
<li>5 月 7 日：上架 Google Play，正式對外開放下載</li>
</ul>
<p>從開始建立專案到正式上架，大約是一個月。</p>
<p>如果只看時間，可能會覺得開發速度很快。</p>
<p>但這一個月並不是單純把功能列出來，然後交給 AI 自動完成。實際過程中，仍然需要不斷確認需求、測試功能、修正資料關係，並且處理許多原本沒有預想到的問題。</p>
<h3 id="rootrees-%e4%b8%8d%e5%8f%aa%e6%98%af%e4%b8%80%e5%80%8b-app">Rootrees 不只是一個 App</h3>
<p>Rootrees 比較特別的地方，是它不是單一專案，而是由三個部分組成。</p>
<h4 id="a-web%ef%bc%9a%e8%a1%8c%e9%8a%b7%e7%b6%b2%e7%ab%99">A. Web：行銷網站</h4>
<p>Rootrees 有一個獨立的官方網站：</p>
<p><a href="https://rootrees.app/" target="_blank" rel="noopener">https://rootrees.app/</a></p>
<p>網站主要用來介紹產品功能、提供下載資訊，以及放置隱私權政策等相關內容。</p>
<p>目前網站使用 Vercel 架設。</p>
<h4 id="b-backend%ef%bc%9a%e5%be%8c%e7%ab%af%e6%9c%8d%e5%8b%99">B. Backend：後端服務</h4>
<p>後端主要負責提供 API 給 App 使用，採用Digitalocean做為後端服務商。</p>
<p>使用者建立的家族成員資料、人物關係與相關內容，都需要透過後端進行儲存與同步。</p>
<p>這也表示 Rootrees 不只是一款單機工具，而是一個需要處理資料結構、帳號與雲端同步的完整服務。</p>
<h4 id="c-app%ef%bc%9a%e9%9b%99%e5%b9%b3%e5%8f%b0%e6%87%89%e7%94%a8%e7%a8%8b%e5%bc%8f">C. App：雙平台應用程式</h4>
<p>Rootrees 支援中文與英文，也同時支援 Android 與 iOS。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3856"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_20_39.png?resize=473%2C1024&#038;ssl=1"  alt=""  width="473"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_20_39.png?resize=473%2C1024&amp;ssl=1 473w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_20_39.png?resize=138%2C300&amp;ssl=1 138w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_20_39.png?resize=709%2C1536&amp;ssl=1 709w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_20_39.png?resize=277%2C600&amp;ssl=1 277w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_20_39.png?w=852&amp;ssl=1 852w"  sizes="auto, (max-width: 473px) 100vw, 473px" ></p>
<p>使用者可以在手機或平板上建立家族資料、整理人物關係、查看家族樹，並且匯出 PDF 檔案。</p>
<p>整體開發順序是：</p>
<p><strong>Backend → App → Web</strong></p>
<p>我先把後端資料結構與 API 建立起來，再進入 App 功能開發。等主要流程完成後，才補上行銷網站。</p>
<h3 id="%e6%9c%80%e5%a4%a7%e7%9a%84%e6%8c%91%e6%88%b0%ef%bc%8c%e6%98%af%e9%9c%80%e6%b1%82%e5%92%8c-ai-%e7%90%86%e8%a7%a3%e4%b9%8b%e9%96%93%e7%9a%84%e8%90%bd%e5%b7%ae">最大的挑戰，是需求和 AI 理解之間的落差</h3>
<p>Rootrees 是我目前在 Vibe Coding 過程中，遇到最多問題的一個專案。</p>
<p>最大的挑戰不是單純的「程式能不能寫出來」，而是：</p>
<p><strong>我腦中想要的功能，和 AI 理解到的功能，常常會有落差。</strong></p>
<p>有些功能用文字描述看起來很清楚，但實際做出來後，才會發現彼此理解的畫面完全不同。</p>
<p>尤其是畫面流程、資料結構、人物關係與 PDF 輸出格式，不能只用一句話簡單帶過。</p>
<p>很多時候，必須搭配範例、使用情境，甚至像分鏡一樣，把每一個步驟說清楚，AI 才比較有機會理解真正的需求。</p>
<h3 id="%e3%80%8cpdf-%e9%a1%af%e7%a4%ba%e9%8c%af%e4%ba%86%e3%80%8d%e4%b8%8d%e6%98%af%e4%b8%80%e5%80%8b%e8%b6%b3%e5%a4%a0%e6%b8%85%e6%a5%9a%e7%9a%84%e9%9c%80%e6%b1%82">「PDF 顯示錯了」不是一個足夠清楚的需求</h3>
<p>家族樹狀 PDF 是整個專案裡比較複雜的功能之一。</p>
<p>在 App 裡顯示的家族樹，和匯出成 PDF 後的結果，並不是完全相同的事情。</p>
<p>App 畫面可以讓使用者縮放、拖曳，也可以依照螢幕大小即時調整。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3857"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/Simulator-Screenshot-iPhone-17-2026-05-25-at-21.23.50.png?resize=471%2C1024&#038;ssl=1"  alt=""  width="471"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/Simulator-Screenshot-iPhone-17-2026-05-25-at-21.23.50-scaled.png?resize=471%2C1024&amp;ssl=1 471w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/Simulator-Screenshot-iPhone-17-2026-05-25-at-21.23.50-scaled.png?resize=138%2C300&amp;ssl=1 138w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/Simulator-Screenshot-iPhone-17-2026-05-25-at-21.23.50-scaled.png?resize=706%2C1536&amp;ssl=1 706w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/Simulator-Screenshot-iPhone-17-2026-05-25-at-21.23.50-scaled.png?resize=942%2C2048&amp;ssl=1 942w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/Simulator-Screenshot-iPhone-17-2026-05-25-at-21.23.50-scaled.png?resize=276%2C600&amp;ssl=1 276w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/Simulator-Screenshot-iPhone-17-2026-05-25-at-21.23.50-scaled.png?w=1177&amp;ssl=1 1177w"  sizes="auto, (max-width: 471px) 100vw, 471px" ></p>
<p>但 PDF 是固定尺寸的文件。</p>
<p>當家族成員數量增加，或某一代的兄弟姊妹、配偶與子女比較多時，就可能出現排列擁擠、節點重疊或頁面過大的問題。</p>
<p>遇到這種情況，不能只對 AI 說：</p>
<p>「PDF 顯示錯了，請幫我修正。」</p>
<p>因為問題可能來自很多不同地方：</p>
<ul>
<li>家族成員的資料排序</li>
<li>父母、配偶與子女的關係判斷</li>
<li>不同世代的層級位置</li>
<li>兄弟姊妹之間的排列方式</li>
<li>配偶節點是否占用額外空間</li>
<li>樹狀圖節點之間的間距</li>
<li>PDF 頁面尺寸與輸出方向</li>
<li>內容超出頁面時如何縮放</li>
</ul>
<p>必須先把問題拆開，確認可能出錯的環節，再針對不同方案和 AI 討論。</p>
<p>有時候需要調整節點位置，有時候需要修改資料排序，有時候則必須重新思考 PDF 的輸出方式。</p>
<p>通常不會只靠一次對話就得到最適合的答案，而是需要經過多輪測試與修正。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3855"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_21_17.png?resize=474%2C1024&#038;ssl=1"  alt=""  width="474"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_21_17.png?resize=474%2C1024&amp;ssl=1 474w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_21_17.png?resize=139%2C300&amp;ssl=1 139w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_21_17.png?resize=711%2C1536&amp;ssl=1 711w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_21_17.png?resize=278%2C600&amp;ssl=1 278w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/05/ChatGPT-Image-2026%E5%B9%B45%E6%9C%8826%E6%97%A5-%E4%B8%8A%E5%8D%8811_21_17.png?w=853&amp;ssl=1 853w"  sizes="auto, (max-width: 474px) 100vw, 474px" ></p>
<h3 id="%e8%a1%a8%e9%81%94%e9%9c%80%e6%b1%82%ef%bc%8c%e6%9c%ac%e8%ba%ab%e5%b0%b1%e6%98%af-vibe-coding-%e7%9a%84%e9%87%8d%e8%a6%81%e8%83%bd%e5%8a%9b">表達需求，本身就是 Vibe Coding 的重要能力</h3>
<p>開發 Rootrees 之後，我更明顯感受到一件事：</p>
<p><strong>使用 AI 寫程式，並不代表只要會下指令就夠了。</strong></p>
<p>真正重要的是，能不能把需求說清楚。</p>
<p>如果自己也沒有想清楚流程、資料關係與使用情境，AI 很容易做出一個「表面上可以執行」，但實際上不符合需求的版本。</p>
<p>尤其是比較複雜的產品，不能只用一句話要求 AI 完成整套功能。</p>
<p>比較有效的方式是：</p>
<ul>
<li>先拆分功能</li>
<li>說明使用情境</li>
<li>提供具體範例</li>
<li>指出目前畫面與預期結果的差異</li>
<li>分析可能出錯的位置</li>
<li>設計幾種不同解法</li>
<li>逐步測試與修正</li>
</ul>
<p>AI 可以協助產生程式碼，也可以協助討論方案。</p>
<p>但產品設計、需求拆解與結果判斷，仍然需要自己負責。</p>
<h3 id="%e5%be%9e%e5%ae%b6%e8%a3%a1%e7%9a%84%e8%88%8a%e6%97%8f%e8%ad%9c%ef%bc%8c%e8%ae%8a%e6%88%90%e5%8f%af%e4%bb%a5%e6%8c%81%e7%ba%8c%e4%bd%bf%e7%94%a8%e7%9a%84%e5%b7%a5%e5%85%b7">從家裡的舊族譜，變成可以持續使用的工具</h3>
<p>Rootrees 最初只是來自一個很單純的問題：</p>
<p>家裡留下來的族譜資料，有沒有更方便的整理方式？</p>
<p>從早期手寫資料的照片，到 Photoshop 裡龐大的族譜圖片，再到可以在手機與平板上建立資料、整理關係、匯出 PDF 的 App，整個過程其實就是把一個生活中的需求，逐步轉換成產品。</p>
<p>目前 Rootrees 已經支援中文與英文，並且陸續上架 Android 與 iOS 平台。</p>
<p>它還有很多可以持續改善的地方，但對我來說，這個專案已經不只是一次技術練習。</p>
<p>它也是目前最能代表我使用 AI 協助開發產品的一次經驗。</p>
<p>AI 的確讓一個人可以更快完成過去需要多人合作的工作。</p>
<p>但越深入做下去，就越會發現：真正決定產品品質的，仍然是你有沒有辦法把問題想清楚。</p>
<p>&nbsp;</p>
<p>如果想要試試這個族譜App，歡迎下載。雙平台下載：<a href="https://apps.apple.com/app/id6772901977">AppStore</a> | <a href="https://play.google.com/store/apps/details?id=com.abcb.rootrees">Google Play</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3853/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3853</post-id>	</item>
		<item>
		<title>我為什麼開發一款中國象棋 App？從休閒遊戲入門到殘局挑戰紀錄</title>
		<link>https://edblog.net/archives/3844</link>
					<comments>https://edblog.net/archives/3844#respond</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Sun, 08 Mar 2026 03:16:40 +0000</pubDate>
				<category><![CDATA[App 開發實戰]]></category>
		<category><![CDATA[Android App]]></category>
		<category><![CDATA[Flutter]]></category>
		<category><![CDATA[iOS App]]></category>
		<category><![CDATA[中國象棋]]></category>
		<category><![CDATA[休閒遊戲]]></category>
		<category><![CDATA[暗棋]]></category>
		<category><![CDATA[殘局挑戰]]></category>
		<category><![CDATA[獨立開發]]></category>
		<category><![CDATA[象棋 App]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3844</guid>

					<description><![CDATA[在開始嘗試開發 App 之後，我做過一些偏向工具類型的作品，例如生活提醒、世界時鐘與家族樹紀錄。 不過，我也一 ... <a title="我為什麼開發一款中國象棋 App？從休閒遊戲入門到殘局挑戰紀錄" class="read-more" href="https://edblog.net/archives/3844" aria-label="Read more about 我為什麼開發一款中國象棋 App？從休閒遊戲入門到殘局挑戰紀錄">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>在開始嘗試開發 App 之後，我做過一些偏向工具類型的作品，例如生活提醒、世界時鐘與家族樹紀錄。</p>
<p>不過，我也一直想嘗試另一個方向：休閒遊戲。</p>
<p>相比功能型 App，遊戲有不同的挑戰。除了功能可以正常運作，還要考慮玩家會不會願意持續使用、操作是否直覺，以及同一套規則可以延伸出哪些玩法。</p>
<p>最後，我選擇從中國象棋開始。</p>
<h3 id="%e7%82%ba%e4%bb%80%e9%ba%bc%e9%81%b8%e6%93%87%e4%b8%ad%e5%9c%8b%e8%b1%a1%e6%a3%8b%ef%bc%9f">為什麼選擇中國象棋？</h3>
<p>中國象棋是一款大家相對熟悉的棋類遊戲。</p>
<p>它的規則完整，也已經累積了長時間的玩法基礎。對第一次嘗試開發休閒遊戲的人來說，比起從零開始設計一套新的遊戲規則，中國象棋是一個比較容易切入的題目。</p>
<p>我不需要先花大量時間解釋遊戲世界觀、角色技能或複雜的戰鬥機制，而是可以先把重點放在遊戲流程、棋盤操作、畫面呈現與不同模式的設計。</p>
<p>但真正開始製作之後，我也慢慢發現：規則簡單，不代表開發過程沒有細節。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3847"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess01.png?resize=461%2C1024&#038;ssl=1"  alt=""  width="461"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess01.png?resize=461%2C1024&amp;ssl=1 461w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess01.png?resize=135%2C300&amp;ssl=1 135w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess01.png?resize=270%2C600&amp;ssl=1 270w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess01.png?w=648&amp;ssl=1 648w"  sizes="auto, (max-width: 461px) 100vw, 461px" ></p>
<h3 id="%e4%b8%8d%e5%8f%aa%e6%98%af%e5%92%8c%e9%9b%bb%e8%85%a6%e4%b8%8b%e6%a3%8b">不只是和電腦下棋</h3>
<p>一開始，我不希望這款 App 只有單一玩法。</p>
<p>有些玩家想要自己練習，有些人則是希望兩個人直接拿著同一台手機或平板對戰。也有人平常比較常玩暗棋，不一定想下完整的中國象棋。</p>
<p>因此，目前 App 內包含幾種不同模式：</p>
<ul>
<li>電腦對戰</li>
<li>雙人象棋對戰</li>
<li>暗棋電腦對戰</li>
<li>雙人暗棋對戰</li>
</ul>
<p>對我來說，這也是開發休閒遊戲很有趣的地方。</p>
<p>同一套棋子與棋盤，可以透過不同規則與操作方式，延伸出不一樣的遊戲體驗。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3850"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess02.png?resize=461%2C1024&#038;ssl=1"  alt=""  width="461"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess02.png?resize=461%2C1024&amp;ssl=1 461w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess02.png?resize=135%2C300&amp;ssl=1 135w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess02.png?resize=270%2C600&amp;ssl=1 270w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess02.png?w=648&amp;ssl=1 648w"  sizes="auto, (max-width: 461px) 100vw, 461px" ></p>
<h3 id="%e9%9b%99%e4%ba%ba%e5%b0%8d%e6%88%b0%e6%99%82%ef%bc%8c%e6%a3%8b%e5%ad%90%e6%96%b9%e5%90%91%e4%b9%9f%e6%9c%83%e5%bd%b1%e9%9f%bf%e9%ab%94%e9%a9%97">雙人對戰時，棋子方向也會影響體驗</h3>
<p>如果只是自己對著手機下棋，所有棋子朝向同一個方向並沒有太大問題。</p>
<p>但雙人對戰就不一樣了。</p>
<p>當兩位玩家坐在手機或平板的兩側時，如果棋子的文字全部朝向同一邊，其中一位玩家就必須倒著看自己的棋子。</p>
<p>這不會影響規則，卻會讓遊戲體驗變得不自然。</p>
<p>因此，在雙人象棋模式中，我讓紅方與黑方的棋子依照各自角度翻轉。兩位玩家坐在對面時，都可以清楚看到自己的棋子，不需要一直轉動手機。</p>
<p>這是一個看起來很小的功能，但實際使用時差異很明顯。</p>
<p>很多 App 的細節，並不是功能能不能執行，而是使用者操作起來是否順手。</p>
<h3 id="%e6%9a%97%e6%a3%8b%e6%a8%a1%e5%bc%8f%e5%8a%a0%e5%85%a5%e6%a9%ab%e5%90%91%e7%95%ab%e9%9d%a2">暗棋模式加入橫向畫面</h3>
<p>暗棋的棋盤和完整象棋不同，棋子排列方式也不一樣。</p>
<p>如果在手機直向模式下顯示，棋盤寬度受到限制，棋子可能會縮得太小。雖然仍然可以操作，但閱讀與點擊都比較不方便。</p>
<p>因此，暗棋模式可以切換成橫向畫面。</p>
<p>橫向顯示之後，棋盤可以使用更完整的螢幕空間，棋子不需要過度縮小，操作起來也更舒服。</p>
<p>這也是我在開發過程中逐漸注意到的事情：手機畫面空間有限，不能只是把桌上遊戲直接縮小塞進螢幕，而是要依照實際使用方式重新調整介面。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3851"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess05.png?resize=900%2C405&#038;ssl=1"  alt=""  width="900"  height="405"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess05-scaled.png?resize=1024%2C461&amp;ssl=1 1024w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess05-scaled.png?resize=300%2C135&amp;ssl=1 300w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess05-scaled.png?resize=1536%2C691&amp;ssl=1 1536w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess05-scaled.png?resize=2048%2C921&amp;ssl=1 2048w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess05-scaled.png?resize=600%2C270&amp;ssl=1 600w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess05-scaled.png?w=1800&amp;ssl=1 1800w"  sizes="auto, (max-width: 900px) 100vw, 900px" ></p>
<h3 id="%e5%be%8c%e7%ba%8c%e5%8a%a0%e5%85%a5%e6%ae%98%e5%b1%80%e6%8c%91%e6%88%b0">後續加入殘局挑戰</h3>
<p>完成基本對戰功能之後，我開始思考：除了完整對局之外，還能不能提供更適合短時間遊玩的內容？</p>
<p>因此，後來的版本加入了殘局挑戰。</p>
<p>殘局的特色是局面已經進行到某個階段，玩家不需要從第一步開始慢慢下，而是直接面對一個特定情境，嘗試找出破解方式。</p>
<p>對玩家來說，殘局很適合利用零碎時間挑戰。即使只有幾分鐘，也可以開啟一個局面思考看看。</p>
<p>目前加入的殘局棋譜，主要整理自採用 MIT 授權的開源資源。</p>
<p>開源授權讓我可以在遵守授權條件的前提下，將這些棋譜整合進 App，再依照手機操作方式重新設計呈現流程。</p>
<h3 id="%e6%8c%91%e6%88%b0%e9%81%8e%e7%9a%84%e6%ae%98%e5%b1%80%ef%bc%8c%e5%8f%af%e4%bb%a5%e9%9a%a8%e6%99%82%e9%87%8d%e6%96%b0%e6%8c%91%e6%88%b0">挑戰過的殘局，可以隨時重新挑戰</h3>
<p>在最新一次改版中，我又補上了殘局挑戰紀錄功能。</p>
<p>只要玩家進入某個殘局挑戰，系統就會自動留下紀錄。</p>
<p>這項功能不是等到成功破解之後才記錄，而是只要曾經進入挑戰，就可以在紀錄中找到它。</p>
<p>玩家之後可以隨時回頭重新挑戰，不需要再次從完整清單中慢慢尋找。</p>
<p>這對殘局玩法來說很重要，因為有些題目未必第一次就能解開。有時候隔一段時間再回來思考，反而會有不同的想法。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3849"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess04.png?resize=461%2C1024&#038;ssl=1"  alt=""  width="461"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess04.png?resize=461%2C1024&amp;ssl=1 461w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess04.png?resize=135%2C300&amp;ssl=1 135w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess04.png?resize=270%2C600&amp;ssl=1 270w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/chinese_chess04.png?w=648&amp;ssl=1 648w"  sizes="auto, (max-width: 461px) 100vw, 461px" ></p>
<h3 id="%e5%be%9e%e8%b1%a1%e6%a3%8b%e9%96%8b%e5%a7%8b%e5%98%97%e8%a9%a6%e4%bc%91%e9%96%92%e9%81%8a%e6%88%b2">從象棋開始嘗試休閒遊戲</h3>
<p>中國象棋 App 對我來說，是一次切入休閒遊戲開發的嘗試。</p>
<p>它不像大型 RPG 需要大量角色、美術與劇情內容，也不像完全原創的遊戲需要先驗證整套規則是否好玩。</p>
<p>但即使是一款大家熟悉的棋類遊戲，實際做起來仍然有不少值得思考的地方：</p>
<ul>
<li>不同玩家需要哪些遊戲模式？</li>
<li>雙人共用同一台裝置時，棋子應該如何顯示？</li>
<li>直向與橫向畫面如何調整？</li>
<li>除了完整對局之外，還能加入哪些短時間玩法？</li>
<li>玩家如何快速回到曾經挑戰過的內容？</li>
</ul>
<p>這些功能不一定很華麗，但每一個調整，都是讓遊戲更容易使用的一小步。</p>
<p>對我來說，開發 App 最有趣的地方，也正是在這裡。</p>
<p>一開始可能只是一個簡單的想法，但隨著自己實際使用、持續測試與更新，產品會逐漸長出更多細節。</p>
<p>雙平台下載：<a href="https://apps.apple.com/us/app/%E4%B8%AD%E5%9C%8B%E8%B1%A1%E6%A3%8B-%E7%B6%93%E5%85%B8%E5%B0%8D%E5%BC%88%E8%88%87%E8%A1%97%E9%A0%AD%E6%9A%97%E6%A3%8B/id6770053369">AppStore</a> | <a href="https://play.google.com/store/apps/details?id=com.abcb.chinese_chess">Google Play</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3844/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3844</post-id>	</item>
		<item>
		<title>CycleNote：因為我總是忘記喝水、吃藥，乾脆自己做一個提醒 App</title>
		<link>https://edblog.net/archives/3836</link>
					<comments>https://edblog.net/archives/3836#respond</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Tue, 03 Feb 2026 03:05:51 +0000</pubDate>
				<category><![CDATA[App 開發實戰]]></category>
		<category><![CDATA[Android App]]></category>
		<category><![CDATA[CycleNote]]></category>
		<category><![CDATA[iOS App]]></category>
		<category><![CDATA[吃藥提醒]]></category>
		<category><![CDATA[喝水提醒]]></category>
		<category><![CDATA[獨立開發]]></category>
		<category><![CDATA[生活提醒 App]]></category>
		<category><![CDATA[生活習慣]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3836</guid>

					<description><![CDATA[長時間坐在辦公室工作，最大的問題不一定是工作太多，而是很容易忘記照顧自己。 有時候忙著處理事情，一回過神才發現 ... <a title="CycleNote：因為我總是忘記喝水、吃藥，乾脆自己做一個提醒 App" class="read-more" href="https://edblog.net/archives/3836" aria-label="Read more about CycleNote：因為我總是忘記喝水、吃藥，乾脆自己做一個提醒 App">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>長時間坐在辦公室工作，最大的問題不一定是工作太多，而是很容易忘記照顧自己。</p>
<p>有時候忙著處理事情，一回過神才發現整個下午幾乎沒有喝水。需要固定吃的藥，也可能因為正在開會、寫程式，或只是單純分心，不小心就錯過時間。</p>
<p>除了每天重複發生的事情，生活中還有很多不會立刻造成問題，卻很容易被忽略的小事。</p>
<p>例如牙刷多久該換一次、濾芯什麼時候要更換、某些用品是不是已經用了太久，甚至一些每隔幾週或幾個月才需要處理一次的事情。</p>
<p>這些事情單獨看都不大，但累積起來，就很容易漏東漏西。</p>
<p>CycleNote 就是從這些日常問題開始的。</p>
<h3 id="%e6%88%91%e9%9c%80%e8%a6%81%e7%9a%84%e4%b8%8d%e6%98%af%e5%be%85%e8%be%a6%e6%b8%85%e5%96%ae%ef%bc%8c%e8%80%8c%e6%98%af%e6%9b%b4%e7%b0%a1%e5%96%ae%e7%9a%84%e6%8f%90%e9%86%92%e5%b7%a5%e5%85%b7">我需要的不是待辦清單，而是更簡單的提醒工具</h3>
<p>市面上已經有很多行事曆、待辦清單與提醒 App，但我真正需要的功能其實沒有那麼複雜。</p>
<p>我不是想要管理大型專案，也不是要建立一套完整的時間管理系統。我只是希望有一個簡單的地方，可以記錄：</p>
<ul>
<li>今天喝了多少水</li>
<li>藥是不是已經吃過了</li>
<li>某件事情上次是什麼時候完成的</li>
<li>下一次大概什麼時候需要再次提醒</li>
</ul>
<p>很多生活習慣並不是「做完一次就結束」，而是需要持續循環。</p>
<p>喝水每天都要記得，藥可能一天要吃一次或數次，某些生活用品則是隔一段時間就需要更換。</p>
<p>因此，我想做的不是一張會愈來愈長的待辦清單，而是一個可以協助記錄生活週期的小工具。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone wp-image-3840 size-large"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss.png?resize=473%2C1024&#038;ssl=1"  alt=""  width="473"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-scaled.png?resize=473%2C1024&amp;ssl=1 473w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-scaled.png?resize=139%2C300&amp;ssl=1 139w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-scaled.png?resize=710%2C1536&amp;ssl=1 710w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-scaled.png?resize=947%2C2048&amp;ssl=1 947w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-scaled.png?resize=277%2C600&amp;ssl=1 277w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-scaled.png?w=1183&amp;ssl=1 1183w"  sizes="auto, (max-width: 473px) 100vw, 473px" ></p>
<h3 id="%e7%82%ba%e4%bb%80%e9%ba%bc%e5%8f%ab%e5%81%9a-cyclenote%ef%bc%9f">為什麼叫做 CycleNote？</h3>
<p>CycleNote 這個名稱來自兩個概念：Cycle 與 Note。</p>
<p>Cycle 代表生活中不斷重複的週期，Note 則代表簡單記錄。</p>
<p>我們每天的生活，其實充滿了各種循環：</p>
<ul>
<li>每天固定要做的事情</li>
<li>每週需要整理或補充的用品</li>
<li>每月需要處理的生活事項</li>
<li>每隔一段時間需要更換的物品</li>
</ul>
<p>有些事情很重要，卻不值得為它建立一套複雜流程。只要在適當的時間提醒一下，就已經很有幫助。</p>
<h3 id="%e6%9c%80%e5%85%88%e6%83%b3%e5%88%b0%e7%9a%84%e5%8a%9f%e8%83%bd%ef%bc%9a%e5%96%9d%e6%b0%b4%e8%88%87%e5%90%83%e8%97%a5%e6%8f%90%e9%86%92">最先想到的功能：喝水與吃藥提醒</h3>
<p>對我來說，第一個最實際的需求就是喝水。</p>
<p>整天坐在電腦前面工作，很容易進入專注狀態。有時候不是完全沒有喝水，而是喝得太少，直到晚上才發現今天幾乎沒怎麼補充水分。</p>
<p>另一個需求則是吃藥提醒。</p>
<h3 id="" style="font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-style: normal; counter-reset: h4 0;"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3839"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-1.png?resize=473%2C1024&#038;ssl=1"  alt=""  width="473"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-1-scaled.png?resize=473%2C1024&amp;ssl=1 473w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-1-scaled.png?resize=139%2C300&amp;ssl=1 139w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-1-scaled.png?resize=710%2C1536&amp;ssl=1 710w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-1-scaled.png?resize=947%2C2048&amp;ssl=1 947w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-1-scaled.png?resize=277%2C600&amp;ssl=1 277w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-1-scaled.png?w=1183&amp;ssl=1 1183w"  sizes="auto, (max-width: 473px) 100vw, 473px" ></h3>
<p>手機鬧鐘當然也可以做到提醒，但一般鬧鐘只能告訴你時間到了。它不一定能讓你清楚知道，這次到底有沒有完成，或今天還剩下哪些紀錄。</p>
<p>我希望 CycleNote 不只是跳出通知，而是讓使用者可以快速確認與留下紀錄。</p>
<p>提醒只是第一步，真正有幫助的是減少「我剛剛到底有沒有做？」的疑問。</p>
<h3 id="%e5%be%8c%e4%be%86%e7%99%bc%e7%8f%be%ef%bc%8c%e5%8f%af%e4%bb%a5%e8%a8%98%e9%8c%84%e7%9a%84%e4%ba%8b%e6%83%85%e6%af%94%e6%83%b3%e5%83%8f%e4%b8%ad%e6%9b%b4%e5%a4%9a">後來發現，可以記錄的事情比想像中更多</h3>
<p>開始設計之後，我才發現生活中有很多事情都符合相同的邏輯。</p>
<p>例如：</p>
<ul>
<li>牙刷定期更換</li>
<li>隱形眼鏡盒或生活用品汰換</li>
<li>飲水機、空氣清淨機或其他設備的濾芯更換</li>
<li>定期清潔與保養</li>
<li>需要週期性補充的用品</li>
</ul>
<p>這些事情通常不會每天出現在腦中，但等到想起來的時候，往往已經拖了一段時間。</p>
<p>如果可以在完成時順手留下紀錄，再讓系統在適當的時間提醒下一次，就能省下不少記憶成本。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3838"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-2.png?resize=473%2C1024&#038;ssl=1"  alt=""  width="473"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-2-scaled.png?resize=473%2C1024&amp;ssl=1 473w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-2-scaled.png?resize=139%2C300&amp;ssl=1 139w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-2-scaled.png?resize=710%2C1536&amp;ssl=1 710w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-2-scaled.png?resize=947%2C2048&amp;ssl=1 947w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-2-scaled.png?resize=277%2C600&amp;ssl=1 277w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/06/0x0ss-2-scaled.png?w=1183&amp;ssl=1 1183w"  sizes="auto, (max-width: 473px) 100vw, 473px" ></p>
<h3 id="%e6%88%91%e6%83%b3%e5%81%9a%e7%9a%84%e6%98%af%e9%99%8d%e4%bd%8e%e7%94%9f%e6%b4%bb%e4%b8%ad%e7%9a%84%e8%a8%98%e6%86%b6%e8%b2%a0%e6%93%94">我想做的是降低生活中的記憶負擔</h3>
<p>我們每天需要記住的事情已經很多了。</p>
<p>工作上的進度、臨時交辦、家庭事項、帳單、約定時間，還有各種零碎的小事，全部都擠在腦中。</p>
<p>CycleNote 的目標不是把生活變成一張需要每天仔細維護的表格，而是把一些容易忘記的事情交給手機。</p>
<p>需要做的時候提醒一下，完成之後記錄一下，就這麼簡單。</p>
<p>對我來說，工具的價值不一定來自功能很多。有時候，能夠確實解決一個每天都會遇到的小麻煩，就已經很實用。</p>
<h3 id="%e5%be%9e%e8%87%aa%e5%b7%b1%e7%9a%84%e9%9c%80%e6%b1%82%e9%96%8b%e5%a7%8b%e5%81%9a-app">從自己的需求開始做 App</h3>
<p>我最近陸續嘗試開發幾款 App，慢慢發現一件事情：最適合開始動手做的題目，通常不是看起來最厲害的點子，而是自己真的會使用的工具。</p>
<p>因為自己就是使用者，所以很清楚哪些步驟太麻煩，哪些功能其實不需要，哪些地方如果多按一次就會懶得記錄。</p>
<p>CycleNote 目前仍然會持續調整。我希望它保持簡單，但也能逐步加入更多實用的週期記錄功能。</p>
<p>它不一定是一款功能最複雜的 App，但它確實來自我每天會遇到的問題。</p>
<p>而這也是我開始做獨立 App 之後，愈來愈喜歡的一件事：生活中遇到一個小麻煩，不一定只能尋找現成工具，有時候也可以試著自己做一個。</p>
<p>&nbsp;</p>
<p>雙平台下載連結：<a href="https://apps.apple.com/us/app/cyclenote-%E5%96%9D%E6%B0%B4%E8%88%87%E6%8F%90%E9%86%92%E7%B4%80%E9%8C%84/id6771709910">AppStore</a> | <a href="https://play.google.com/store/apps/details?id=com.abcb.cyclenote">Google Play</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3836/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3836</post-id>	</item>
		<item>
		<title>Clockwise 開發紀錄：從時差痛點開始的一款萬國時鐘 App</title>
		<link>https://edblog.net/archives/3816</link>
					<comments>https://edblog.net/archives/3816#respond</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Fri, 30 Jan 2026 09:37:52 +0000</pubDate>
				<category><![CDATA[App 開發實戰]]></category>
		<category><![CDATA[AI 輔助開發]]></category>
		<category><![CDATA[App 開發]]></category>
		<category><![CDATA[clockwise]]></category>
		<category><![CDATA[Flutter]]></category>
		<category><![CDATA[Vibe Coding]]></category>
		<category><![CDATA[世界時鐘]]></category>
		<category><![CDATA[獨立開發]]></category>
		<category><![CDATA[萬國時鐘]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3816</guid>

					<description><![CDATA[這陣子重新整理 edblog.net，也想順便把自己這段時間做過的 App 慢慢記錄下來。 第一篇先從 Clo ... <a title="Clockwise 開發紀錄：從時差痛點開始的一款萬國時鐘 App" class="read-more" href="https://edblog.net/archives/3816" aria-label="Read more about Clockwise 開發紀錄：從時差痛點開始的一款萬國時鐘 App">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>這陣子重新整理 edblog.net，也想順便把自己這段時間做過的 App 慢慢記錄下來。</p>
<p>第一篇先從 <strong>Clockwise</strong> 開始。</p>
<p>Clockwise 是我做的一款萬國時鐘 App，主要是用來解決跨時區看時間、安排會議、確認海外朋友或團隊現在時間的問題。</p>
<p>會想做這款 App，其實原因很簡單：<br />
現在很多事情都不是只跟台灣時間有關。</p>
<p>可能是遠端工作、海外朋友、國際服遊戲活動、國外客服、跨國會議，甚至只是想知道某個城市現在是白天還是晚上。這些事情看起來都不大，但每天一直心算時差，其實還是有點麻煩。</p>
<p>所以 Clockwise 的目標不是做一個很複雜的工具，而是做一個可以快速打開、快速看懂、快速判斷的世界時鐘。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3817"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Gemini_Generated_Image_yc745kyc745kyc74.png?resize=900%2C439&#038;ssl=1"  alt=""  width="900"  height="439"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Gemini_Generated_Image_yc745kyc745kyc74.png?w=1024&amp;ssl=1 1024w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Gemini_Generated_Image_yc745kyc745kyc74.png?resize=300%2C146&amp;ssl=1 300w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Gemini_Generated_Image_yc745kyc745kyc74.png?resize=380%2C186&amp;ssl=1 380w"  sizes="auto, (max-width: 900px) 100vw, 900px" ></p>
<h3 id="%e4%b8%80%e9%96%8b%e5%a7%8b%e6%83%b3%e8%a7%a3%e6%b1%ba%e7%9a%84%e5%95%8f%e9%a1%8c">一開始想解決的問題</h3>
<p>我自己在設計 Clockwise 時，主要想解決幾個問題。</p>
<p>第一個是不用每次都心算時差。</p>
<p>例如台灣現在是下午，但美國、歐洲、日本、澳洲各地時間不同，如果每次都要自己算，久了真的很煩。</p>
<p>第二個是希望一眼就能看出對方那邊現在適不適合聯絡。</p>
<p>有些世界時鐘 App 只是顯示時間，但我更希望它可以讓人直覺知道：</p>
<ul>
<li>那邊現在是白天還是晚上</li>
<li>跟本地時間差幾小時</li>
<li>現在是不是大概適合開會或聯絡</li>
<li>夏令時間有沒有被正確處理</li>
</ul>
<p>第三個是畫面要乾淨。</p>
<p>我不想把它做成很重的行事曆，也不想一進去就很多設定。Clockwise 比較像是一個每天可以快速看一下的小工具。</p>
<h3 id="clockwise-%e7%9b%ae%e5%89%8d%e7%9a%84%e4%b8%bb%e8%a6%81%e5%8a%9f%e8%83%bd">Clockwise 目前的主要功能</h3>
<p>Clockwise 目前主要有幾個功能。</p>
<p><strong>多城市時間顯示</strong></p>
<p>使用者可以加入不同城市，然後在首頁一次查看各地目前時間。</p>
<p>這是最基本，但也是最重要的功能。對我來說，世界時鐘最重要的不是功能多，而是資訊要清楚。打開 App 之後，最好可以在幾秒內就知道自己要看的城市現在幾點。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3820"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-36-56-528_com.abcb_.clockwise.jpg?resize=461%2C1024&#038;ssl=1"  alt=""  width="461"  height="1024"  data-wp-editing="1"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-36-56-528_com.abcb_.clockwise-scaled.jpg?resize=461%2C1024&amp;ssl=1 461w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-36-56-528_com.abcb_.clockwise-scaled.jpg?resize=135%2C300&amp;ssl=1 135w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-36-56-528_com.abcb_.clockwise-scaled.jpg?resize=691%2C1536&amp;ssl=1 691w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-36-56-528_com.abcb_.clockwise-scaled.jpg?resize=921%2C2048&amp;ssl=1 921w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-36-56-528_com.abcb_.clockwise-scaled.jpg?resize=380%2C845&amp;ssl=1 380w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-36-56-528_com.abcb_.clockwise-scaled.jpg?resize=760%2C1689&amp;ssl=1 760w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-36-56-528_com.abcb_.clockwise-scaled.jpg?resize=270%2C600&amp;ssl=1 270w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-36-56-528_com.abcb_.clockwise-scaled.jpg?w=1152&amp;ssl=1 1152w"  sizes="auto, (max-width: 461px) 100vw, 461px" ></p>
<p><strong>自動處理時區與夏令時間</strong></p>
<p>時區其實不是單純加減幾小時而已，因為有些國家或地區會有夏令時間。</p>
<p>如果 App 沒有正確處理夏令時間，就很容易在安排會議或活動時出錯。</p>
<p>所以 Clockwise 在設計時，就把時區與 DST 這件事當成核心功能之一，而不是單純讓使用者自己手動設定時差。</p>
<p><strong>城市卡片與顯示方式</strong></p>
<p>我希望世界時鐘不要只是冷冰冰的一排數字。</p>
<p>所以 Clockwise 有城市卡片的概念，讓不同城市可以用比較直覺的方式呈現。未來也會持續調整卡片樣式，讓它更適合日常使用。</p>
<p><strong>Best Meeting Time</strong></p>
<p>這是我覺得比較實用的功能。</p>
<p>當你有多個城市或多個時區的人要開會時，最麻煩的就是找一個大家都還算可以接受的時間。</p>
<p>Best Meeting Time 的目的就是幫使用者快速找到比較適合的重疊時段。</p>
<p><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3823"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-34-37-976_com.abcb_.clockwise.jpg?resize=461%2C1024&#038;ssl=1"  alt=""  width="461"  height="1024"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-34-37-976_com.abcb_.clockwise-scaled.jpg?resize=461%2C1024&amp;ssl=1 461w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-34-37-976_com.abcb_.clockwise-scaled.jpg?resize=135%2C300&amp;ssl=1 135w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-34-37-976_com.abcb_.clockwise-scaled.jpg?resize=691%2C1536&amp;ssl=1 691w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-34-37-976_com.abcb_.clockwise-scaled.jpg?resize=921%2C2048&amp;ssl=1 921w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-34-37-976_com.abcb_.clockwise-scaled.jpg?resize=380%2C845&amp;ssl=1 380w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-34-37-976_com.abcb_.clockwise-scaled.jpg?resize=760%2C1689&amp;ssl=1 760w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-34-37-976_com.abcb_.clockwise-scaled.jpg?resize=270%2C600&amp;ssl=1 270w, https://i0.wp.com/edblog.net/wp-content/uploads/2026/01/Screenshot_2026-01-30-12-34-37-976_com.abcb_.clockwise-scaled.jpg?w=1152&amp;ssl=1 1152w"  sizes="auto, (max-width: 461px) 100vw, 461px" ></p>
<p>它不是要取代大型行事曆工具，而是讓你在規劃跨時區會議時，可以先有一個大概方向。</p>
<p>例如：</p>
<ul>
<li>台灣</li>
<li>美國西岸</li>
<li>英國</li>
<li>日本</li>
</ul>
<p>這幾個地方要一起開會時，就可以用這個功能快速判斷哪個時間比較合理。</p>
<h3 id="%e5%85%8d%e8%b2%bb%e7%89%88%e8%88%87-pro-%e7%89%88%e7%9a%84%e8%a8%ad%e8%a8%88">免費版與 Pro 版的設計</h3>
<p>Clockwise 有免費版，也有 Pro 版。</p>
<p>免費版主要是讓一般使用者可以先正常使用，不需要一開始就付費。對只需要看少數幾個城市的人來說，免費版其實就夠用了。</p>
<p>Pro 版則是給比較常使用世界時鐘的人，例如：</p>
<ul>
<li>需要加入更多城市</li>
<li>經常安排跨時區會議</li>
<li>想要更完整的自訂功能</li>
<li>不想受到免費版限制</li>
</ul>
<p>我自己比較不喜歡每個小工具都做成訂閱制，所以 Clockwise 的 Pro 版設計方向是偏一次買斷。對使用者來說比較單純，對我來說也比較符合這款工具的定位。</p>
<h3 id="%e9%96%8b%e7%99%bc%e9%81%8e%e7%a8%8b%e7%9a%84%e4%b8%80%e4%ba%9b%e6%83%b3%e6%b3%95">開發過程的一些想法</h3>
<p>Clockwise 是用 Flutter 開發的。</p>
<p>這幾年我自己做 App，大多會優先考慮 Flutter，原因是可以同時支援 iOS 和 Android，對一人開發來說比較實際。</p>
<p>不過世界時鐘看起來簡單，實際上還是有一些細節需要處理。</p>
<p>例如：</p>
<ul>
<li>不同地區的時區資料</li>
<li>夏令時間</li>
<li>城市搜尋</li>
<li>卡片排序</li>
<li>本地時間與目標城市時間的比較</li>
<li>UI 顯示是否夠直覺</li>
<li>免費版與 Pro 版的功能切分</li>
</ul>
<p>這些東西單獨看都不大，但真的做起來就會發現，小工具要做到好用，其實很多地方都要慢慢修。</p>
<p>這款 App 也算是我用 AI 輔助開發流程中的一個實戰案例。</p>
<p>現在我寫 App 時，會大量使用 AI 協助整理需求、拆功能、檢查程式碼、補文案、修錯誤。不過 AI 不是按一下就完成，很多時候還是要自己判斷功能怎麼切、問題在哪裡、使用者會怎麼操作。</p>
<p>所以對我來說，AI 比較像是一個很強的開發助手，但產品方向和最後的判斷還是要自己負責。</p>
<h3 id="%e9%81%a9%e5%90%88%e5%93%aa%e4%ba%9b%e4%ba%ba%e4%bd%bf%e7%94%a8%ef%bc%9f">適合哪些人使用？</h3>
<p>Clockwise 比較適合下面幾種使用者：</p>
<ul>
<li>常常需要看不同國家時間的人</li>
<li>有海外朋友或家人的人</li>
<li>遠端工作者</li>
<li>需要安排跨國會議的人</li>
<li>會玩國際服遊戲、需要看活動時間的人</li>
<li>常出國或常跟海外窗口聯絡的人</li>
</ul>
<p>如果你只是偶爾查一次時間，可能用 Google 搜尋就夠了。</p>
<p>但如果你每天都會看幾個固定城市的時間，那 Clockwise 會比較方便。</p>
<h3 id="%e5%b0%8f%e7%b5%90">小結</h3>
<p>Clockwise 不是一款很複雜的 App。</p>
<p>它比較像是一個日常小工具，目標是讓跨時區這件事變得簡單一點。</p>
<p>對我來說，這款 App 也是一個練習：如何把一個小痛點做成完整產品，然後真的上架、維護、調整，讓它變成可以被使用者下載和使用的工具。</p>
<p>接下來我也會陸續整理其他 App 的開發紀錄，包含 CycleNote、Rootrees、兔耳絲工具屋，以及我這段時間用 AI 輔助開發 App 的一些心得。</p>
<p>&nbsp;</p>
<p>雙平台下載連結：AppStore | <a href="https://play.google.com/store/apps/details?id=com.abcb.clockwise">Google Play</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3816/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3816</post-id>	</item>
		<item>
		<title>PHP Laravel 8 會員機制建置練習</title>
		<link>https://edblog.net/archives/3736</link>
					<comments>https://edblog.net/archives/3736#respond</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Fri, 16 Jul 2021 03:45:18 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3736</guid>

					<description><![CDATA[最近在學習Laravel這個框架，因為要建構一個後臺管理機制，所以想要採用JetStream。測試！ 在Lar ... <a title="PHP Laravel 8 會員機制建置練習" class="read-more" href="https://edblog.net/archives/3736" aria-label="Read more about PHP Laravel 8 會員機制建置練習">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>最近在學習Laravel這個框架，因為要建構一個後臺管理機制，所以想要採用JetStream。測試！</p>
<p>在Laravel 8 建立專案時直接加上參數</p>
<pre><code class="language-shell">laravel new 專案名稱 --jet</code></pre>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405777808.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3743"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405777808.jpg?resize=397%2C275&#038;ssl=1"  alt=""  width="397"  height="275"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405777808.jpg?w=397&amp;ssl=1 397w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405777808.jpg?resize=300%2C208&amp;ssl=1 300w"  sizes="auto, (max-width: 397px) 100vw, 397px" ></a></p>
<p>安裝時會詢問要哪種 stack，個人偏好用livewire，接著會詢問是否要teams，獨立開發的選no即可。</p>
<p>安裝完後到專案目錄底下執行</p>
<pre><code class="language-shell-session">npm install &amp;&amp; npm run dev</code></pre>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405941690.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3744"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405941690.jpg?resize=900%2C190&#038;ssl=1"  alt=""  width="900"  height="190"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405941690.jpg?w=964&amp;ssl=1 964w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405941690.jpg?resize=300%2C63&amp;ssl=1 300w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405941690.jpg?resize=740%2C157&amp;ssl=1 740w"  sizes="auto, (max-width: 900px) 100vw, 900px" ></a></p>
<p>好了之後記得調整專案下的 .env 檔做資料庫的連線相關設定，記得先建立資料庫。</p>
<p>最後執行</p>
<pre><code class="language-shell-session">php artisan migrate</code></pre>
<p>完成</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405948545.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3745"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405948545.jpg?resize=617%2C237&#038;ssl=1"  alt=""  width="617"  height="237"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405948545.jpg?w=617&amp;ssl=1 617w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626405948545.jpg?resize=300%2C115&amp;ssl=1 300w"  sizes="auto, (max-width: 617px) 100vw, 617px" ></a></p>
<p>接著測試一下專案是否正常 進入 https://localhost/test/public/</p>
<p>一切正常</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406124465.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3746"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406124465.jpg?resize=740%2C314&#038;ssl=1"  alt=""  width="740"  height="314"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406124465.jpg?resize=1024%2C434&amp;ssl=1 1024w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406124465.jpg?resize=300%2C127&amp;ssl=1 300w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406124465.jpg?resize=1536%2C652&amp;ssl=1 1536w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406124465.jpg?resize=740%2C314&amp;ssl=1 740w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406124465.jpg?w=1914&amp;ssl=1 1914w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406124465.jpg?w=1800&amp;ssl=1 1800w"  sizes="auto, (max-width: 740px) 100vw, 740px" ></a></p>
<p>接著進入登入畫面看看如何， 破破破~~破版了！  =.=|||</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406140267.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3747"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406140267.jpg?resize=740%2C342&#038;ssl=1"  alt=""  width="740"  height="342"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406140267.jpg?resize=1024%2C473&amp;ssl=1 1024w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406140267.jpg?resize=300%2C139&amp;ssl=1 300w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406140267.jpg?resize=1536%2C710&amp;ssl=1 1536w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406140267.jpg?resize=740%2C342&amp;ssl=1 740w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406140267.jpg?w=1894&amp;ssl=1 1894w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406140267.jpg?w=1800&amp;ssl=1 1800w"  sizes="auto, (max-width: 740px) 100vw, 740px" ></a></p>
<p>接著打開專案下的public/mix-manifest.json</p>
<pre><code class="language-json">{
    &quot;/js/app.js&quot;: &quot;/js/app.js&quot;,
    &quot;/css/app.css&quot;: &quot;/css/app.css&quot;
}
</code></pre>
<p>在 / 前面加上實際專案的路徑</p>
<pre><code class="language-json">{
    &quot;/js/app.js&quot;: &quot;http://localhost/專案名稱/public/js/app.js&quot;,
    &quot;/css/app.css&quot;: &quot;http://localhost/專案名稱/public/css/app.css&quot;
}
</code></pre>
<p>這樣就正常了<br />
<a href="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406548133.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3749"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406548133.jpg?resize=533%2C456&#038;ssl=1"  alt=""  width="533"  height="456"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406548133.jpg?w=533&amp;ssl=1 533w, https://i0.wp.com/edblog.net/wp-content/uploads/2021/07/1626406548133.jpg?resize=300%2C257&amp;ssl=1 300w"  sizes="auto, (max-width: 533px) 100vw, 533px" ></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3736/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3736</post-id>	</item>
		<item>
		<title>NGINX優化 – WARNING: [pool www] server reached pm.max_children setting</title>
		<link>https://edblog.net/archives/3649</link>
					<comments>https://edblog.net/archives/3649#comments</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Wed, 31 Oct 2018 07:10:13 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[主機相關]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3649</guid>

					<description><![CDATA[Nginx是俄羅斯人所編寫的十分輕量級的HTTP服務器，Nginx提供了一個高性能的HTTP和反向代理服務器。 ... <a title="NGINX優化 – WARNING: [pool www] server reached pm.max_children setting" class="read-more" href="https://edblog.net/archives/3649" aria-label="Read more about NGINX優化 – WARNING: [pool www] server reached pm.max_children setting">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>Nginx是俄羅斯人所編寫的十分輕量級的HTTP服務器，Nginx提供了一個高性能的HTTP和反向代理服務器。以小編習慣的用法是在ubuntu 安裝 LEMP (linux + nginx + mysql + php)環境。</p>
<p>在Nginx的環境裡面，定時檢視error.log是很重要的事情，這次小編就遇到了這問題。在 /var/log底下的php7.0-fpm.log裡面可以發現下列的錯誤。</p>
<h2 id="%e5%ae%9a%e6%9c%9f%e6%9f%a5%e7%9c%8bphp7-0-fpm-log">定期查看php7.0-fpm.log</h2>
<blockquote><p><strong>WARNING: [pool www] server reached pm.max_children setting (*), consider raising it</strong></p></blockquote>
<p>在處理php時，是Nginx直接調用php-fpm，如果請求量過高然後又沒有給<strong>php-fpm</strong>足夠的配置，就會有資源耗盡的可能，一旦找不到php-fpm，就會出現502的錯誤畫面。</p>
<p>這時候需要調整php的<strong>www.conf</strong>，如果是php7.0，位置會在 /etc/php/7.0/fpm/poo.ld/www.conf，而需要調整的部分如下，</p>
<blockquote><p><strong>pm.max_children</strong><br />
<strong>pm.start_servers</strong><br />
<strong>pm.min_spare_servers</strong><br />
<strong>pm.max_spare_servers</strong><br />
<strong>pm.max_requests</strong></p></blockquote>
<p>計算要調整的數量，則是需要依據Server上的記憶體進行調配。可以先查看每一個php-fpm使用的記憶體數量，可以用下列方式來查看。</p>
<p><code>ps -eo size,pid,user,command --sort -size | awk &#039;{ hr=$1/1024 ; printf(&quot;%13.2f Mb &quot;,hr) } { for ( x=4 ; x&lt;=NF ; x++ ) { printf(&quot;%s &quot;,$x) } print &quot;&quot; }&#039; | grep php-fpm</code></p>
<p>會跑出每一個php-fpm所需要的記憶體</p>
<blockquote><p>33.88 Mb php-fpm: pool www<br />
33.83 Mb php-fpm: pool www<br />
33.57 Mb php-fpm: pool www<br />
33.52 Mb php-fpm: pool www<br />
33.28 Mb php-fpm: pool www<br />
32.34 Mb php-fpm: pool www<br />
32.32 Mb php-fpm: pool www<br />
31.88 Mb php-fpm: pool www<br />
31.86 Mb php-fpm: pool www<br />
31.78 Mb php-fpm: pool www<br />
31.38 Mb php-fpm: pool www<br />
30.35 Mb php-fpm: pool www<br />
28.11 Mb php-fpm: pool www<br />
26.17 Mb php-fpm: pool www<br />
24.29 Mb php-fpm: pool www<br />
24.02 Mb php-fpm: pool www<br />
5.90 Mb php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)<br />
0.34 Mb grep &#8211;color=auto php-fpm</p></blockquote>
<p>這樣推算平均大概在30MB左右，如果Server的記憶體是4G來看，扣掉系統運作的部分，假設是3G來計算pm.max_children = 3072MB / 30MB = 102，所以每一個參數都要自己進行調整測試才可以找出符合自己Server的數量，別忘記，調整完畢之後記得要重啟服務。</p>
<p><code>sudo service php7.0-fpm restart</code></p>
<p>參考來源：<a href="https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/" rel="nofollow">https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/</a></p>
<p>本文同步發表在<a href="https://wpthemebook.com/">WordPress工具書</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3649/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3649</post-id>	</item>
		<item>
		<title>以WordPress實作imgur.com網站為例 (Part 5 – 前台登入)</title>
		<link>https://edblog.net/archives/3611</link>
					<comments>https://edblog.net/archives/3611#comments</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Mon, 07 May 2018 03:10:54 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Profile Press]]></category>
		<category><![CDATA[免費、免費空間、圖床、圖片]]></category>
		<category><![CDATA[登入]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3611</guid>

					<description><![CDATA[Part 5 算是最後一個部份了，從Part 1 到 Part 4 都是在介紹外掛及一些WordPress的設 ... <a title="以WordPress實作imgur.com網站為例 (Part 5 – 前台登入)" class="read-more" href="https://edblog.net/archives/3611" aria-label="Read more about 以WordPress實作imgur.com網站為例 (Part 5 – 前台登入)">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>Part 5 算是最後一個部份了，從Part 1 到 Part 4 都是在介紹外掛及一些WordPress的設定，當然最後一部分仍是透過外掛處理。這次要講解的是前台燈入的部分，一樣讓使用者都在前台登入，登入完畢之後一樣導回前台網站。</p>
<h2 id="%e5%89%8d%e5%8f%b0%e7%99%bb%e5%85%a5">前台登入</h2>
<p>在前面Part 2有使用到前台上圖的外掛，這款<a href="https://wordpress.org/plugins/wp-user-frontend/" target="_blank" rel="noopener">WP User Frontend</a>有Login的功能，可以調整登入的介面，強制使用者登入完畢之後回到特定頁面，下圖如設定的部分，可以在後台的[User Frontend] &gt; [Settings]找到。</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525657517937.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3618"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525657517937.jpg?resize=880%2C477&#038;ssl=1"  alt=""  width="880"  height="477"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525657517937.jpg?w=880&amp;ssl=1 880w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525657517937.jpg?resize=300%2C163&amp;ssl=1 300w"  sizes="auto, (max-width: 880px) 100vw, 880px" ></a></p>
<p>設定完成之後將 [wpuf-login] 填入分頁即可，如下顯示</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525659267223.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3619"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525659267223.jpg?resize=523%2C408&#038;ssl=1"  alt=""  width="523"  height="408"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525659267223.jpg?w=523&amp;ssl=1 523w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525659267223.jpg?resize=300%2C234&amp;ssl=1 300w"  sizes="auto, (max-width: 523px) 100vw, 523px" ></a></p>
<p>透過外掛的功能快速達到前台登入的功能，不過如果覺得登入介面不夠華麗，不夠漂亮，可以透過CSS來進行美化。或者使用另一款<a href="https://wordpress.org/plugins/ppress/" target="_blank" rel="noopener">ProfilePress Lite</a>外掛來達到前台搭入的效果，一樣先從官網的外掛進行下載安裝並且啟用，啟用完畢之後在左側選單會出現ProfilePress的功能清單。裡面有兩的部分，第一個部分是Login Form而另一個部分是Registration Form。</p>
<p>進入Login Form之後可以看到如下的畫面，已經有建立好三種登入樣式，可以快速使用。</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525660572396.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3620"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525660572396.jpg?resize=874%2C490&#038;ssl=1"  alt=""  width="874"  height="490"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525660572396.jpg?w=874&amp;ssl=1 874w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525660572396.jpg?resize=300%2C168&amp;ssl=1 300w"  sizes="auto, (max-width: 874px) 100vw, 874px" ></a></p>
<p>接下來將上面隨便一個ShortCode貼入登入的頁面即可，每個登入介面都經過設計，可以直接使用喔！</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661136486.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3622"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661136486.jpg?resize=813%2C360&#038;ssl=1"  alt=""  width="813"  height="360"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661136486.jpg?w=813&amp;ssl=1 813w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661136486.jpg?resize=300%2C133&amp;ssl=1 300w"  sizes="auto, (max-width: 813px) 100vw, 813px" ></a> <a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661034485.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3623"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661034485.jpg?resize=404%2C384&#038;ssl=1"  alt=""  width="404"  height="384"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661034485.jpg?w=404&amp;ssl=1 404w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661034485.jpg?resize=300%2C285&amp;ssl=1 300w"  sizes="auto, (max-width: 404px) 100vw, 404px" ></a></p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661105895.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3624"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661105895.jpg?resize=329%2C507&#038;ssl=1"  alt=""  width="329"  height="507"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661105895.jpg?w=329&amp;ssl=1 329w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525661105895.jpg?resize=195%2C300&amp;ssl=1 195w"  sizes="auto, (max-width: 329px) 100vw, 329px" ></a></p>
<h2 id="%e5%89%8d%e5%8f%b0%e8%a8%bb%e5%86%8a">前台註冊</h2>
<p>註冊的填入的表單也是一樣，如下所顯示，將註冊表單的ShortCode填入註冊的頁面即可，這樣就大功告成。</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525660588634.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3621"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525660588634.jpg?resize=868%2C490&#038;ssl=1"  alt=""  width="868"  height="490"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525660588634.jpg?w=868&amp;ssl=1 868w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/05/1525660588634.jpg?resize=300%2C169&amp;ssl=1 300w"  sizes="auto, (max-width: 868px) 100vw, 868px" ></a></p>
<p>以WordPress為基礎來架設社群的服務基本上都是沒有問題，而是取決要用哪一種方式來達成。艾德覺得市場上的變化很快，用WordPress以最快的速度將服務推出來到市場試水溫更為重要。</p>
<p>以WordPress實作imgur.com的系列文章，講解得很快，有不懂的地方可以發問，也請多多指教！</p>
<ul>
<li><a href="https://edblog.net/archives/3611" target="_blank" rel="noopener">以WordPress實作imgur.com網站為例 (Part 5 – 前台登入)</a></li>
<li><a href="https://edblog.net/archives/3594" target="_blank" rel="noopener">以WordPress實作imgur.com網站為例 (Part 4 – 圖片管理及選單權限)</a></li>
<li><a href="https://edblog.net/archives/3586" target="_blank" rel="noopener">以WordPress實作imgur.com網站為例 (Part 3 – 圖片網址)</a></li>
<li><a href="https://edblog.net/archives/3563" target="_blank" rel="noopener">以WordPress實作imgur.com網站為例 (Part 2 – 前台上圖)</a></li>
<li><a href="https://edblog.net/archives/3551" target="_blank" rel="noopener">以WordPress實作imgur.com網站為例 (Part 1 – 淺談架構)</a></li>
</ul>
<p>若對於WordPress有興趣的可以與我聯繫。</p>
<p>edl2000(小老鼠)gmail達康</p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3611/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3611</post-id>	</item>
		<item>
		<title>以WordPress實作imgur.com網站為例 (Part 4 – 圖片管理及選單權限)</title>
		<link>https://edblog.net/archives/3594</link>
					<comments>https://edblog.net/archives/3594#comments</comments>
		
		<dc:creator><![CDATA[Eduardo]]></dc:creator>
		<pubDate>Mon, 16 Apr 2018 09:55:18 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[if Menu]]></category>
		<category><![CDATA[W4 Post List]]></category>
		<category><![CDATA[免費]]></category>
		<category><![CDATA[免費空間]]></category>
		<category><![CDATA[圖床]]></category>
		<category><![CDATA[圖片]]></category>
		<guid isPermaLink="false">https://edblog.net/?p=3594</guid>

					<description><![CDATA[Part 3的部分處理完圖片網址之後，接下來要將主選單的部分進行權限管理。以免費的圖片空間服務來看，會區分兩種 ... <a title="以WordPress實作imgur.com網站為例 (Part 4 – 圖片管理及選單權限)" class="read-more" href="https://edblog.net/archives/3594" aria-label="Read more about 以WordPress實作imgur.com網站為例 (Part 4 – 圖片管理及選單權限)">閱讀全文</a>]]></description>
										<content:encoded><![CDATA[<p>Part 3的部分處理完圖片網址之後，接下來要將主選單的部分進行權限管理。以免費的圖片空間服務來看，會區分兩種權限。第一種是有登入的情況下上傳圖片，可以自己管理上傳的圖片，也比較好找到資料；而另一種就是不需要登入就可以上傳圖片，未登入的情況下就無法彙整自己上傳過的資料。</p>
<h2 id="w4-post-list%e5%a4%96%e6%8e%9b%e4%bd%bf%e7%94%a8">W4 Post List外掛使用</h2>
<p>首先，要建立個人資料的頁面，也就是顯示已經登入的使用者，可以查看自己上傳過的圖片。本次要使用的外掛是<a href="https://tw.wordpress.org/plugins/w4-post-list/" target="_blank" rel="noopener noreferrer">W4 Post List</a>，這外掛是免費的，可以在<a href="https://tw.wordpress.org/plugins/w4-post-list/" target="_blank" rel="noopener noreferrer">WordPress官方的Plugin</a>找到，一樣先下載進行外掛安裝並且啟用外掛。啟用之後可以在左側選單找到</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523851245634.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3595"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523851245634.jpg?resize=199%2C137&#038;ssl=1"  alt=""  width="199"  height="137" ></a></p>
<p>點選Add New之後開始新增列表。這邊要注意的是，目前是使用Divi內建的Post Type，所以選擇第一個Post的部分，Preset選擇Post with Thumbnail，也就是有使用縮圖做顯示。</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523855151414.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3597"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523855151414.jpg?resize=879%2C244&#038;ssl=1"  alt=""  width="879"  height="244"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523855151414.jpg?w=879&amp;ssl=1 879w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523855151414.jpg?resize=300%2C83&amp;ssl=1 300w"  sizes="auto, (max-width: 879px) 100vw, 879px" ></a></p>
<p>再來切換到List Type下方的Posts，因為使用內建的Post Type，所以就要選擇對應的名稱，請將Projects打勾。Post Status為文章狀態，將Publish(發佈)的打勾，好了之後發佈即可。</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523855170215.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3596"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523855170215.jpg?resize=685%2C395&#038;ssl=1"  alt=""  width="685"  height="395"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523855170215.jpg?w=685&amp;ssl=1 685w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523855170215.jpg?resize=300%2C173&amp;ssl=1 300w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523855170215.jpg?resize=327%2C190&amp;ssl=1 327w"  sizes="auto, (max-width: 685px) 100vw, 685px" ></a></p>
<p>接下來再W4 Post List的列表頁上面可以取得ShortCode</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523861510738.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-large wp-image-3598"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523861510738.jpg?resize=688%2C202&#038;ssl=1"  alt=""  width="688"  height="202"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523861510738.jpg?resize=1024%2C300&amp;ssl=1 1024w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523861510738.jpg?resize=300%2C88&amp;ssl=1 300w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523861510738.jpg?w=1038&amp;ssl=1 1038w"  sizes="auto, (max-width: 688px) 100vw, 688px" ></a></p>
<p>複製ShortCode的內容，然後點選左側的[頁面] &gt; [新增頁面]，再內容的部分填入剛剛複製的ShortCode。</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523863194098.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3599"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523863194098.jpg?resize=685%2C392&#038;ssl=1"  alt=""  width="685"  height="392"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523863194098.jpg?w=685&amp;ssl=1 685w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523863194098.jpg?resize=300%2C172&amp;ssl=1 300w"  sizes="auto, (max-width: 685px) 100vw, 685px" ></a></p>
<p>如此一來就完成囉！前台的頁面您可以透過CSS定義樣式即可。</p>
<p>接下來要處理主選單的部分，這裡講到的權限是有登入的情況下可以看到我的圖片，也就是剛剛透過W4 Post List做的頁面。基本上那一個頁面已經有判斷是否有登入狀態了，所以未登入的情況下點進去是顯示全部的圖片，有登入的情況下則是顯示自己的圖片。不過在選單上我們還做些處理，接下來將使用if Menu這套外掛來進行設定。</p>
<h2 id="if-menu%e5%a4%96%e6%8e%9b%e4%bd%bf%e7%94%a8">if Menu外掛使用</h2>
<p>介紹一下這款外掛，外掛名稱看起來大概就知道這功能是甚麼，if 在程式裡面都是做判斷用的，menu就是要顯示的選單(廢話 XD)。一樣到<a href="https://tw.wordpress.org/plugins/if-menu/" target="_blank" rel="noopener noreferrer">WordPress的官網外掛區進行下載</a>，再進行外掛安裝並且啟用外掛。</p>
<p>外掛啟用之後在外觀裡面可以找到設定，這邊設定是調整管理者是否要看到隱藏的選項。打勾，那麼管理者就會在前台看的到隱藏項目，不打勾則無法看到，就只是測試用而已。</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523866604999.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3600"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523866604999.jpg?resize=744%2C222&#038;ssl=1"  alt=""  width="744"  height="222"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523866604999.jpg?w=744&amp;ssl=1 744w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/1523866604999.jpg?resize=300%2C90&amp;ssl=1 300w"  sizes="auto, (max-width: 744px) 100vw, 744px" ></a></p>
<p>接下來就是主要的部份，直接到[外觀] &gt; [選單 ]，下方用<a href="http://imgnow.cc" target="_blank" rel="noopener noreferrer">imgnow.cc</a>的做展示設定。</p>
<p>可以看到我的圖片這個選單，有一個Change menu item visibility，也就是改變選單項目的可見度，點選之後可以有不同的條件搭配。</p>
<p>第一個下拉選單有Show 跟 Hide</p>
<p>第二個下拉選單有很多，可以參考畫面顯示。</p>
<p>這邊設定Show &gt; User is logged in，也就是只有在登入狀況下才會顯示這個選項。</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/879971225594-1.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3603"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/879971225594-1.jpg?resize=458%2C485&#038;ssl=1"  alt=""  width="458"  height="485"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/879971225594-1.jpg?w=458&amp;ssl=1 458w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/879971225594-1.jpg?resize=283%2C300&amp;ssl=1 283w"  sizes="auto, (max-width: 458px) 100vw, 458px" ></a></p>
<p>好了存檔即可，接下來測試看看前台畫面，上方為登入情況下顯示，下方為未登入的時候顯示。</p>
<p><a href="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/logged_in.jpg?ssl=1"><img data-recalc-dims="1"  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-3604"  src="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/logged_in.jpg?resize=641%2C182&#038;ssl=1"  alt=""  width="641"  height="182"  srcset="https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/logged_in.jpg?w=641&amp;ssl=1 641w, https://i0.wp.com/edblog.net/wp-content/uploads/2018/04/logged_in.jpg?resize=300%2C85&amp;ssl=1 300w"  sizes="auto, (max-width: 641px) 100vw, 641px" ></a></p>
<p>這樣就完成了查詢使用者上傳圖片的功能以及選單判斷登入顯示！</p>
<p>Part 5: <a href="https://edblog.net/archives/3611">以WordPress實作imgur.com網站為例 (Part 5 – 前台登入)</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://edblog.net/archives/3594/feed</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3594</post-id>	</item>
	</channel>
</rss>
