作者: Jerry Lin

  • 2025-07-29 社交模式檢討

    2025-07-29 社交模式檢討

    整理回想一些這週的對話,在檢討也許自己應該開始正視一些問題,筆記下來,忘記就算了。

    很容易把自己代入「身為標準」這件事。

    在面對情緒比較滿(e.g. 深綠或是仇恨民進黨在某些事件觸發的時)的族群,下意識會覺得「那你應該知道很多」或是「那你應該在相關領域懂得很多」的期待下,導致對話中自己的耐心降低很多,期待落差帶來的憤怒也很容易把自己推向對立面。 這個狀況似乎滿嚴重的,而且不太容易發現,尤其是對方比較愛面子的時候,現在回想起來不只這一兩週,好像在過去工作或是公共事務的看法討論上滿常見的。

    能夠解決的方法除了把那個覺得自己是永遠的 59 分這種畸形的心態給拋棄之外,可能需要觀察對方異常的行為模式,常見的有:

    1. 事實認知有錯、觀點愚昧偏激:可能是誤會、洗腦、被騙,或是他才是對的
    2. 互動認知有錯:可能是雙方身心狀況不好,或是雙方表達與接收的能力有問題。
    3. 觀點荒謬:可能是對想要抖包袱,或是他真的情緒非常滿;他是真的笨,或是真的是天才。
    4. 事實與觀點無法分離:雙方媒體識讀能力低落;情緒太滿。
    5. 對方立場、目的或利益差距很大:可能有相同觀點但是立場與目的不相同的,尤其觀察利益流向可以明確確認。

    目前想到的解法是不要跟上,先緩一下,也不要追求有趣的回覆(對方大概也接不住)。然後如果可以的話透過詢問確認他是不是不熟悉 / 不清楚或是裝懂。這塊應該會是一個很複雜的工程,尤其各種狀況下自己也自認不是很通透的話,可能需要就事實內容多釐清。就相同事實內容產生觀點會比較清晰,尤其在不同立場的狀況下會比較保險。主要避免先接收到觀點時對於對方的立場、背景價值觀等有太多的想像導致將其標籤化、群體平面化。還有一個很需要主動確認的是對方的利益所在,在公眾議題方面,我的基本概念及是「政治是所有人利益組成;民主政治作為小單位是利益團體;利益團體由我國公民組織而成」,所以釐清背後利益團體所產生的立場是很重要的,這應該會比釐清他的能力還難一些,光是社會環境中,能夠讓一個人保持利益是始終不變的就已經很困難了,言行合一的人更少,可能得是很要好,知根知底的朋友比較容易抓的出對方利益所在。

    而延伸一點,常常會看見其他人指責對方的利益和圖謀等,通常也有可能有其他細節,需謹慎。對於工作來說,也許盡可能讓利益單純一些會是一件好事,這也意味著要處理好人情世故和上下級關係等問題。

    重點是:覺察到的時候保持距離、釐清事實、釐清利益、接收 / 闡述觀點。

    如果對方能力低落,那麼能不斷加深驗證「對方情緒很高漲並非有足夠背景支撐,只是正義感或衝動而已。」、「自己懂得滿多的,對方觀點有問題不是我的錯」或是應該需要考慮是否有溝通的價值。 需要注意即便沒有價值,也許對方在某個領域也是非常有價值的,妖魔化對方是變成邪教徒的一個步驟,即便對方連價值觀都是有問題的,或是他是一個壞人/間諜,- 對方終究也是一個活生生的人類。

    以上僅獻給有聊天到的朋友。也感謝這些對話,我才有機會釐清自己,以後有機會對話應該能夠有更和緩的情緒和理性的思維。

  • 2025-07-25 社交模式檢討

    2025-07-25 社交模式檢討

    2025-07-25

    鬼門開了快一半,也是我在 threads 上關門快一半的時日。覺得 threads 演算法真的是一個很有趣的機制,算是 Twitter(現為 X) 的入門磚? 鑑於社群網站逐漸變成訊息收取的管道之一,我覺得應該得認真考慮將這些社群平台作為資訊來源的管道,作一個久違的有系統的整理才行。

    我想自己打造一個適合我的資訊生態,目標有幾個:

    1. 建立在身心健康的前提下能取得更多元的觀點和訊息的管道,避免訊息閉塞。
    2. 如果無法分離,能夠打造一個足以整合,或銜接工作、休閒和交際的環境。
    3. 建立一個健康的社會關係網,讓自己最小限度維持社交。

    基本上自己目前的價值觀應該不會太幼稚,但即便所謂「對事不對人」,在 System1 的層級,還是需要有幾個優先得排除的污染源:

    • 宣告的意圖與行為不符的人。 這樣的人可能另有目的,但是卻意圖隱藏,這會有問題。
    • 仇恨族群的人。通常是偏激仔,立場偏激的人如果行為激進會變得很可怕,要保持距離。
    • 意圖想求偶的同性。無論是否是異性戀,往往想求偶的同性都好可怕。除了培養包容,也要避免因此捕捉到各種嫉妒、競爭、鄙夷等各種負面情緒。

    再來是如果身邊有已經結交的朋友或是追蹤的帳號等,有幾個需要篩選的原則應該也需要謹慎考慮:

    • 言行不一的人。某個程度上,需要和他討論是否存在誤會?
    • 無法進行討論的人。如果無法建立有效的討論機制,除了未來該領域不要去談論之外,是否與之有交集,也是要考慮的部分。
    • 善於把負面能量拋出來的人。常見的行為是潑冷水和負面情緒充沛,或是以仇恨驅動的人,需要釐清他是表達能力不好還是身心出了問題。
    • 邪教徒,符合一些邪教行為標籤的,要特別注意保持距離。
    • 資訊異常閉塞的人。可能會與期待有關,通常會發生在被洗腦或是的人身上。
    • 很有正義感的人,需要釐清他是衝動還是有想法。

    以上除了篩選也要注意不要自己把自己篩選掉了。再來列出我應該要多接觸的人們:

    • 對自己慾望誠實的人,能夠控制自己慾望的人。
    • 有弱點的人,也能夠清楚自己的弱點的人。
    • 有追尋的目標的人。這種人總是能夠在他的領域發光。
    • 有專業技能的人,且有慾望而能不斷進步的人。

    有想到再補充。

    我想作一個實驗,整理的我在網路上的社交圈然後在梳理自己線下的交友圈。也許能夠把網路上帳號全部都解除封鎖等,再重新整理過一次?

    線上的部分,慶幸自己沒有小紅書或斗音那些平台,Meta 的機制在其他社群應該也能類似通用,先暫時以他擁有的功能應用為主。

    • 封鎖:假帳號、詐騙、廣告
    • 噤聲:看不下去的仇恨與愚昧、不感興趣的商業帳號、張爸
    • 限制:騷擾、想要保持距離、不感興趣的商業帳號、張爸
    • 追蹤原則:崇敬或能夠帶來收穫的人、正妹
    • 留言原則:對原 PO 有幫助的、想要留下足跡、覺得有趣的

    以上也許可以套用在現實生活中。線下的部分,要整理出哪些人應該多聯絡、哪些人應該保持距離,哪些人應該不要聯絡比較好,也應該會有一票人,必須得提醒其他人避免接觸。總歸是自己的課題,會影響到自己的。

    網路上或現實中,要注意幾個自己的壞習慣:

    1. 要小心自己的留言與回覆,不要輕易留言,尤其是當情緒是負面的時候。
    2. 當有負面情緒的時候要停止輸出。負面情緒會加強肉體的強度,但是會損耗精神。
    3. 對話中不一定需要追逐有趣,有趣的回應並非是對方期待,可能會造成期待落差。

    也有幾個要追求的對話 / 社交模式:

    1. 學會 30 秒到一分鐘的電梯聊天方法。
    2. 找到一個能夠替換掉自污求保的策略。
    3. 必須要持續追求口條和能量,這是一個長遠要努力的方向。
    4. 找到一群人聊天時也能參與話題的策略或模式。

    好,努力試試看。

  • 2025-07-12 N8N Workshop 筆記心得

    2025-07-12 N8N Workshop 筆記心得

    N8N Workshop 筆記心得

    主講:
    @ironv.careerlife@darrell_tw_

    久久上一次課,這次是嘗試透過線下課程了解 N8N 的特色、用法、優缺點和使用技巧。以下是我的主觀觀點與整理。

    先說結論:

    1. N8N 定義為 GUI 介面的自動化管理工具。有其便利性,也有門檻:在於介面詞彙和結構的熟悉掌握。
      需要熟悉個個節點如何操作,還有第三方服務如何操作。
    2. N8N 是由節點組成,以軟體工程來說,每個節點具備一個系統的基本結構,透過自動化需要的元素,組成成自動化工具的用途。
    3. N8N self-host 是社區版,自用以上,商用未滿。

    幾個自己私人小檢討:

    1. 英文聽寫要加強。
    2. 必須多與同一個領域的人聊天社交,自己一個人工作久了突然要講話,很多詞彙會卡住。

    課程內容部分,主要是先引言介紹了 N8N 的應用場景,介紹了一些工具,再來實作幾個 case ,可惜時間不夠,並沒有執行小組討論的環節。

    Outline

    1. 工具介紹
    2. 我對自動化的理解
    3. 我對 N8N 的理解
    4. 透過 Case 中學到 N8N 的部分眉角與注意方向

    工具介紹

    以下是課程中介紹到的工具或書籍

    《把時間買回來》

    DRIP 四個象限:委派、取代、投資和生產。簡單講就是時間應該花在對身心錢包健康的地方。

    BAR 原則。什麼東西該自動化:

    1. Bother – 麻煩與無聊的事情該自動化
    2. Added-value – 自動化應該降低成本、增加效率
    3. Repetitive – 重複性高的事項該自動化

    OWL (貓頭鷹大法) 自動化的規劃步驟:

    1. Objective:先確認目標
    2. Workflow:規劃流程
    3. Limit & Questions:確認限制與問題,處理 B Plan

    e.g.

    • 寫程式順便背英文單字 QAQ 所以用 n8n ,這就是 BAR 原則(誤)
    • 自動化是被規劃好的,掌握 OWL 實作避免過度設計或腦袋不清楚亂做。

    Datacamp

    https://www.datacamp.com

    資料學習的網站。透過互動課程、真實專案和業界認可的認證掌握 Python、ChatGPT、Power BI 等熱門技能。

    Apify

    https://docs.apify.com
    https://docs.apify.com/api/v2/

    爬蟲 API 付費市場。
    據課程介紹,我理解他的流程是:(手動或自動)執行爬蟲 -> 取得 dataset -> (webhook trigger)透過 API 取得 dataset 內的資料。屬於非同步的呼叫方式。

    Zeabur

    近年興起的台灣新創,我理解有點像是進化的 Cloudways 服務,老闆人很好,客服服務不錯,繁體中文友善。主打使用 AI 雲端部屬,請大家多多支持。

    我對自動化的理解

    通常的行為模式應該是:
    執行一個項目 -> 發現他會重複執行 -> 產生一套 SOP -> 覺得花時間(評估) -> 優化 SOP -> 想要降低成本/增加效率(評估) -> 尋找替代方案 -> 找到替代方法。

    在兩個評估點之間會不斷來回,這時應該考慮自動化的可行性。

    自動化的目的是為了把時間空出來,基於「把時間空出來」目的,我們會發現有幾個可行的方案:

    1. 外包做工具自動化
    2. 自己做工具自動化
    3. 招一個職缺/外包來作

    第三個方法往往都是傳產常常會做的事情,在數位化興起之後,開始有能力的人嘗試寫程式自動化,然而降低成本這件事情是人心所向,於是各種自動化工具面對不同需求產生。我認為,對於自動化的工具是可以依照需求導向與成本導向並行,而且有需求再研究就好,甚至說不定便宜人力比研究自動化工具還划算。然後重要的應該是需要保持對「自動化」這個需求的警覺,還有必須要想辦法創造餘裕來研究任何新事物,包括自動化工具的時間與能力。創造餘裕是一種富有的表現,所以也必須要小心落入時間的貧窮陷阱。

    我對 N8N 的理解

    自動化的工具不少,要考慮的點不外乎是時間成本和維護成本, N8N 的優點與缺點:

    優點

    1. 透過節點組成,如果是 z 世代小朋友,小時候有上過程式課應該有遇到像是樂高積木的那種程式工具,我理解兩者滿像的,會更豐富一些,如果有學過那類型的程式工具 N8N 應該會格外親切。
    2. 社區版原始碼免費,應該是同款自動化工具裡面架設成本最低的。而且其他第三方應用的費用,皆照官方計價,沒有二房東的費用。
    3. 基本自動化該有的節點(模組)都有了,對於個人使用很方便,甚至市面上已經有一套完整的教學產業,上手不是困難的事情。
    4. 第三方功能的節點豐富,舉凡 Google, Telegram, Line 等都能實現。
    5. GUI 介面好處是寫的好的話,看 Logs 或是看 status 都很方便,而且不用一直打字。 N8N 算是寫的好一款應用程式。

    缺點

    1. 商用的話需考慮授權,這塊要賣的時候要特別注意是否侵權。
    2. 計價和使用方式是雙面刃,便利性的同時代表設定要自己處理,同時價格也需要個別服務分開看好。
    3. 學習曲線較其他產品陡峭。這是高可塑性的代價,相對複雜許多。

    個人主觀抱怨

    1. 個人不是很習慣 N8N GUI 的樣子,誤會了兩三次,不過可能也是因為實作的項目領域不是很熟悉導致。
    2. 我討厭 Google API 設定也太阿雜還變來變去的,這是長年來的抱怨。還好有 Meta 坦著你又便宜,哼,真香。
    3. GUI 自動化最怕遇到有異常,不知道發生什麼事情的狀況,整堂課程遇到兩次,慶幸 N8N 給的資訊還算完整,還好最後能夠處理掉。
    4. 這類型自動化操作除非是以代辦作為職業,否則很難變得熟悉,一般應用都是設定一次完就不會想要花太多時間維護他了,所以萬一他不穩定,或是自己規劃錯誤,導致花了很多時間去摸索,變得很熟悉,這樣不是挺悲哀的嗎?

    一些相關的經驗

    其實也是寫程式的經驗,套用而已。

    1. 資安要處理好,安全這種東西沒有在含扣的。通常自稱程是小白的人 3C 或是軟體服務也是小白,建議跟官方客服問清楚或是找工程師好友諮詢清楚。比較怕的是不懂卻自認很會用服務的人,這種人達克效應高漲,不要靠近我。
    2. 「設定」的時候會被細節困住,建議遵循 OWL 原則,就像是辦一個活動或是拍攝一檔節目一樣,企劃流程分鏡先規劃好,活動預達目標與單項預達目標條列清楚,細節都是為了實現我們的每個小目標。花的時間和架設費用等都是成本,眼光應放遠。
    3. 不要過度設計,不要過度設計,不要過度設計。還有,適當的資安規劃不叫「過度設計」。 常見的、重要的資安態度是:不要給系統多餘的功能或能力、不要讓系統有多餘的輸入和輸出,以及不要給不需要的人看到和更動系統的權限。

    結論

    1. N8N 是給腦袋清楚的人用的。市面上有更多無腦工具,差別在你要付出的代價不一樣。
    2. 要搞清楚每個節點用途,使用方法。我建議先嘗試把目前「可行」的自動化功能建立起來,再慢慢擴展,如同上述自動化的行為模式一樣,先解決一部分問題,保持對效能的不滿意,有欲望有進步。

    透過 Case 中學到 N8N 的部分眉角與注意方向

    課程中實作了兩個案例,分別是透過 Gmail 匯入財政部發票資料儲存至 Google Sheet,利用 AI 整理摘要;透過 Apify 服務爬取 Linkedin 資料,並且利用 AI 產出客製化履歷。

    時間有限後面有些細節是口述方式帶過,而我的目標是了解 N8N 特色與需要熟悉的方向,足已。以下總結有記錄到的內容:

    N8N 是由節點,透過資料流(傳遞)達成目的

    大致上理解一個大系統裡面很多小系統,就是拼圖寫程式的意思。細節還是每個節點都是參數化操作,需要一定熟悉比較好操作,與理解如何使用第三方的應用。

    常見自動化實作:

    1. 個人工作流程、日常生活流程(發票、記帳)
    2. 求職與人資資料整理
    3. 行銷與社群回覆
    4. 大數據資料(e.g. 金融資料、股市分析)整理
    5. AI 語言教練

    N8N 操作節點,四大類節點

    1. Triggers – 觸發行為
    2. Order – 執行指令(Actions)
    3. Trans – 資料調整
    4. Logic – 條件

    我認為比較常用的有類似:

    1. 觸發節點 On… 動作或是 When… 什麼動作。
    2. Extract 相關節點 從上一個資料源取得。
    3. Edit Fields 整理資料用的。
    4. switch 這是邏輯節點之一。

    另外有些像是寄信、儲存至 sheet 等動作,需要實作串接第三方服務(e.g. Google Sheet),建議研究專門的節點來實現。如果你爽也可以使用支援 JavaScript 或 Python 實作。

    第三方服務舉例

    一、課程中使用到 Apify 服務是除了 Google 之外較為複雜的流程,他操作步驟如下(我理解的視野):

    1. 建立 Apify Webhook 取得 dataset
    2. 利用 dataset ID 取得 post API
    3. N8N 設定好 Webhook Trigger 與 post API 節點,取得資料繼續應用。
    4. 觸發 Apify 以後 N8N 依照 Webhook 觸發動作。

    同時我會比較,在理解運作流程的狀況下,如果我用 ts 或 py 撰寫會不會寫的比較快?同時也要考慮後續維護對象以及維護的時間成本。

    二、課程中使用了 Google 服務,我遇到一個很啊雜的問題,特別筆記起來作為怨念碑:

    1. 使用 Sheet API 要開 Drive API 要不然無法 list。
    2. Google 專案數量設定有上限。
    3. Google 帳戶角色切換爛透了。

    我還一直以為是不是前幾年用舊版 Project 抓 Youtube API 被官方降 limit 導致被懲罰。好啦,免費的講完就沒事了。Gemini 棒棒!

    其他有些串接的操作,像是 OpenAI 應用,我覺得操作不難,難點在 prompt 或是 system message 怎麼處理。

    想一些賺錢的 Idea

    這是我上課時候想到的,有興趣可以做做看:

    1. 低成本自動架設網站服務
    2. 新聞資料整理
    3. 搶票搶場地(by 刑法賺錢總綱
    4. KOL 輿情分析
    5. 優化/低成本智慧家電控制

    以上。

  • 我的威力彩夢。Telegram 樂透彩機器人

    我的威力彩夢。Telegram 樂透彩機器人

    在 2025 年 6 月 24 日台灣威力彩頭獎講落台中市西區(新聞),威力彩夢碎,大概是因為我的報明牌機器人沒做好所以才選不中頭獎(才怪)。

    以下謹此紀錄實現 RAG 的一個專項聊天機器人。

    *未來可能會繼續更新,如果有不符合功能的部分,那就是修改或移除了。

    貼上一下功能:

    • Telegram Bot 互動,支援樂透相關問題詢問。
    • 自動判斷使用者輸入意圖(使用 AI intent detection)。
    • 中文/英文翻譯(使用 OpenAI GPT-4o-mini)。
    • 利用 Cloudflare AutoRAG 查詢樂透彩歷史資料庫,快速回覆查詢。
    • 針對查詢結果自動翻譯回使用者語言(預設繁體中文)。
    • 動作紀錄與使用統計,包含每月查詢次數與 OpenAI Token 用量。
    • 支援白名單管理,限制可使用者範圍。
    • 指令支援:/start/help 等。

    另外他能設定白名單,所以機器人只會給允許的帳號使用。

    並且同步附上 deepwiki 連結:

    原則上技術細節都寫在 README 上面,這邊負責寫感想心得這樣。我主要的目的是為了實作 RAG 的功能和測試 ChatGPT Desktop 控制 VS Code 的功能。RAG 部分參考了 OpenAI、AnythingLLM、gpt4All 與 Cloudflare 服務,最後選擇了使用 Cloudflare ,考慮的因素有:

    1. 放在雲端、整合方便
    2. AI 和我都熟悉技術結構
    3. 價格相對便宜
    4. Cloudflare 的 RAG 可選擇 embedding model
    5. 未來擴充或改寫比較方便

    也有推力,包含了:

    1. Cloudflare RAG 還在測試階段,可能不穩定
    2. Cloudflare 目前僅支援 R2 的儲存庫,尚不支援 D1 等服務。

    這個機器人主要實現在 Telegram 上,以 Cloudflare 實現, RAG 的技術其實很多 AI 服務都有,主要是 Cloudflare Worker 整合串接會相對方便,再來 Vibe Coding 也較熟悉方便。以結果來說,我認為如果要作統計功能,或是需要操作已經結構化的數據,應該還是採用機器計算的方式比較好。 AI 的創造力可能會造成不穩定的因素,這不太能夠應用在統計與數學功能上。 而 RAG 的向量資料庫,比較適合文字影像和語意分析等場景,可能在儲存與使用上,應該透過 RAG 和 MCP 或是中間有自動化流程來組合比較妥當。

    簡單講就是賽道和設計的結構有問題。

    ChatGPT Desktop 控制 VS Code 的功能在實務上還滿怪的,就像 ChatGPT Desktop 要開啟 Canvas 畫布總是不盡人意一樣,有時候會懷意自己是不是連話都說不清楚。時靈時不靈的,如果有機會應該要來看一下 OpenAI 相關的 prompt 工程教學才行。

    這是一個 LM 的創意與機器固定規則之間的拉扯。我認為策略和結構會是以後程式設計師遇到的大課題,像是 7-11 店員一樣,要開始把各領域的 knowhow 包起來,還是得要更多工具幫助自己 loading 更小才行。

    附上〈向量資料庫與關聯資料庫差異與應用場景〉:

    一、比較表

    比較項目向量資料庫關聯資料庫
    資料型態高維向量(如 128 維、512 維、1024 維)結構化資料(表格、行列)
    儲存內容向量表示(embedding),來自文本、影像、聲音等傳統業務資料,如使用者資料、訂單、產品等
    查詢方式相似度搜尋(Nearest Neighbor Search, ANN)精確查詢(SQL)基於條件過濾
    索引技術專門近似鄰居搜尋索引(如 HNSW、IVF、PQ)B-tree、Hash 索引等
    擴充性擅長大規模非結構化高維資料的快速搜尋擅長複雜關聯查詢和交易型應用
    一致性與交易通常不保證 ACID 交易完整 ACID 支援,適合金融、電商等核心系統
    典型應用場景文字搜尋、影像搜尋、推薦系統、語意分析ERP、CRM、電商訂單管理、財務系統
    優勢處理語義相似度與非結構化資料,支持模糊搜尋結構化資料管理、複雜查詢、多表關聯
    缺點不適合複雜交易與結構化關聯資料查詢不擅長處理非結構化大規模向量資料

    二、詳細說明

    向量資料庫

    • 用途:處理 AI 模型生成的向量化資料,如 NLP、影像辨識。
    • 應用範例
    • 搜尋引擎:語意搜尋文章或問題。
    • 電商推薦:根據用戶行為向量推薦商品。
    • 聊天機器人:匹配相似對話內容。
    • 技術代表
    • Milvus、Pinecone、Weaviate、FAISS(Facebook AI Similarity Search)

    關聯資料庫

    • 用途:管理結構化數據及其關聯。
    • 應用範例
    • 電商平台:商品與訂單管理。
    • 企業系統:財務、人事資料管理。
    • 用戶管理與權限控管。
    • 技術代表
    • MySQL、PostgreSQL、Oracle Database、SQL Server

  • 於 MacOS 中,整合自然語言,自動化添加行事曆事件

    於 MacOS 中,整合自然語言,自動化添加行事曆事件

    這是一個嘗試更快添加行事曆安排的功能,主打一個透過自然語言 + 問答流程來添加想到的行事曆。

    主要的應用流程:

    1. 工作到一半想到排程和順序。
    2. 在 LM UI 介面、IDE、瀏覽器網址列或是文字編輯上把會議排程描述出來。
    3. 選取文字按右鍵,選擇執行服務(或是快捷建,記得住嗎?)
    4. 服務運作,系統詢問/補足必要時間、地點等。
    5. 服務紀錄日曆排程。

    * 如果是會議中,與人討論敲定的時間,描述的自然語言可以再傳給對方。

    適用對象:

    1. 適用於腦袋比較跳躍,或是想要避免開門效應,不想要切換螢幕畫面的用戶。
    2. 不喜歡講話,也就是 SIRI 常年關閉的用戶。
    3. 使用 MacOS 的用戶。這是必須的。

    附上說明:

    操作上使用 Automator 建立整個 MacOS 的服務功能。

    1. 打開「Automator」應用程式
    2. 建立新的「快速動作」(Quick Action)
    3. 設定:
      • 工作流程接收目前:文字
      • 於:任何應用程式
    1. 拖入「執行 AppleScript」
    2. 將原始碼貼上 / 修改 calendarName:添加 / 修改自己的日曆名稱
    3. 儲存為「建立日曆事件」

    使用方法:

    1. 在任何 App 中選取文字
    2. 點右鍵 → 服務 → 建立日曆事件

    行程就會透過 MacOS 的服務功能,添加至日曆裡面。

    再看看有沒有更方便的作法,其中可以再添加「行程邀請其他用戶」的功能,不過自己比較不用 mac 內建 mail 服務,也不太習慣寄行程給人就先不用。有興趣的朋友可以自己添加一下來跑。

    在Mac 中,服務這機制應該是可以利用的模式,應該目標是可以使用自然語言一鍵呼叫讓他自動判斷要做什麼。
    終極的想像還是預測啊,那個仰望的聖杯。
    不過這如果無法做到離線運作的話有些太可怕了,看有沒有辦法做到最小主動意圖就能精準動作的操作流程。

    最後備份一下原始碼:

    use AppleScript version "2.4"
    use framework "Foundation"
    use scripting additions
    
    property calendarName : "自動化生成" -- 請添加 / 修改為你自己的日曆名稱
    
    on run {input, parameters}
    	set theQuery to input as text
    	set theString to current application's NSString's stringWithString:theQuery
    	
    	-- 偵測時間
    	set dateDetector to current application's NSDataDetector's dataDetectorWithTypes:(current application's NSTextCheckingTypeDate) |error|:(missing value)
    	set theRange to current application's NSMakeRange(0, theString's |length|())
    	set dateMatch to dateDetector's firstMatchInString:theString options:0 range:theRange
    	
    	if dateMatch ≠ missing value then
    		set startDate to dateMatch's |date|() as date
    		if startDate < (current date) then set startDate to startDate + 1 * days
    		set endDate to startDate + (1 * hours)
    		
    		set dateRange to dateMatch's range()
    		set matchString to theString's substringWithRange:dateRange
    		set cleanedTitleNSString to theString's stringByReplacingCharactersInRange:dateRange withString:""
    		set eventTitle to cleanedTitleNSString as string
    	else
    		set validInput to false
    		repeat until validInput is true
    			display dialog "⚠️ 未能自動偵測時間,請手動輸入(格式:2025/06/10 15:30):" default answer ""
    			set userInput to text returned of result
    			try
    				set startDate to date userInput
    				set validInput to true
    			on error
    				display dialog "❌ 格式錯誤,請重新輸入(範例:2025/06/10 15:30)" buttons {"OK"} default button 1
    			end try
    		end repeat
    		set endDate to startDate + (1 * hours)
    		set eventTitle to theQuery
    	end if
    	
    	-- 偵測地點
    	set addressDetector to current application's NSDataDetector's dataDetectorWithTypes:(current application's NSTextCheckingTypeAddress) |error|:(missing value)
    	set addressMatch to addressDetector's firstMatchInString:theString options:0 range:theRange
    	
    	if addressMatch ≠ missing value then
    		set addressDict to addressMatch's addressComponents()
    		set locationString to (addressDict's objectForKey:"Name") as string
    		if locationString is missing value or locationString is "" then
    			set locationString to (theString's substringWithRange:(addressMatch's range())) as string
    		end if
    	else
    		display dialog "未偵測到地點,請手動輸入地點(可留空):" default answer ""
    		set locationString to text returned of result
    	end if
    	
    	-- 請使用者輸入附註
    	display dialog "請輸入附註內容(可留空):" default answer ""
    	set notesContent to text returned of result
    	
    	-- 建立事件
    	tell application "Calendar"
    		activate
    		set theCalendar to first calendar whose name is calendarName
    		set newEvent to make new event at end of events of theCalendar with properties {summary:eventTitle, start date:startDate, end date:endDate, location:locationString, description:notesContent}
    		
    		-- 加入提醒
    		tell newEvent
    			make new display alarm at end with properties {trigger interval:-60} -- 1 小時前
    			make new display alarm at end with properties {trigger interval:-30} -- 30 分鐘前
    			
    			-- 若活動超過一天後,加入 1 天前提醒
    			set nowDate to current date
    			if (startDate - nowDate) > (1 * days) then
    				make new display alarm at end with properties {trigger interval:-1440}
    			end if
    		end tell
    	end tell
    end run
  • 使用 deepwiki-open 針對程式碼產生 WIKI

    使用 deepwiki-open 針對程式碼產生 WIKI

    DeepWiki-Open 是一套開源的工具,與 線上 deepwiki 功能類似,是一個旨在為 GitHub、GitLab 或 BitBucket 倉庫自動生成交互式 Wiki 的工具。它通過分析代碼結構,生成全面的文檔,並創建視覺化的圖表來解釋代碼的運作原理,從而幫助開發者快速瞭解項目。

    先提供連結:

    優點:

    1. 可執行已下載到本地的 repo(記得機敏資料要移除或設定排除)
    2. 也可以透過授權,分析私有的 git repo
    3. 可匯出 README, JSON 檔案作 RAG 或是餵給其他 AI 用途
    4. 可使用本地模型(Ollama),也可以選擇線上付費的模型 API
    5. 功能與線上版很多類似,包含可以詢問 AI 等
    6. 有提供簡體中文
    7. 可以在遠端伺服器上部屬成網站

    缺點:

    1. 執行比較複雜
    2. 套用本地模型還是不太好用
    3. 比較同一個 repo 線上版的資訊會比較多,可能是模型的關係?

    因為自己不愛用 docker 部屬,筆記一下要注意的事情有:

    1. 啟動要分別執行前端和後端的程式。
    2. .env 的 API_KEY 可輸入本地的 LLM 。不推薦,速度和穩定度差太多了。
    3. 如果要部屬本地LLM, Ollama 要記得先 run 起來。

    筆記一下操作方式:

    1. 把 git repo clone 下來
    2. 添加 .env 檔案,參考 README 上說明添加 API_KEY
    3. 安裝後端 python 程式並且啟動後端
    4. 安裝前端 node modal 並且啟動前端畫面
    5. 畫面提示網址,開啟執行。

    下載指令

    git clone https://github.com/AsyncFuncAI/deepwiki-open.git

    python 指令

    # Install Python dependencies
    pip install -r api/requirements.txt
    
    # Start the API server
    python -m api.main

    前端指令

    # Install JavaScript dependencies
    npm install
    # or
    yarn install
    
    # Start the web app
    npm run dev
    # or
    yarn dev
  • 使用 Tailwind CLI 快速建立靜態 CSS 檔的基本步驟

    使用 Tailwind CLI 快速建立靜態 CSS 檔的基本步驟

    當 AI 建立可使用的文字越來越可靠的時候,部落格筆記就剩下避免重複問被 AI 當作失智患者的功能。

    這是為使用 Tailwind CLI 快速建立靜態 CSS 檔的基本步驟。

    參考這裡。

    先講注意事項事項,血淚史:

    1. npm 設定與初始化需助要是否在 root 權限,切換會很麻煩。
    2. 如果採用 SSR 在套版開始之前,記得先把 tailwindcss 的靜態 CSS 創建出來,要不也會很麻煩。
    3. tailwindcss 提供其他靜態檔案產生方法,我覺得 tailwindcss-cli 是最好用的,如果使用前端框架可以參考官方連結
    4. 還有另外一中作法,也可以參考:https://tailwindcss.com/blog/standalone-cli

    —-
    1. 初始化專案 & 安裝套件

    npm init -y
    npm install tailwindcss @tailwindcss/cli

    這會在專案中安裝 Tailwind CSS 與其 CLI 工具 

    2.  建立輸入 CSS 檔

    在專案內建立檔案 src/input.css,並加入:

    @import "tailwindcss";

    這行指令會載入 Tailwind 的所有基礎、組件與工具類樣式 

    3.  執行 CLI 產出靜態檔

    執行下列指令,Tailwind 會掃描你所有的原始檔中的 class,並輸出到指定的 CSS 檔:

    npx @tailwindcss/cli -i ./src/input.css -o ./dist/output.css --watch

    -i:指定輸入檔
    -o:指定輸出檔 (建議放到 dist/ 或 public/ 等靜態資源資料夾)
    –watch:開啟檔案變動監看,自動重建

    4. 在 HTML 中引入已編譯的 CSS

    如果沒有 input.css 或是不想整合在一起:

    npx @tailwindcss/cli -i ./src/input.css -o ./dist/output.css --watch

    最後,在你的 HTML 中加入:

    <link href="./dist/output.css" rel="stylesheet">

    即可在標記中使用所有 Tailwind 的 utility classes 

    備註:
    • 若不需要即時監看,可將 –watch 拿掉,做一次性建置。
    • 若希望調整預設設定(如自訂斷點、色票等),可執行 npx tailwindcss init 產生 tailwind.config.cjs 後再修改。
    • CLI 也提供獨立執行檔版本,無需 Node.js 環境,詳見官方文件「standalone executable」。

  • Visual Studio Code 的 PHP CS Fixer 設定

    Visual Studio Code 的 PHP CS Fixer 設定

    最近有幸換一台好一點電腦,開始投入 VSCode 的懷抱,轉換總是陣痛一波波襲來,於是趕緊記錄下來。希望能對以後使用 VSCode 的 PHPer 排版有幫助。

    PHP CS Fixer 是一個自動格式化 PHP 程式碼,利用這個外掛達到達到 PHP 統一風格的效果。


    版本:

    PHP CS Fixer 3.73.1 Persian Successor by Fabien Potencier, Dariusz Ruminski and contributors.

    PHP runtime: 8.2.28


    PHP CS Fixer 安裝與設定

    1. 安裝 PHP CS Fixer

    你有兩種主要安裝方式:透過 Composer 全域安裝或下載 phar 檔案。以下以 Composer 全域安裝為例:

    1. 確保 Composer 已安裝

    如果尚未安裝 Composer,請至 Composer 官方網站 下載並安裝。

    2. 全域安裝 PHP CS Fixer

    開啟終端機(Terminal),執行下列指令:

    composer global require friendsofphp/php-cs-fixer

    安裝完成後,透過以下指令確認執行檔路徑:

    composer global config bin-dir --absolute

    例如,你可能會得到 /Users/yourname/.composer/vendor/bin。記下這個路徑,因為稍後在 VSCode 或命令列使用時需要指定。

    注意兩點:

    1. 注意 Composer / PHP 的路徑和權限。可能會遇到執行權限不足的問題。
    2. 注意 User 的路徑名稱,這邊統一用 yourname 代替。

    2. 建立 PHP CS Fixer 設定檔

    我們提供以下最新版的 config.php 設定檔範例,此檔案包含多項格式化規則(例如 PSR、Symfony 規範),並採用新版語法。請將此檔案存放在你希望統一管理格式化規則的位置,例如 ~/.config/php-cs-fixer/config.php。

    小提醒,註解我是用 AI 生成的。裡面設定得依照需求和團隊規範來調整。

    <?php
    
    $header = <<<'EOF'
    This file is part of PHP CS Fixer.
    
    (c) Fabien Potencier <[email protected]>
        Dariusz Rumiński <[email protected]>
    
    This source file is subject to the MIT license that is bundled
    with this source code in the file LICENSE.
    EOF;
    
    $finder = PhpCsFixer\Finder::create()
        ->exclude('tests/Fixtures') // 排除特定目錄
        ->in(__DIR__) // 設定要檢查的目錄
    ;
    
    $config = (new PhpCsFixer\Config())
        ->setRiskyAllowed(true) // 允許使用可能具有風險的規則
        ->setRules([
            // '@PHP56Migration' => true, // PHP 5.6 的語法遷移規則集(已註解掉)
            '@PHPUnit60Migration:risky'   => true, // 適用於 PHPUnit 6.0 的遷移規則(風險規則)
            '@PSR1'                       => true, // 遵循 PSR-1 基本編碼標準
            '@PSR2'                       => true, // 遵循 PSR-2 編碼風格指南
            '@Symfony'                    => true, // 遵循 Symfony 的編碼標準
            '@Symfony:risky'              => true, // Symfony 的風險規則集
            'align_multiline_comment'     => true, // 將多行註解對齊
            'array_indentation'           => true, // 陣列的縮排規則
            'array_syntax'                => ['syntax' => 'short'], // 使用短陣列語法
            'blank_line_before_statement' => true, // 在特定語句前插入空行
            'binary_operator_spaces'      => [ // 二元運算符的空格規則
                'operators' => [
                    '=>' => 'align', // 將 `=>` 對齊
                    '='  => 'single_space', // `=` 使用單一空格
                ],
            ],
            'combine_consecutive_issets'   => true, // 合併連續的 `isset` 語句
            'combine_consecutive_unsets'   => true, // 合併連續的 `unset` 語句
            'comment_to_phpdoc'            => true, // 將普通註解轉換為 PHPDoc
            'compact_nullable_typehint'    => true, // 使用緊湊的 nullable 類型提示語法
            'concat_space'                 => ['spacing' => 'one'], // 字串連接符號使用單一空格
            'escape_implicit_backslashes'  => true, // 轉義隱式的反斜線
            'explicit_indirect_variable'   => true, // 明確的間接變數語法
            'explicit_string_variable'     => true, // 明確的字串變數語法
            'final_internal_class'         => true, // 將內部類標記為 final
            'fully_qualified_strict_types' => true, // 使用完全限定的類型名稱
            'function_to_constant'         => ['functions' => ['get_class', 'get_called_class', 'php_sapi_name', 'phpversion', 'pi']], // 將特定函數轉換為常數
            // 'header_comment' => ['header' => $header], // 添加檔案頭部註解(已註解掉)
            'heredoc_to_nowdoc'                             => true, // 將 heredoc 轉換為 nowdoc
            'increment_style'                               => false, // 遞增/遞減運算符的風格
            'list_syntax'                                   => ['syntax' => 'short'], // 使用短語法的 list
            'logical_operators'                             => true, // 使用邏輯運算符 `and`, `or`, `xor` 替代符號
            'method_argument_space'                         => ['on_multiline' => 'ensure_fully_multiline'], // 方法參數的空格規則
            'method_chaining_indentation'                   => true, // 方法鏈式調用的縮排
            'multiline_comment_opening_closing'             => true, // 多行註解的開頭和結尾格式化
            'no_alternative_syntax'                         => true, // 禁用替代語法(如 `endif`)
            'no_binary_string'                              => true, // 禁用二進位字串語法
            'no_extra_blank_lines'                          => ['tokens' => ['break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block']], // 移除多餘的空行
            'no_null_property_initialization'               => true, // 移除屬性初始化為 null
            'echo_tag_syntax'                               => ['format' => 'long'], // 使用長格式的 echo 標籤
            'no_superfluous_elseif'                         => true, // 移除多餘的 elseif
            'no_unneeded_curly_braces'                      => true, // 移除不必要的大括號
            'no_unneeded_final_method'                      => true, // 移除不必要的 final 方法
            'no_unreachable_default_argument_value'         => true, // 移除無法到達的默認參數值
            'no_unset_on_property'                          => true, // 禁止對屬性使用 unset
            'no_useless_else'                               => true, // 移除無用的 else
            'no_useless_return'                             => true, // 移除無用的 return
            'ordered_class_elements'                        => true, // 排序類的元素
            'ordered_imports'                               => true, // 排序 import 語句
            'php_unit_internal_class'                       => true, // PHPUnit 的內部類應標記為 final
            'phpdoc_order_by_value'                         => ['annotations' => ['covers']], // 按值排序 PHPDoc 的註解
            'php_unit_set_up_tear_down_visibility'          => true, // 設置 PHPUnit 的 setUp/tearDown 方法的可見性
            'php_unit_strict'                               => true, // 使用 PHPUnit 的嚴格模式
            'php_unit_test_annotation'                      => true, // 強制使用 PHPUnit 的 @test 註解
            'php_unit_test_case_static_method_calls'        => ['call_type' => 'this'], // 使用 `$this` 調用靜態方法
            'php_unit_test_class_requires_covers'           => true, // 強制測試類需要 @covers 註解
            'phpdoc_add_missing_param_annotation'           => true, // 添加缺失的 @param 註解
            'phpdoc_order'                                  => true, // 排序 PHPDoc 的標籤
            'phpdoc_trim_consecutive_blank_line_separation' => true, // 修剪 PHPDoc 中的連續空行
            'phpdoc_types_order'                            => true, // PHPDoc 類型排序
            'return_assignment'                             => false, // 避免直接返回賦值
            'semicolon_after_instruction'                   => true, // 在指令後添加分號
            'single_line_comment_style'                     => true, // 單行註解的風格
            'strict_comparison'                             => false, // 使用嚴格比較
            'strict_param'                                  => false, // 使用嚴格參數
            'string_line_ending'                            => true, // 字串行結尾一致
            'ternary_operator_spaces'                       => true, // 三元運算符的空格規則
            'trim_array_spaces'                             => true, // 修剪陣列中的多餘空格
            'unary_operator_spaces'                         => true, // 一元運算符的空格規則
            'yoda_style'                                    => true, // 使用 Yoda 條件風格
            'whitespace_after_comma_in_array'               => true, // 陣列中逗號後的空格
        ])
        ->setFinder($finder)
    ;
    
    // special handling of fabbot.io service if it's using too old PHP CS Fixer version
    if (false !== getenv('FABBOT_IO')) {
        try {
            PhpCsFixer\FixerFactory::create()
                ->registerBuiltInFixers()
                ->registerCustomFixers($config->getCustomFixers())
                ->useRuleSet(new PhpCsFixer\RuleSet($config->getRules()));
        } catch (PhpCsFixer\ConfigurationException\InvalidConfigurationException $e) {
            $config->setRules([]);
        } catch (UnexpectedValueException $e) {
            $config->setRules([]);
        } catch (InvalidArgumentException $e) {
            $config->setRules([]);
        }
    }
    
    return $config;

    3. 配置與使用

    (1) 測試設定檔是否正常運作

    在終端機中執行以下指令,檢查格式化是否能正常運作:

    php-cs-fixer fix --config=/Users/yourname/.config/php-cs-fixer/config.php --dry-run --diff

    若顯示格式化差異且無錯誤訊息,代表設定檔運作正常。

    (2) 在 VSCode 中整合使用

    若你在 VSCode 中進行開發,請依下列步驟進行設定:

    1. 安裝 VSCode PHP CS Fixer 擴充套件

    可從 VSCode 擴充功能市場搜尋並安裝例如 junstyle.php-cs-fixer 之類的擴充套件。

    2. 設定 VSCode 使用全域 PHP CS Fixer

    在 VSCode 的 settings.json 中加入下列設定,指定執行檔路徑與全域設定檔位置:

    {
        "php-cs-fixer.executablePath": "/Users/yourname/.composer/vendor/bin/php-cs-fixer",
        "php-cs-fixer.config": "/Users/yourname/.config/php-cs-fixer/config.php",
        "editor.formatOnSave": true,
        "[php]": {
            "editor.defaultFormatter": "junstyle.php-cs-fixer"
        }
    }

    ※ 請依據實際路徑修改 “php-cs-fixer.executablePath” 的內容。

    3. 測試 VSCode 格式化功能

    開啟一個 PHP 檔案,嘗試保存(Save),檢查程式碼是否依照設定自動格式化。

    4. 設定檔內容說明

    這份設定檔主要包含以下部分:

    Header 字串:定義了版權和授權說明,雖然目前透過 header_comment 規則被註解掉,但可根據需求啟用。

    Finder 設定:透過 PhpCsFixer\Finder 指定排除某些目錄(例如 tests/Fixtures),並指定掃描路徑(使用 __DIR__)。

    Config 物件:利用 (new PhpCsFixer\Config()) 建立設定物件,並透過 setRules 指定各項格式化規則,例如 PSR、Symfony、單行註解、縮排、運算子對齊等。

    特別注意:

    • 將原本已被移除的規則集(如 @PHP56Migration)註解掉。

    • 對於已重命名的規則,例如 no_short_echo_tag 改為 echo_tag_syntax,並依新規範提供相應配置。

    • binary_operator_spaces 的設定改為使用 operators 陣列,設定 => 為 align,而 = 為 single_space。

    特殊處理:針對 fabbot.io 等可能使用較舊版 PHP CS Fixer 的服務,透過 try/catch 機制進行相容性處理。


    總結

    按照以上步驟完成安裝、設定檔建立及 VSCode 整合後,你就能使用這份統一的 PHP CS Fixer 設定來自動格式化 PHP 程式碼,確保程式碼風格的一致性與可讀性。若有需要進一步調整規則,可以參考 PHP CS Fixer 官方文件 進行自訂。

  • MacOS 添加本地伺服器的 DNS

    MacOS 添加本地伺服器的 DNS

    目前本地開發使用 VM 的應用程式(VMWare 或 Parallels),也會需要將 local 的 domain 指向正確的 Private IP。原本都是用 iHost 這套 GUI APP ,這 APP 實作修改 /etc/hosts 的方式達到顯示 local domain 的功能,但有兩個問題:

    1. /etc/hosts 的權限是 root 導致每次開啟的時候都需要操作更換權限。
    2. 沒有支援 wildcard 的功能

    於是我想換一個方法處理。可惜的是目前還沒找到 GUI 的 APP,這邊實作在 macOS 上使用 Homebrew 安裝 dnsmasq ,配置讓所有 *.localhost.test 指向 10.211.55.12 :


    1. 安裝 dnsmasq

    如果尚未安裝 Homebrew,可以先到 Homebrew 官網 參考安裝方法。安裝好 Homebrew 後,打開終端機執行:

    brew install dnsmasq

    2. 配置 dnsmasq

    編輯 dnsmasq 的配置文件 /usr/local/etc/dnsmasq.conf,加入對 *.localhost.test 的解析規則(注意這路徑未必正確):

    nano /usr/local/etc/dnsmasq.conf

    在文件中新增以下這一行:

    address=/.localhost.test/10.211.55.12

    這條規則表示所有以 localhost.test 為後綴的域名(例如 abc.localhost.test)都會被解析到 10.211.55.12。


    3. 啟動 dnsmasq 服務

    配置完成後,啟動 dnsmasq 並設置為開機自啟:

    brew services start dnsmasq

    如果之後有修改配置,需要重啟服務:

    brew services restart dnsmasq

    4. 配置 macOS 使用本地 dnsmasq

    為了使 macOS 對 localhost.test 域名的 DNS 查詢走本地的 dnsmasq,需要在 /etc/resolver 目錄下建立解析器文件。

    1. 先建立 /etc/resolver 目錄(如果尚不存在):

    sudo mkdir -p /etc/resolver

    2. 創建一個名為 localhost.test 的文件:

    sudo nano /etc/resolver/localhost.test

    在文件中加入:

    nameserver 127.0.0.1

    這樣,所有針對 *.localhost.test 的 DNS 請求都會由本地的 dnsmasq(監聽 127.0.0.1)來處理。


    5. 測試配置

    可以使用 dig 或 nslookup 測試解析是否正確。例如,執行:

    dig subdomain.localhost.test

    查詢結果應該會顯示 IP 為 10.211.55.12。

    以上步驟是用 AI 寫的,需要特別注意

    /usr/local/etc/dnsmasq.conf 這個路徑未必是正確的,安裝完成後提示:

    To start dnsmasq now and restart at startup:
      sudo brew services start dnsmasq
    Or, if you don't want/need a background service you can just run:
      /opt/homebrew/opt/dnsmasq/sbin/dnsmasq --keep-in-foreground -C /opt/homebrew/etc/dnsmasq.conf -7 /opt/homebrew/etc/dnsmasq.d,\*.conf
    ==> Summary
    🍺  /opt/homebrew/Cellar/dnsmasq/2.91: 11 files, 665.1KB
    ==> Running `brew cleanup dnsmasq`...

    所以設定的路徑是 /opt/homebrew/etc/dnsmasq.conf

    這樣之後 VM 統一設定網域 localhost.test 或子網域就能運作啦!

  • Mac 上使用 pyenv 管理 python 環境

    Mac 上使用 pyenv 管理 python 環境

    先說可能用 docker 會很方便,這邊先不考慮延伸管理以及效能等問題,採用原生的方式處理。

    這裡記錄一下久久用一次很容易忘記的操作情境。

    安裝和設定,這通常只需要處理一次。需要注意設定的目標檔案,這裡使用的是 .bashrc ,有可能是
    .bash_profile 或是 .zshrc,也可以直接開啟檔案寫入:

    # 安裝
    brew install pyenv
    # 設定
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
    echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
    echo 'eval "$(pyenv init -)"' >> ~/.bashrc

    查看有安裝哪些版本,他將會列出目前有的版本以及設定的名稱:

    pyenv versions

    安裝指定版本,版本名稱有很多,建議安裝前先查一下:

    # 列出可安裝的版本
    pyenv install -l
    # 安裝指定版本
    pyenv install miniconda3-4.3.11

    設定全域的版本,這樣只要該資料夾沒有指定版本就會預設全域的版本。

    pyenv global 3.7.4

    查看現在是使用什麼版本

    python -V

    最常做的是指定某個資料夾版本,使用 local 指令,可以建立在該資料夾內的版本號

    python local 3.7.4

    建立一個虛擬環境,當我們有安裝一些套件等,建議為這個環境命名,這樣多的不同應用環境的專案比較好獨立運作,不會互相干擾環境也不容易髒掉。

    pyenv virtualenv 3.7.4 testenv

    如此一來呼叫 versions 指令時就會多出 testenv 這個環境啦!

    以上。