作者: Jerry Lin

  • 《從0到1:打開世界運作的未知祕密,在意想不到之處發現價值》讀書心得(嘗試用 AI 生成)

    《從0到1:打開世界運作的未知祕密,在意想不到之處發現價值》讀書心得(嘗試用 AI 生成)

    這是《從0到1:打開世界運作的未知祕密,在意想不到之處發現價值》的讀書心得,我想嘗試用 ChatGPT 來透過節錄內容來產生心得內容。並且在自己「潤飾」內容來看看是否能夠更易閱讀(這算是劣化文章嗎?),也許這會是一個好方法?

    《從 0 到 1》是由 Peter Thiel 撰寫的一本經典創業書籍,作者是知名的矽谷投資家及 PayPal 的聯合創辦人。他在書中探討了創新與企業成長的根本原理,強調創業者應該尋找能夠從無到有(0 到 1)的創新機會,而不是簡單地複製已有的模式(1 到 n)。Thiel 的理念在於通過壟斷市場與技術突破,打造具有持續競爭優勢的企業。

    Peter Thiel 是著名的矽谷投資家、企業家和作家。他是 PayPal 的聯合創辦人之一,也是 Facebook、SpaceX 等多家科技公司的早期投資者。他在創業和投資領域取得了極大的成功,尤其以其獨特的創新觀點著稱。他還是 Palantir Technologies 的共同創辦人,並因其在風險投資和科技創新方面的專業知識被廣泛認可。《從 0 到 1》是他的代表作品,闡述了如何通過創新在競爭中脫穎而出。

    我認為書中最重要的概念之一是「冪次法則」(Power Law),這個法則揭示了風險投資和創業領域的回報規律。在冪次法則下,少數幾個企業會產生大部分的回報,這表明創業或投資並非線性分佈,反而是高度集中在少數突破性創新上。這意味著創業者和投資者應該專注於那些潛力巨大的機會,而不是分散資源於多個中等回報的項目。

    Thiel 特別強調,在創業過程中,企業應該致力於創造能夠壟斷市場的獨特價值,而非陷入無休止的競爭中,尤其是要避免陷入「價格戰」的競爭之中。我的理解這是一種關於「產品差異化」的描述,這也是價格戰的解法之一。

    「致力於創造能夠壟斷市場的獨特價值」,這與「冪次法則」的應用息息相關,因為少數的創新能夠改變市場規則,帶來壓倒性的成功。而這種壟斷地位不僅能帶來豐厚的經濟回報,也讓企業能夠在長期內保持技術領先。企業應該致力於創造能夠壟斷市場的獨特價值,這是因為壟斷企業能夠在市場中獲得更大的控制力和持久的競爭優勢。壟斷者能夠自主定價,並且不需要與其他競爭者分享市場,從而獲得更高的利潤。創造獨特的價值或產品,能讓企業不僅避免價格競爭,還能成為市場中的主導力量,實現長期成功。他以 PayPal 和 Google 為例,說明了這些企業如何透過技術創新和全新解決方案,從 0 到 1 的過程中創造出巨大的市場需求,從而達到市場壟斷地位。這些企業沒有僅僅改進現有的技術,而是重新定義了整個市場,這正是垂直進步的威力。

    反常規思維是 Thiel 的另一個關鍵概念。Peter Thiel 在《從 0 到 1》中強調「秘密」的概念,鼓勵創業者尋找那些被大多數人忽視的事實或知識,這些「秘密」能為企業創造出獨特的價值。Thiel 認為,突破性創新通常來自於對世界已有認知的深層質疑和獨特洞見。這些被忽視的機會可以讓創業者開創全新的市場或技術。

    《從 0 到 1》提供了創業者在現代商業世界中如何成功的深刻見解。Thiel 的「冪次法則」理論強調了集中資源於少數突破性機會的重要性,並認為創業者應該致力於創新與壟斷,而非陷入無休止的競爭。他的反常規思維和對垂直進步的推崇,提供了一個全新的視角,幫助創業者理解如何在全球化市場中找到屬於自己的獨特位置。

  • 用 ChatGPT 生成 Codeigniter4 Model Class

    用 ChatGPT 生成 Codeigniter4 Model Class

    走正向工程的話,規劃 DB 資料庫會遇到要轉成程式結構的問題,基本上沒有技術但是 Han 麻煩。這次嘗試用 ChatGPT 生成。

    使用 ChatGPT 4o 處理。

    目標:

    1. Mysql DDL File(.sql) 匯出 Create 指令,將其轉換為 CI4 的 Model Class 的程式碼。
    2. Model Class 繼承 BaseModel Class,BaseModel 是一個把一些基礎的操作和變數寫好的 Class ,繼承 CodeIgniter\Model 。
    3. 使用 ChatGPT 生成,儘量不要還得手動調整。

    附上提示詞連結:

    操作過程也紀錄一下:

    1. 一開始拿一個 table 的 create 指令生成,最終請它產生提示內容。
    2. 將 .sql 檔案匯出,確保都是 create 指令。
    3. 匯入 ChatGPT 並且使用提示提請它提供生成檔案 zip 連結。
    4. 下載確認與修正 loop:
      • 確保 MySQL 檔案中的備註有放到 PHP 裡面
      • 移除 fk 會填入欄位的問題
      • 移除 index 等 key 會重複填入欄位的問題
      • 移除驗證規則(這個 case 不需要)
      • 添加 Class 註釋,包含日期、作者、 MySQL 中於 table 的註解。

    匯出了好多檔案

    看這版本,有種提案給客戶的設計稿的感覺。屠龍者終成惡龍阿。

    補一個操作畫面:

  • 使用 Cloudflare Workers 處理前端跨域問題

    使用 Cloudflare Workers 處理前端跨域問題

    在 Web Application 走前後端分離的開發時,常會遇到 CORS 的問題,先科普什麼是 CORS,請參考:

    除了使用 JSONP 的處理方式以外,較快的解決方法有:

    1. 前端架設一個 proxy server 提供給前端呼叫使用
    2. 後端 server 端透過 nginx 或其他方法允許跨域的 request

    兩個方法都存在著,正式環境和測試環境在環境設定上必然有所不同,就差在前端改還是後端改了。

    而架設 proxy server 的方法也有兩個常見的作法:

    1. 本地環境架設一個 porxy server ,這邊提供一個 vue+ vite 的範例,請參考
    2. 架設一個在網路上的 proxy server

    原則上來說第一種方式比較保險的,但可能有種種技術因素導致無法實現,於是第二種方法,我們透過 Cloudfalre 來實現了。

    原始碼和別人寫的說明附在最下方,直接講注意事項:

    1. 你需要一個 Cloudflare 帳號,並且有存取 Workers and Pages 這個服務的權限。
    2. 使用 Worker 服務實作,他是公開的,且免費版有 100k 的次數限制,記得要設定白名單避免被濫用
    3. 要記得前端呼叫的網域要透過環境區分,把這個放上正式環境,呼叫次數可能會爆掉。

    更新一些要注意的事項:

    1. 白名單是 request header 中的 Origin ,是來源網址不是 proxy 導向的網址。這如果是後端架設的話得和前端溝通是哪個網址來源。
    2. 針對 Worker 裡面的 fix() 方法我做了一些修改,如果有錯誤還請提醒,程式碼如下:
    function fix(myHeaders) {
      // myHeaders.set("Access-Control-Allow-Origin", "*");
      myHeaders.set("Access-Control-Allow-Headers", event.request.headers.get("access-control-request-headers"));
      myHeaders.set("Access-Control-Allow-Origin", event.request.headers.get("Origin"));
      if (isOPTIONS) {
        myHeaders.set("Access-Control-Allow-Methods", "GET,HEAD,POST,OPTIONS");
    
        //myHeaders.set("Access-Control-Allow-Credentials", "true");
    
        // myHeaders.delete("X-Content-Type-Options");
      }
      return myHeaders;
    }

    我 fork 專案,更新了一個在 header 帶 auth 的版本,應該對防止濫用更有幫助。 網址如下:

    用法在下面兩個連結分享中有說明了,簡單來說就是一個 proxy for api

    這是 cloudflare-cors-anywhere 來源:

    這是關於 cloudflare-cors-anywhere 的操作教學:

    同場加映:

    這裡有修改 response header 的方法,不太推薦,很容易忘記。

  • Nginx 中同一個網域設定不同應用程式/目錄

    Nginx 中同一個網域設定不同應用程式/目錄

    技能點還沒有點太多的領域一點點成果就會獲得大大的成就感。

    最近弄了一個可以在同一個網域中實作多的應用程式的設定,這邊紀錄一下。先講結論:

    1. 可以實現同一個網域前後端分離,讓版本控制的操作也分開來。
    2. 同理多個不同應用如果需要互相呼叫時,也可以使用 sub-path 不要 sub-domain 來處理。
    3. 強烈建議不要用套裝的應用程式,關於網域使用的設計需要特別處理。
    4. 個人認為,如果是不同功能的應用場景,還是應該用 sub-domain 處理,這應該是 UX 相關的設計,和技術較為無關。
    5. 系統層的設定較為複雜,包含 Nginx 的設定,如果沒有 full controll 的權限可能實現上較為困難。

    前提列一下:

    1. 主網域是 a.com.tw
    2. 第二個網域是 b.com.tw 作為 nginx 的 proxy 使用,如果有需要也會在 dns 上設定。

    目標有幾個:

    1. 用戶訪問 a.com.tw 時候,會跳轉至 /root-document/a.com.tw/ 路徑上的 web-app
    2. 用戶訪問 a.com.tw/admin 時候,會跳轉至 /root-document/b.com.tw/ 路徑上的 web-app
    3. 用戶訪問 a.com.tw/uploads 時候,會跳轉至 /root-document/b.com.tw/uploads 路徑上的靜態檔案

    實作步驟:

    設定 /etc/hosts 檔案,新增:

    127.0.0.1 b.com.tw

    如果有需要,可以在 DNS 上設定 CNAME 把 b.com.tw 設定為 a.com.tw 別名。

    設定 a.com.tw 的網站,Nginx 中添加:

    # 將 /admin/ 和 /admin/* 路徑指向後端應用程式
    location ^~ /admin/ {
      proxy_pass http://b.com.tw;
    }
    # 將 /uploads/ 和 /uploads/* 路徑的靜態檔案指向其他資料夾
    location ^~ /uploads/ {
      alias /root-document/b.com.tw/uploads/;
      try_files $uri $uri/ /index.html;
    }
    
    
    # Option 其他網站的配置,例如前端 
    location ^~ / {
      root /root-document/a.com.tw;
      ...
    }

    設定 b.com.tw 的網站,Nginx 按照一般的設定即可,不過在動態程式中需要特別注意幾項:

    1. b.com.tw 的顯示網域是主網域 a.com.tw,在畫面上如果顯示非相對域名,要注意顯示的是 a.com.tw 而不是 b.com.tw
    2. 尤其後端上傳行為與 form action 會需要特別注意。
    3. http://b.com.tw 作為後端服務 proxy_pass,要注意 ssl 設定,包含顯示網域的 ssl 是否寫死?或是 proxy_set_header 判斷處理。
    4. uploads 的路徑在範例中也是導向 /root-document/b.com.tw/ 裡面的路徑,如果單純只是靜態檔案也可以自行設定。建議事先規劃整理好。
    5. 需要請注意根目錄設定 .user.ini 檔案中的設定,建議把不同路徑都補進去。

    還有一些小細節:

    1. Nginx 中 alias 的路徑需要是 / 結尾。 alias 和 root 不同的地方,參考這裡
    2. Nginx 路徑匹配優先權問題,請參考這裡

    關於 Nginx 設定的注意事項,附上問 ChatGPT 生成回覆:

    配置意圖

    1. /admin//admin/* 路徑指向後端應用程式
      • location ^~ /admin/ { ... } 這個配置塊的意圖是將所有匹配 /admin/ 開頭的路徑(包括 /admin//admin/*)的請求,轉發到後端應用程式,其地址為 http://b.com.tw
      • proxy_pass http://b.com.tw; 這個指令表示將符合條件的請求轉發給 http://b.com.tw 這個後端服務處理。
    2. /uploads//uploads/* 路徑的靜態檔案指向其他資料夾
      • location ^~ /uploads/ { ... } 這個配置塊的意圖是處理匹配 /uploads/ 開頭的路徑(包括 /uploads//uploads/*)的請求,並將這些請求指向伺服器上的一個具體的資料夾來提供靜態檔案。
      • alias /root-document/b.com.tw/uploads/; 這個指令表示將 /uploads/ 路徑的請求映射到伺服器上 /root-document/b.com.tw/uploads/ 目錄中的對應檔案。例如,請求 /uploads/image.jpg 會映射到 /root-document/b.com.tw/uploads/image.jpg
      • try_files $uri $uri/ /index.html; 這個指令會嘗試按順序查找以下檔案:
        • $uri:請求的原始檔案或目錄(例如 /root-document/b.com.tw/uploads/image.jpg)。
        • $uri/:如果是目錄,則查找目錄下的檔案(例如 /root-document/b.com.tw/uploads/image.jpg/)。
        • 如果以上都未找到,則回退到 /index.html 這個檔案。

    注意事項

    1. ^~ 前綴
      • ^~ 表示如果路徑匹配 /admin//uploads/,那麼該配置塊將優先於其他正則表達式匹配(例如 location ~location /)來處理請求。這確保了 /admin//uploads/ 的請求被這些特定的配置塊處理。
    2. Proxy Pass 的上下文
      • 當使用 proxy_pass 指令時,Nginx 將請求轉發給後端服務(如 http://b.com.tw)。確保 b.com.tw 這個服務能夠正確處理接收到的 /admin/ 路徑,並且能夠返回正確的響應。
    3. Alias 的使用
      • alias 指令用於將 URL 路徑映射到文件系統上的實際路徑,注意它不同於 root 指令。使用 alias 時需要確保映射的目錄結構和權限設置正確,以便 Nginx 能夠讀取和提供靜態檔案。
    4. 靜態檔案的優先級
      • /uploads/ 路徑的靜態檔案配置中,try_files 的指令順序很重要。你需要確保 /index.html 是你希望用來處理靜態資源請求失敗時的回退頁面。
    5. 安全性考量
      • 在提供靜態資源時,應確保 /root-document/b.com.tw/uploads/ 資料夾內的檔案不包含敏感信息,且檔案權限設置得當,防止未經授權的訪問。

    這段配置主要是為了處理特定路徑的請求,將動態內容轉發給後端應用程式,並通過靜態資源提供功能來處理文件的提供。

  • Mac 使用 Nodejs 的管理工具 n 來切換版本

    Mac 使用 Nodejs 的管理工具 n 來切換版本

    Nodejs 在前端應用越來越廣泛,有時會遇到不同專案或是交接外包的 nodejs 版本不同,於是需要切換,以下筆記一下切換的方法。

    在 windows OS 上使用 nvm 做版本切換工具,參考。在 mac 上有 n 這個工具來處理。先資料來源,還有參考文章:

    安裝建議使用 brew

    brew install n

    基本操作

    sudo n latest // 升級至最新版本
    
    sudo n stable // 升級至穩定版本
    
    sudo n xx.xx // 升級至指定的版本號

    如果想要有互動介面版本管理,直接輸入 n 即可跳出介面。

  • 使用 Nginx 設定通過 Cloudflare 的真實 IP 與只允許 Cloudflare IP 來的流量。

    使用 Nginx 設定通過 Cloudflare 的真實 IP 與只允許 Cloudflare IP 來的流量。

    一次講兩件事,都是和 Cloudflare 的 IP 有關。

    首先是在Ngnix 中,設定只允許 Cloudflare IP 來的流量。幾點注意:

    1. 需確認 Nginx 設定的網域有沒有通過 Cloudflare 的 Proxy,也就是看 DNS 設定中,橘色的雲有沒有亮起。
    2. 一樣的設定可以套用在其他有 Proxy/VPN/CDN 等操作上。組合拳是:流量走我的,其他檔下來。
    3. 同樣的組合拳也可以設定在單一允許 ip 的 api service 上面,不過請注意邏輯層與系統層的拆分,別被自己的 code 搞死了。
    4. Cloudflare 的 ips 是會更新的,請參考這裡
    5. 如果你有用 crontab 執行 url 的話記得也要把 allow 補進去。例如: allow 127.0.0.1; 或是改成 cli 的操作(推薦)。
    allow 173.245.48.0/20;
    allow 103.21.244.0/22;
    allow 103.22.200.0/22;
    allow 103.31.4.0/22;
    allow 141.101.64.0/18;
    allow 108.162.192.0/18;
    allow 190.93.240.0/20;
    allow 188.114.96.0/20;
    allow 197.234.240.0/22;
    allow 198.41.128.0/17;
    allow 162.158.0.0/15;
    allow 104.16.0.0/13;
    allow 104.24.0.0/14;
    allow 172.64.0.0/13;
    allow 131.0.72.0/22;
    
    allow 2400:cb00::/32;
    allow 2606:4700::/32;
    allow 2803:f800::/32;
    allow 2405:b500::/32;
    allow 2405:8100::/32;
    allow 2a06:98c0::/29;
    allow 2c0f:f248::/32;
    
    deny all; # deny all remaining ips

    再來是設定讓網站在通過 Cloudflare 之後,可以獲取到真實 ip 的設定,這部分我是抄網路的,有些覺得怪的地方,如果有理解錯誤還煩請指正。

    1. set_real_ip_from 是指信任的 proxy ip 所以要設定為 cloudflare 的 ip 段,標示這些來源的 ip 才能正確取得真實的 client ip。
    2. real_ip_header 是修改真實 ip 的 header 字段,默認是 X-Real-IP。改為 CF-Connecting-IP 是 cloudflare 在邊緣到您的來源 Web 伺服器的流量上傳送的標頭。請參考 Cloudflare 文件
    3. 上面提到的流量來源限制和 set_real_ip_from 的設置會衝突,不能一起設置 🫠
    set_real_ip_from 173.245.48.0/20;
    set_real_ip_from 103.21.244.0/22;
    set_real_ip_from 103.22.200.0/22;
    set_real_ip_from 103.31.4.0/22;
    set_real_ip_from 141.101.64.0/18;
    set_real_ip_from 108.162.192.0/18;
    set_real_ip_from 190.93.240.0/20;
    set_real_ip_from 188.114.96.0/20;
    set_real_ip_from 197.234.240.0/22;
    set_real_ip_from 198.41.128.0/17;
    set_real_ip_from 162.158.0.0/15;
    set_real_ip_from 104.16.0.0/13;
    set_real_ip_from 104.24.0.0/14;
    set_real_ip_from 172.64.0.0/13;
    set_real_ip_from 131.0.72.0/22;
    
    set_real_ip_from 2400:cb00::/32;
    set_real_ip_from 2606:4700::/32;
    set_real_ip_from 2803:f800::/32;
    set_real_ip_from 2405:b500::/32;
    set_real_ip_from 2405:8100::/32;
    set_real_ip_from 2a06:98c0::/29;
    set_real_ip_from 2c0f:f248::/32;
    
    #use any of the following two
    
    real_ip_header CF-Connecting-IP;
    #real_ip_header X-Forwarded-For; # 滿多人用這個,不過 cf 有自己比較安全的標頭。

    同場加映 Cloudflare 的 ips 清單,更新頻率不高,不過設定上幾個注意:

    1. 相關 ips 的設定儘量統一管理。
    2. 有提供 api 可呼叫,參考這裡,如果要做自動化的人可以來弄弄。
  • WordPress 不用外掛置換網域

    WordPress 不用外掛置換網域

    雖然不是第一次做這件事了,不過還真的不常做。今天有朋友網域需要更換,剛好又是放我這管理,因為滿多人用外掛處理,但這個網站基於種種原因不太好用外掛,於是想乾脆改資料庫好了。 紀錄一下比較少處理的作法,某種程度上 wp 的外掛太方便惹,只要品管做的好,現在已經越來越少動程式。

    * 友情提醒:該操作時是離峰時間,所以沒有在顧忌考慮什麼可能會壞掉的。

    首先要先備份,主要是備份資料庫。如果資料過大的話要注意一下,我建議幾個方向:

    1. 優先把 sql 檔案備份下載。這次是使用這個方式處理。
    2. 如果檔案太大,複製一個新的資料庫。修改的話就只能用命令或網頁 phpMyAdmin / adminer 來處理。

    接下來是幾個系統環境設定的部分:

    1. 確認網域 DNS 是否正確:設定 A 紀錄到指定伺服器 ip
    2. 確認 HTTP Service 設定是否正確,可以新舊網域指向同一個 root path 沒問題。
    3. 確認新網域的 SSL 是否正常設置。建議如果使用 cloudflare 的話要先確認好 SSL 的配置是否和舊網域相同,如果使用「彈性」的選項滿容易遇到問題的。

    這時用新網域打開 wordpress,沒意外瀏覽器應該會跳轉至舊網域,正常展示。

    再來修改線上的資料庫 wp_options.siteurl 和 wp_options.home 欄位1,先改成新的網域,確認 SSL 是否正常/網頁正常展示。 如果正常的話開啟瀏覽器開發人員模式會看到網頁正常開啟,不過圖片等網址都還是指向舊的網域2

    再來要來改資料庫了,因為我這次是把資料庫備份下來的,所以記得複製一份以後來編輯,以下用 old-domain.com 和 new-domain.com 來區分新舊網域。

    首先要先注意 www 的子網域,以及是否有可恨的外掛/布景主題使用 PHP 序列化(參考)來做儲存的行為。如果遇到是序列化的欄位,請特別注意字元的數量。如果有要替換 www 的話,搜尋取代行為先替換比較好。

    1. 記得備份,開啟我們要編輯的 sql 檔案。
    2. 因為現在要改 SSL ,搜尋 http://(www)old-domain.com 替換成 https://(www)new-domain.com
    3. 搜尋 https://(www)old-domain.com 替換成 https://(www)new-domain.com
    4. 可能會有 email 或是單純網域的設定。搜尋 (www)old-domain.com 替換成 (www)new-domain.com

    再次提醒如果有遇到類似長這種的,不是 JSON ,要注意序列化的操作,可以使用線上的序列化(參考)和反序列化(參考)工具。這次沒遇到,就不管啦。3

    資料庫更新好以後覆蓋回去即可。如果會擔心的話,建議創一個新的資料庫匯入,從 wp-config.php 中修改資料庫路徑/名稱和帳號密碼。

    打開來檢查一下確認網域有沒有舊網域以及有沒有什麼錯誤。

    註解

    1. 呵呵看欄位名稱就知道網站多舊了。 ↩︎
    2. 這可能也是因為舊網站的關係。wp 很多設定可能有 CDN 或擴展的需求,資料庫紀錄絕對路徑,移站時,除了檔案路徑會有問題以外,常常網域的路徑也會需要注意。 ↩︎
    3. 我是覺得外掛/布景主題設計上,把網域包在序列化的開發者真的要判死刑 XD ↩︎

    同場加映, 如果是很舊的網站,遇到 css 和 js 沒有設定 https 而導致錯誤,這邊提供一個解法。寫在 function.php 裡面。

  • 全 12 活動紀錄

    全 12 活動紀錄

    全 12 是「中華民國童軍第12次全國大露營」簡稱。

    藉由中華民國童軍第12次全國大露營(以下簡稱大露營)的辦理,呈現我國新世代童軍的創意與活力,透過大露營的宣傳和活動,鼓勵全國青少年能親近大自然,讓童軍活動受到全國青少年的喜愛,提供國內外童軍交流互動平臺,以促進我國童軍和世界各國童軍的互動交流,強化童軍實作技能,提升童軍合作學習,以發揮童軍運動精神。

    在白天有提供給童軍伙伴跑站的活動,其中我的任務是在其中做一份簽到簽退系統。讓工作坊可以提供給學員打卡,除了回報給學員的分團支外,也提供紀錄、展示等用途(笑)。

    真的做了好久阿,去年年末到現在。這算是一份發願,看能不能給自己一個交代,於是最後產出了這份專案。

    內容包含:原始碼、技術結構、優化清單、部署介紹。

    無論如何也算是得償所願吧,接下來看有誰要接下去做了。

    其中有許多需要優化修改的地方,參考這裡

    可怕的是在活動前開始感冒,營隊幾天就咳嗽幾天,至今鼻涕和喉嚨還不太安分。而待在家參與活動這幾天,貢獻算是遠端提供協助並定時提供紀錄報告。於是趁這段時間寫了一份紀錄。

    — 寫於 2024-07-13 至 2024-07-16 , 板橋—

    Hi, this is Jerry.

    這個系統做得有點坎坷,需求和規劃並非一帆風順,而童軍運動也不是有給付薪水的工作(笑),針對吃程式設計這行飯的前後端人手似乎不太好找。這次的實作算是花費了 2024 上半年的很多時間,從一開始需求不清晰到開始找大流量的結構、研究比較服務、前端到後端實作在到配套規劃,中間也是吵吵鬧鬧的,所幸算是還拿的出來一個堪用的東西。未來如果童軍伙伴有需要使用,可以參考部署流程架設,或是想要自己實作的話,也可以抽換裡面的結構來做。 

    就希望這個作品當作一個拋磚引玉的作用吧。希望玩童軍的程式設計師都能有錢、有餘裕再回頭貢獻。

    規劃階段

    這系統原本是從 2023 年底以票務股開始,後來票務股給其他伙伴負責,轉變以數位系統實作為主。原本資訊混亂不清的時候,有滿多各種考慮和作法。

    這是開會筆記,滿多廢話的:https://docs.google.com/document/d/1htCP7UVHd2ug3Fjpj6QJhn2q84CZnRYljaCYXn-KxWo/edit?usp=sharing

    後來隨著資料明確,約 2024 年年初開始明確系統的用例,和大致上的需求規格,當時規劃的規格式:

    1. 參與工作坊的學員+其他人人數需滿足 8000 人規格
    2. 工作坊約 100 個以上。
    3. 4 天活動、一天活動 4 場。
    4. 場地(走馬賴)網路環境正常
    5. 配套規劃:網路壞掉、下雨、設備壞掉、操作有問題
    6. 工作坊有些不熟悉 3C 產品的伙伴,儘量減少操作錯誤的機會。

    於是開始規劃數位系統的結構和用法,因為預算有限,所以針對高併發的需求採用 cloudflare 的服務,後台系統使用現有的 production server 架設 LEMP 結構的前後端分離網站。製作有幾個目標:

    1. 降低未來前端、後端與第三方服務的耦合,使用 Restful API 溝通。
      1. 未來其他伙伴開發可以使用自己熟悉的語言替換。
      2. 服務有更好的替代方案也可以儘量以最少的修改替換。
    2. 不會與全 12 的活動過度綁定,更換為其他活動可以儘量最少的修改。
    3. 能夠防呆的 UX 設計就儘量做上。

    最後決定最佳解是:

    1. Cloudflare 付費方案(每月 5 美元),於六月底開始,預計七月中結束停用。
    2. Production Server 因原本內有現有服務運行,所以先調整規格,活動結束後再確認是否需調降。
    3. 現場運作後台的伙伴之外,配套規劃中安排

    最後除了程式之外,也產出一份包含配套方案的單項計畫書:

    該單項包含了針對活動前幾天可能天氣炎熱、下雨等配套再另外調整,例如考慮到紙本潮濕等規劃用手機拍攝照片,再另行處理等動作。

    題外話,有一件令人費解的事情: Cloudflare Worker Service 提供免費的即時監控功能,在活動前以及撰寫本文的當下(2024-07-13) ,除了伺服器發出的同步流量支外,會查到來自非台南地區的流量(高雄、台中、台北)。

    2024-07-13

    全 12 運作第三天,今天休息,結束前兩天活動。

    有幾個狀況:

    1. 後台系統在現場只有宗翰有權限,不過宗翰太忙了,後續請沈俊達沈校長協助操作後台。
    2. 第一天發現一個 bug:工作坊登入以後,簽到一次離開再回來,場次的選項會消失。
      1. 發現是尚未測試出來的 bug ,已修復。
      2. 這 bug 在開發時,和後續大家一起測試時都沒發現,會需要檢討以後開發與測試的流程。
    3. 工作坊工作人員訓練量不夠,有人並非工作人員,或是工作人員並非參與前期測試和教育訓練。導致訓練不足,第一天時操作狀況頻發。
    4. 「簽出」這個詞彙不是正確的,應該要是「簽退」;「營本部」這個詞彙應該要改成「組本部」。這也是測試的時候沒有發現的狀況,「簽出」有被工作人員誤會成「登出」的動作。
    5. 工作坊時間安排,學員進場時間不一定,導致如果只有 1 人的工作坊,簽到和活動會兼顧不來。
      1. 按原規劃:如果找不到人支援,前後放時作為緩衝在一起開始會比較好。
      2. 原則上有遇到簽到問題,可以先用紙本簽到,有空時再操作。
      3. 沈校長也提議:先把學員護照收起來,中間空檔在再掃描送出。結束時歸還護照。
    6. 老闆面板(展示簽到人數的網頁)有一度統計數字壞掉。
      1. 該網頁是活動組長委外請人協助,後續溝通完成修復。 按:此為因為添加了測試用工作坊的關係,測試工作坊不顯示於系統導致壞掉。
    7. 參觀旅行有一位工作坊工作人員無法掃描學員編號的 QR Code,但透過提供現場 QR Code 的照片來測試掃描正常。可能是手機問題,當下提供幾個作法:
      1. 換台手機掃描。
      2. 先紙本簽到,事後有空時輸入編號。
      3. 手動輸入編號。
    8. 會有需要定時匯出簽到簽退資料的需求。

    另外也有一些和規劃不同的改動:

    1. 榮譽卡和簽退的行為重疊,後續取消簽退動作。
      1. 影響到系統部分判斷的流程。但不難處理,統計上已調整不特別判斷指定單一條件。
    2. 改為榮譽卡作為領榮譽章標準,不從系統上撈資料。
    3. 有部分工作坊不願意配合簽到簽退,第一天晚上即改為不強制操作。
      1. 可能會影響到即時追蹤(包括老闆面板)的需求。
      2. 未來如果依然有統計需要,必須要透過規範讓工作坊確實執行。

    於是經過兩天活動,系統作了一些修改:

    1. 修復工作坊網頁場次的 bug。
    2. 修復工作坊紀錄可能會出現空的學員編號問題。
    3. 修復後台操作時發現的 bug。
    4. 修改老闆面板、學員場次統計的簽退條件,改為有紀錄(無論只有簽到還是簽退)就納入紀錄。
    5. 修改擷取頁面。
      1. 場次簽到簽退會有重複、簽錯的行為,必須要開啟指定四個場次時間的頁面。
      2. 改為不指定日期,依照當前日期判斷。
      3. 活動結束關閉,早上再開啟。
      4. 這操作必須要優化才行。

    大部分都是第一天活動出現的狀況,第二天活動運作較為正常。除掃描問題以外大多為偵測到簽錯場次的行為。簽錯場次問題可考慮以下修復步驟:

    1. 查找資料庫,找到錯誤的紀錄場次與工作坊編號。並且查找錯誤的紀錄應正常屬於哪些場次。
    2. 於資料庫中查找正確的場次,確認該工作坊是否有補輸入學員編號。
    3. 登入 Cloudflare 後台 KV 頁面,確認該筆 KV 欄位( key 值:signMWS_{{工作坊}}_{{場次}} ),點開 json 檔案確認要移除的資料。
      1. 只需移除不需添加,添加資料於後台動作即可。
    4. 如果工作坊於正確場次沒有輸入學員編號。
      1. 於資料庫中把錯誤場次的紀錄修改為正確場次即可。
      2. 後台操作中補輸入正確場次的學員資料。 並確認資料庫刪除錯誤場次的資料。
    5. 如果工作坊已經有補簽到(部分的)學員編號。
      1. 於資料庫中刪除錯誤的資料,修改沒有補簽的學員場次。
      2. 後台操作中補輸入正確場次的學員資料。 並確認資料庫刪除錯誤場次的資料。

    2024-07-14

    活動倒數第二天。明天就先收工。

    目前看起來結構算是穩定,吧?今天理解沒錯的話,應該工作人員操作也會上手了,先撇除掉操作錯誤的選項,針對數字有問題的內容做確認調整。

    滿有趣的是因為第一天晚上先取消了不強制簽退的動作,所以後面的工作坊單一場次的紀錄,有些會只有簽到,有些會只有簽退,也有些會想要兩個都做但是有一次簽錯場次。 這對統計並沒有很大的影響,但是對老闆面板的展示數量的 API 倒是有差,主要糾結在時間跨度很大的工作坊(參觀旅行)在展示數字上即便往後的場次也要照常顯示,而一般單純沒有該場次的工作坊,如果沒有簽出(或是取消簽出判斷),就很容易被當作是有跨度需求的工作坊,而顯示在其中。

    這個規劃可以看成是一個規則怪譚的遊戲,一個人玩真的不太好玩。嘗試把他列出來,邀請有興趣的伙伴可以試試看如果先規劃藍圖,能夠畫到多細,得以滿足所有規則和規格。

    場景(需求規格):

    1. 工作坊: 100-140 個。
    2. 場次數量:切分成 4 個場次,上午 2 場,中午休息,下午 2 場。
    3. 使用人數: 8000 人。
    4. 活動 5 天,中間休息 1 天。
    5. 目的:統計參與人數、展示正在活動(簽到)人數。
    6. 必要功能:
      1. 簽到、簽退。
      2. 後台匯出統計完成一定場次以上數量的學員。
      3. 需要有一個展示頁面展示當前於各個工作坊的活動中的學員人數。

    功能:

    1. 工作坊
      1. 簽到與簽退:輸入工作坊編號、場次編號、學員編號送出。
        1. 紀錄以下欄位:簽到/簽退、當前時間、工作坊編號、場次編號、學員編號。
      2. 讓工作坊自行檢查是否輸入正確。
    2. 後台
      1. 簽到簽出資料查詢。
        1. 查得到對應學員、工作坊資料。
      2. 指定條件的簽出簽到資料匯出。
        1. 必要搜尋欄位:場次編號、工作坊編號、學員編號。
      3. 編輯簽到簽出資料
        1. 必要可編輯的欄位:場次編號、工作坊編號、學員編號。
      4. 指定條件的學員匯出。
        1. 滿足滿 N 個活動完成的學員,做為獎章頒發依據之一。

    規則:

    1. 未必所有工作坊一天都是 4 個場次。以下列舉狀況:
      1. 30 個工作坊他們是整天的活動,所以只會有一個場次簽到。
      2. 有工作坊場次不會連續。
      3. 工作坊會有臨時關閉與臨時開啟的狀況。
    2. 簽到簽出速度 / 流程儘量快。
    3. 因腹地廣闊,學員移動速度有限,可能會陸陸續續到工作坊,差距最長約 30 分鐘。
    4. 需要解決/修復資料與確認配套的狀況:
      1. 發現某個工作坊應該有資料卻沒有資料。
      2. 發現某個工作坊數量異常多或異常少。
      3. 不熟悉操作(通常發生在第一天)導致速度太慢影響活動時長。
      4. 場次可能會輸入錯誤。(填錯場次)
      5. 學員可能會輸入錯誤。(學員跑錯場)
      6. 設備、載具有狀況等無法正常使用系統。
    5. 現場網絡環境與流量頻寬的承載量未知是否能承載學員上網。
    6. 活動的各項決議可能導致確認完整規格離第一次測試時間約 1-2 個月。
    7. 工作坊現場活動的人數需有一個展示頁面。
      1. 必要欄位:工作坊、工作坊活動人數、當前日期、天氣。

    有興趣可以可以規劃看看。

    2024-07-15

    活動倒數最後一天(對我來說)。營期幾天就感冒了幾天,結束我要去吃火鍋。

    這樣的系統目標是放在商業運作,我還是那個理念,無論怎麼想,有獲利的營運有機會是進步的動力。然而這套系統離商業運作還有一段路要走。觀察下來應該要克服幾點:

    1. 專業團隊組成

    我一直認為軟體設計一個人製作如果不是用時間和財力去堆積的話,成果有限。我認為技術團隊可以透過現有的服務或是外包來搭配,像是購買版型套版來減輕或是取代美術需要製作的工作時數、快取服務架設成本太高則找適合的雲端服務來頂著。但是其實這取代不了團隊最核心的優勢就是從不同角度的討論和溝通,以及互相 cover,我會認為如果團隊組建得宜,同樣的開發時間和同樣的需求,應該會做得更加細緻而且體驗更好。

    1. 使用者溝通訓練 vs. UX 規劃

    這應該不能算是一種糾結,簡單講是因為自己不是專業於 UX 設計的人,導致這塊表現平平甚至不佳,所以某種程度上只能寄情於希望給使用者的訓練能夠完善,這滿好笑的。總歸是能力不足,解決方式還是看能不能團隊中有企劃能夠針對活動內容做設計調整吧。

    1. 儲存結構調整

    這塊應該多花一些時間規劃的,像是把 KV 換成 D1,或是 KV 設計的結構上有成本考量、開發考量以及功能考量,但真的運用在活動時,覺得可能換成 D1 也許是用錢來換命的好方法。然而也可以考慮自架伺服器的方式,最大的難點應該是如何實作快取服務了,我想快取的資料還是用拉取的方式會好一點,無法主動掌控同步時機有點兒危險。

    1. 更多的應用

    我認為在推廣新的概念新事物上,賣方市場創造應用是很重要的。如果連應用都沒有,挖掘需求的目的就是從一開始就不存在的。可以用到的創意太多了,像是鼓勵工作坊的競爭、鼓勵學員回饋、提供給營報/媒體新聞素材等等,接不只直接的創造了統計分析的需求,甚至會需要因應適合的 KPI 設計,添加了一些新的欄位。而且以數據科學的角度,應該要從這些數據發現:「活動該怎麼改善」這是一個重中之重。

    其實很需要人阿。

    另外機會難得,我得把 Cloudflare Worker 的統計資料抓出來。 

    * 不同顏色表示不同版本,營期前半個月之後原則以修復 bug 為主不新增功能,所以看到顏色變化,即是當下有發現問題緊急修復。
    * 以小時為單位採樣。

    另外我得記得收尾的工作:

    1. 整理原始碼,打包開源(記得刪掉沒用的 code)
    2. 把 API 文件打出來,提供開發規格。
    3. 寫心得。
    4. 把 Cloudflare 付費停用。
    5. 把擷取頁面的 windows 主機停用。
    6. 調降 Production Server 規格。

    希望我感冒趕快好。

    這篇獻給李宗翰,他真的很辛苦,而且開會時一直被我嗆又要張羅一堆事情。
    也感謝沈俊達沈校長營期時大力幫忙,還有許多配合的工作坊伙伴和其他伙伴。


    希望軟體圈子文人相輕的文化這時可以發揮功用,看不下去的就出來做吧。

    2024-07-26 update

    整理了一個新解,紀錄一下:

    流程上修改

    1. 工作坊場次之間預留間格,約是最長路程的 3/2 的時間作為「路程時間」。例如這次活動路程最長約半小時,抓 20 分鐘作為場次與場次之間的緩衝。
    2. 訓練工作坊「必須最早簽到時間」為場次開始前 1/2 的路程時間,不得提早。
    3. 如無必要,取消簽退動作。

    系統上修改

    1. 工作坊介面移除場次選項,改為自動判斷。抓取時間作判斷。
    2. 工作坊介面移除確認動作,解開單一裝置登入行為(因為不會有循序的問題),即掃即輸入,加快掃描速度。
    3. 除了第一場以外,其他時間為場次開始前後 1/2 路程時間判斷。
    4. 如果該工作坊沒有上一場的場次,則計算為下一場。
    5. 如果超過 10 分鐘沒有連續打卡會跳場次提示的警告。
    6. 快取服務如果依然選用 Cloudflare 處理, key 值改為「前綴_場次_工作坊編號_學員編號」,顆粒切更細。
      • 需要修改工作坊的清單介面,採用 list 方式取值。
      • 注意使用上因為大量採用 list 取值,費用可能會增加,需精算。
    7. 如果有預算,考慮 Cloudflare 使用 D1 服務作為快取+後台的永久儲存機制,可以實作關連式資料庫,簡化快取服務實作。
      • 注意 D1 服務是付費服務,需確認預算與限制。
    8. 如果採用自架的伺服器,請務必考慮到工作坊介面 requests 的峰值數量,或是有需要能夠透過流程或系統實作分流的動作。

    判定上/同步處理

    1. 場次填錯的話,如果只是需要判定場次數量則不用特別去修復(頂多會填成上一個場次)
    2. 同步簽到紀錄行為上,添加一個只能由後台/開發人員動作的「該筆記錄作廢」的 flag 欄位,作為手動處理同步資料作廢用途。
      • 如果作廢的話,資料則不顯示在後台、API 上。
    3. 如果需要在意場次:同步簽到上著手,判斷學員編號有同一個場次、不同工作方的簽到時依照簽到時間自動修正
      • 修正使用的邏輯是「作廢舊的且錯誤的紀錄、添加新的正確紀錄」,避免同步錯誤。
    4. 同步行為如果依然選用 Cloudflare 實作快取服務,採用 list 操作,抓取「前綴_場次_工作坊編號」動作為佳(考慮 list 長度以及抓取時間的平衡);如果自架服務,則需考慮同步抓取的資料量大小與完整同步一次的時間做平衡。

    以上。

    最後放一些做封面圖時生成的圖片,滿好看的,有需要請自行取用。

  • 《女性主義理論與流變》重點整理與心得

    《女性主義理論與流變》重點整理與心得

    俗話說的好:「讀懂原理,使用套件。」看完書以後開始看其他人的讀書心得和重點整理來補完內容。

    我想嘗試使用 ChatGPT 針對《女性主義理論與流變》這本書做重點整理。必須先自首,自己對於記憶實在太不在行,尤其是這類介紹形式的內容,除了幾個較為貼近自身經驗的組織和價值觀(e.g. 主婦聯盟、激進女權主義、精神分析女性主義等),對於記憶錯誤的恐慌和掌握錯重點的「被指責沒讀書」的恐懼實在與日遽增,於是想嘗試用一個「不負責任的」方式來做重點整理,最後來嘗試描述自己對於看完書以及從中得到的想法和體會。

    我這次使用的方法是將這本書的原文 pdf 餵給 ChatGPT(我有買正版電子書),並且「訪問」ChatGPT 請他回答我的內容。(其中的問題是我詢問過 N 遍以後整理過的,並非實際詢問內容。)

    請注意, ChatGPT 會幻想,資訊並非完全正確。

    —– 以下開始訪問 —-

    請給我一份重點重點整理,按照章節分類,列點形式。

    第一章 追求自由、平等與獨立──自由主義女性主義

    • 起源於啟蒙運動,強調個人自由和平等權利。
    • 主張男女在教育、財產、參政和婚姻上的平等權利。
    • 批評主要在於未能挑戰性別分工及公私領域的界線。

    第二章 烏托邦的追尋與失落──烏托邦社會主義女性主義/馬克思主義女性主義

    • 強調資本主義與父權體制對女性壓迫的雙重影響。
    • 倡導經濟獨立和消除性別分工,致力於革命性變革。
    • 推動育兒和家務公共化,提倡男女共同參與家務。

    第三章 拒絕做第二性的女人──存在主義女性主義

    • 由西蒙·波娃提出,代表作《第二性》。
    • 強調女性在歷史和文化中的他者地位。
    • 批評波娃過於認同男性價值。

    第四章 顛覆一切壓迫的根源──激進女性主義

    • 起源於1960年代末的美國。
    • 主張性別壓迫是最根本的剝削形式,強調性別革命。
    • 推動性別平等法案,建立女性自助團體和庇護所。

    第五章 探測陽具的版圖──精神分析女性主義

    • 借鑒佛洛伊德理論,強調無意識和早期經驗對性別認同的影響。
    • 分析性別常模通過家庭生活建構。
    • 批評佛洛伊德的厭女症觀點,探討女性心理和文化特徵。

    第六章 解析父權體制與資本主義──當代社會主義女性主義

    • 結合馬克思主義,強調女性在再生產勞動中的價值。
    • 倡導經濟獨立,推動革命性變革。

    第七章 突破異性戀機制的壟斷──女同志理論

    • 強調女性應擺脫異性戀體制的束縛,推動女同志運動。
    • 代表人物包括芮曲和羅德。
    • 挑戰傳統性別和性欲規範,倡導多元性別和性傾向認同。

    第八章 連結女性與自然、永續共存救地球──生態女性主義

    • 源於1970年代的環保運動。
    • 批判資本主義和男性中心主義。
    • 提倡節能、護樹和社區改造,強調集體行動。

    第九章 突顯多元與尊重差異──後現代女性主義

    • 挑戰權威和真理,強調多元和差異。
    • 代表人物包括西蘇、伊希迦赫和克瑞絲緹娃。
    • 解構陽性價值,強調女性特質和多重主體性。

    第十章 由上往下推動性別平等──國家女性主義

    • 倡導在體制內推動女性平等,利用國家機制實現性別主流化。
    • 推動性別比例制和婦女政策機構。
    • 部分批評者認為過於依賴體制內改革。

    第十一章 性別與種族、階級和文化的交織──後殖民女性主義

    • 批判西方女性主義的種族和文化盲點。
    • 提倡交織性,分析女性在種族、階級和性別中的多重壓迫。
    • 代表人物包括柯林斯和史碧華克。

    請列點裡面有哪些女性主義流派(細分),主張與代表人物。

    細分的女性主義流派及其主張和代表人物

    1. 自由主義女性主義

    • 主張:強調個人自由和平等權利,主張男女在教育、財產、參政和婚姻上的平等權利。
    • 代表人物:瑪麗·吳爾史東克拉夫特(Mary Wollstonecraft)、約翰·斯圖亞特·密爾(John Stuart Mill)

    2. 烏托邦社會主義女性主義/馬克思主義女性主義

    • 烏托邦社會主義女性主義
      • 主張:強調合作的集體主義,婦女應從家庭中解放出來,參與社會生產工作。主張婚姻應以個人情欲為基礎,以集體化生活取代私人家庭。
      • 代表人物:夏洛特·帕金斯·吉爾曼(Charlotte Perkins Gilman)、奧古斯特·貝貝爾(August Bebel)
    • 馬克思主義女性主義
      • 主張:強調資本主義與父權體制對女性壓迫的雙重影響。倡導經濟獨立和消除性別分工,致力於革命性變革。推動育兒和家務公共化,提倡男女共同參與家務。
      • 代表人物:弗雷德里希·恩格斯(Friedrich Engels)、亞歷山德拉·柯倫泰(Alexandra Kollontai)

    3. 存在主義女性主義

    • 主張:由西蒙·波娃提出,強調女性在歷史和文化中的他者地位。主張女性應拒絕傳統角色,追求個人自由和獨立。
    • 代表人物:西蒙·波娃(Simone de Beauvoir)

    4. 激進女性主義

    • 主張:主張性別壓迫是最根本的剝削形式,強調性別革命。強調揭露和解構性別權力關係,倡導建立女性自助團體和庇護所。提倡去除或超越性別分類,追求個別差異而非性別角色。
    • 代表人物:舒拉米斯·費爾斯通(Shulamith Firestone)、凱瑟琳·麥金農(Catharine MacKinnon)

    5. 精神分析女性主義

    • 主張:借鑒佛洛伊德理論,強調無意識和早期經驗對性別認同的影響。分析性別常模通過家庭生活建構。強調母職和人格發展的關係。批評佛洛伊德的厭女症觀點,探討女性心理和文化特徵。
    • 代表人物:南希·喬德羅(Nancy Chodorow)、多蘿西·丁尼斯坦(Dorothy Dinnerstein)

    6. 當代社會主義女性主義

    • 主張:結合馬克思主義,強調女性在再生產勞動中的價值。倡導經濟獨立,推動革命性變革。主張女性自成一階級,強調階級觀念在性別體系分析中的重要性。採用歷史唯物論,補充馬克思分析中的性別盲點。
    • 代表人物:克里斯蒂娜·德爾菲(Christine Delphy)、朱麗葉·米切爾(Juliet Mitchell)

    7. 女同志理論

    • 主張:強調女性應擺脫異性戀體制的束縧,推動女同志運動。女同志以女人愛女人、女人認同女人來擺脫男人的控制和定義。挑戰傳統性別和性欲規範,倡導多元性別和性傾向認同。提出「女同志連續體」的概念,認為所有認同女人的女人都可以是女同志。
    • 代表人物:安德里亞·德沃金(Andrea Dworkin)、奧黛麗·羅德(Audre Lorde)

    8. 生態女性主義

    • 自然生態女性主義
      • 主張:強調女性與自然的親密關係,認為女人本質上與自然親近。倡導保護環境,反對資本主義的發展模式。
      • 代表人物:瑪麗·戴利(Mary Daly)
    • 社會生態女性主義
      • 主張:強調女性與自然的關係是社會建構的結果。提倡社區改造,強調互助和非暴力的價值觀。
      • 代表人物:卡羅琳·墨欽(Carolyn Merchant)

    9. 後現代女性主義

    • 主張:挑戰權威和真理,強調多元和差異。批判傳統性別二分法,強調女性的多重主體和邊緣位置的優勢。
    • 代表人物:海倫·西蘇(Hélène Cixous)、露絲·伊里格萊(Luce Irigaray)、茱莉亞·克里斯蒂娃(Julia Kristeva)

    10. 國家女性主義

    • 主張:倡導在體制內推動女性平等,利用國家機制實現性別主流化。推動性別比例制和婦女政策機構。主張政府應在推動性別平等中扮演積極角色。
    • 代表人物:安·菲利普斯(Anne Phillips)、伊麗莎白·弗雷澤(Elizabeth Frazer)

    11. 後殖民女性主義

    • 第三世界女性主義
      • 主張:批判西方女性主義的種族和文化盲點,強調殖民歷史對女性的影響。提倡交織性,分析女性在種族、階級和性別中的多重壓迫。主張第三世界女性應基於對種族、階級和性別的共同思考方式建立政治合作。
      • 代表人物:蓋亞特里·斯皮瓦克(Gayatri Spivak)、莫寒蒂(Chandra Mohanty)
    • 交織性理論
      • 主張:強調多重壓迫的交織,分析女性在種族、階級和性別中的多重壓迫。
      • 代表人物:帕特里夏·希爾·柯林斯(Patricia Hill Collins)、金伯利·克倫肖(Kimberlé Crenshaw)

    以上是一些重點整理。我還另外詢問了 ChatGPT 關於文中描述到各種女性主義的好壞。
    激進女性主義有哪些好處與壞處

    激進女性主義是女性主義運動中的一個重要流派,主張性別壓迫是最根本、最深刻的剝削形式,並致力於根本改造社會。以下是激進女性主義的一些好處與壞處:

    好處

    1. 揭示根本問題
      • 激進女性主義深入剖析性別壓迫的根源,認為性別壓迫是所有其他形式壓迫的基礎,這種分析有助於揭示社會中深層次的不公正和不平等。
    2. 挑戰既有制度
      • 激進女性主義不滿足於小幅度的改革,致力於從根本上改變現有的性別秩序和社會制度,這種激進的立場有助於推動深層次的變革。
    3. 推動法律和社會變革
      • 激進女性主義者的努力促進了許多法律和政策上的變革,如反對強姦、家暴和性騷擾的法律,推動了性別平等的立法。
    4. 強調個人與政治的聯繫
      • 激進女性主義提出「個人的即政治的」這一重要理念,將個人的經驗與廣泛的社會結構聯繫起來,促使人們重新思考個人生活中的性別問題。
    5. 推動女性團結
      • 激進女性主義強調女性之間的團結和互助,建立了許多女性自助團體和庇護所,為遭受壓迫的女性提供支持和幫助。

    壞處

    1. 排他性與分裂
      • 激進女性主義有時會因其激進的立場而排斥其他女性主義流派,造成女性主義運動內部的分裂與排他性。
    2. 過於理想化
      • 一些激進女性主義者的目標過於理想化,如完全消除性別差異或完全改變社會結構,這在實踐中可能難以實現,導致實際成效有限。
    3. 忽視多重壓迫
      • 雖然激進女性主義強調性別壓迫,但有時會忽視種族、階級、性取向等多重壓迫的交織,未能全面考慮所有女性的不同處境和需求。
    4. 激進策略的反效果
      • 激進女性主義的某些策略如過於激進的抗議和行動,可能引發社會反感或反彈,影響女性主義運動的形象和推動效果。
    5. 現實操作的困難
      • 激進女性主義的根本改造目標在現實操作中面臨巨大困難,難以在短期內取得顯著成效,這可能導致運動參與者的挫折感和失望。

    總的來說,激進女性主義在揭示性別壓迫根源、推動深層次變革和強調女性團結方面具有重要作用,但在策略和實踐上也面臨一些挑戰和局限。

    文中描述到關於「靈性」與女性主義的關連為何?是否會與宗教相關?

    靈性與女性主義的關連

    《女性主義理論與流變》中提到靈性與女性主義的關連,強調了靈性對於女性主義運動的重要性。靈性女性主義者主張,女性應該尋求與自然和自我的靈性聯繫,這往往涉及到對傳統宗教的批判和重新解釋。以下是具體的關連和宗教相關的內容:

    1. 地球本位之靈性
      • 靈性生態女性主義強調女性與自然的親密關係,主張我們的身體和心智都是自然的一部分,強調與自然、動植物及人類的相互關聯性。
      • 這種靈性觀點強調同情心和共情,提倡過有同情心的生活方式,並批評那些缺乏同情心的環保觀點​​。
    2. 靈性生態女性主義與宗教
      • 大多數靈性生態女性主義者認為,除非父權制的宗教(尤其是基督教)能去除其無所不在、脫離現實的男性精神,否則女人應摒棄這些宗教的壓迫性限制,到自然的開放空間中進行靈性活動。
      • 靈性生態女性主義者從各種地球本位的靈性中汲取力量,往往轉向古代的神祇崇拜和以自然為重心的北美印地安儀式。她們相信,視女人身體為神聖的文化,也會把自然看成是神聖的,並尊重其週期與韻律​​。
    3. 伊希迦赫與靈性
      • 伊希迦赫結合了東方文化的瑜伽思想,推廣修習瑜伽練氣,強調靈氣的能量超越語言的表達,幫助人們穩定身心靈的平衡。
      • 她認為,瑜伽的氣息操練既能維持個體的主體性,也能建立與他者保持對等且相互傾聽的和諧關係,喚醒內在的神聖靈性,體現身心靈的整合​​。

    結論

    靈性女性主義強調通過與自然和他者的聯繫,發展同情心和共情,以實現身心靈的整合,並在尊重差異的基礎上建立和諧的倫理關係。這一理論常常與傳統宗教觀點產生衝突,提倡摒棄壓迫性的宗教形式,轉向更加自然和靈性的實踐。

    請列點分析各種女性主義的衝突。

    以下是《女性主義理論與流變》中各種女性主義之間的衝突分析:

    1. 自由主義女性主義 vs. 激進女性主義

    • 自由主義女性主義
      • 主張在現有體制內推動平等權利。
      • 強調法律和政策改革。
    • 激進女性主義
      • 認為性別壓迫是根本性的,需要徹底改變社會結構。
      • 批評自由主義女性主義過於溫和,不觸及根本問題。

    2. 馬克思主義女性主義 vs. 自由主義女性主義

    • 馬克思主義女性主義
      • 強調資本主義與父權制的雙重壓迫,主張經濟改革。
      • 批評自由主義女性主義忽視階級問題。
    • 自由主義女性主義
      • 強調個人權利和平等機會。
      • 認為馬克思主義女性主義過於注重階級,忽略個人自由。

    3. 激進女性主義 vs. 精神分析女性主義

    • 激進女性主義
      • 強調性別壓迫的社會結構和政治層面。
      • 批評精神分析女性主義過於注重心理層面。
    • 精神分析女性主義
      • 強調無意識和早期經驗對性別認同的影響。
      • 認為激進女性主義忽視了心理層面的複雜性。

    4. 後現代女性主義 vs. 其他女性主義

    • 後現代女性主義
      • 挑戰權威和真理,強調多元和差異。
      • 批評其他女性主義過於本質化,強調性別二分法。
    • 其他女性主義
      • 強調普遍的女性經驗和權利訴求。
      • 認為後現代女性主義過於解構,缺乏實際行動。

    5. 國家女性主義 vs. 激進女性主義

    • 國家女性主義
      • 主張利用國家機制和國際組織推動性別平等。
      • 強調制度內的改革。
    • 激進女性主義
      • 認為國家女性主義過於依賴體制,缺乏根本性的挑戰。
      • 主張從根本上改變社會結構和性別關係。

    6. 生態女性主義 vs. 馬克思主義女性主義

    • 生態女性主義
      • 強調女性與自然的親密關係和環保價值。
      • 批評馬克思主義女性主義忽視環境問題。
    • 馬克思主義女性主義
      • 強調經濟結構和階級鬥爭。
      • 認為生態女性主義過於理想化,忽略經濟基礎。

    7. 女同志理論 vs. 自由主義女性主義

    • 女同志理論
      • 強調女性應擺脫異性戀體制的束縛,推動女同志運動。
      • 批評自由主義女性主義忽視性取向的壓迫。
    • 自由主義女性主義
      • 強調法律和政策上的平等權利。
      • 認為女同志理論過於專注於性取向,忽略普遍性別平等。

    8. 後殖民女性主義 vs. 西方女性主義

    • 後殖民女性主義
      • 批判西方女性主義的種族和文化盲點,強調殖民歷史對女性的影響。
      • 強調交織性,分析多重壓迫。
    • 西方女性主義
      • 強調普遍的女性經驗和權利訴求。
      • 有時忽視了非西方女性的特殊處境和需求。

    這些衝突反映了不同女性主義流派在理念、策略和重點上的差異,展示了女性主義運動的多樣性和複雜性。

    (我還問了一些無聊的問題)請依照章節,把所有出現的人名都列出來。

    以下是《女性主義理論與流變》中各章節出現的人物列表:

    第一章 追求自由、平等與獨立──自由主義女性主義

    • 瑪麗·吳爾史東克拉夫特(Mary Wollstonecraft)
    • 約翰·斯圖亞特·密爾(John Stuart Mill)

    第二章 烏托邦社會主義女性主義/馬克思主義女性主義

    • 夏洛特·帕金斯·吉爾曼(Charlotte Perkins Gilman)
    • 奧古斯特·貝貝爾(August Bebel)
    • 弗雷德里希·恩格斯(Friedrich Engels)
    • 亞歷山德拉·柯倫泰(Alexandra Kollontai)
    • 馬克思(Karl Marx)

    第三章 拒絕做第二性的女人──存在主義女性主義

    • 西蒙·波娃(Simone de Beauvoir)
    • 讓-保羅·沙特(Jean-Paul Sartre)
    • 黑格爾(Georg Wilhelm Friedrich Hegel)
    • 胡賽爾(Edmund Husserl)
    • 馬丁·海德格(Martin Heidegger)

    第四章 顛覆一切壓迫的根源──激進女性主義

    • 舒拉米斯·費爾斯通(Shulamith Firestone)
    • 凱瑟琳·麥金農(Catharine MacKinnon)

    第五章 探測陽具的版圖──精神分析女性主義

    • 南希·喬德羅(Nancy Chodorow)
    • 多蘿西·丁尼斯坦(Dorothy Dinnerstein)
    • 弗洛伊德(Sigmund Freud)

    第六章 解析父權體制與資本主義──當代社會主義女性主義

    • 克里斯蒂娜·德爾菲(Christine Delphy)
    • 朱麗葉·米切爾(Juliet Mitchell)

    第七章 突破異性戀機制的壟斷──女同志理論

    • 安德里亞·德沃金(Andrea Dworkin)
    • 奧黛麗·羅德(Audre Lorde)

    第八章 連結女性與自然、永續共存救地球──生態女性主義

    • 瑪麗·戴利(Mary Daly)
    • 卡羅琳·墨欽(Carolyn Merchant)

    第九章 突顯多元與尊重差異──後現代女性主義

    • 海倫·西蘇(Hélène Cixous)
    • 露絲·伊里格萊(Luce Irigaray)
    • 茱莉亞·克里斯蒂娃(Julia Kristeva)

    第十章 由上往下推動性別平等──國家女性主義

    • 安·菲利普斯(Anne Phillips)
    • 伊麗莎白·弗雷澤(Elizabeth Frazer)

    第十一章 性別與種族、階級和文化的交織──後殖民女性主義

    • 蓋亞特里·斯皮瓦克(Gayatri Spivak)
    • 莫寒蒂(Chandra Mohanty)
    • 帕特里夏·希爾·柯林斯(Patricia Hill Collins)
    • 金伯利·克倫肖(Kimberlé Crenshaw)

    這些人物在各章節中對女性主義理論的發展和討論起到了重要作用。

    —– 以上結束訪問 —-

    首先先聊聊 ChatGPT 整理的部分,就以自己看完內容加上比對的結果,「訪問」結果大概是堪用但部分資訊有誤,光是出現人名的部分就未必是正確的。但是作為生成式的文字 AI,關於心得的回答倒是滿深得我心:像是關於激進女權主義的好處與壞處,還有不同女性主義之間的衝突描述。雖然有些內容覺得滿莫名的,像是詢問女性主義之間的衝突描述道〈激進女性主義 vs. 精神分析女性主義〉這塊時,我就有一種:「耶??他內文中有這樣寫喔?」有種「我們是看同一本書嗎?」的感覺。這滿有趣的,究竟是我的誤會還是真的是 ChatGPT 的幻想,有待一天得再回去查驗一下就是了。但不得不說,ChatGPT 提供的「觀點」有部分我的確是滿認同的。

    於是我定調「正確使用 ChatGPT 的姿勢」應該要作為一個「便宜的助理/研究員」使用,自己作為「老闆」,責任還是得自己擔的,但經過 order 對方提供的內容,可以透過內容產生「看似有價值」的內容,再來就已自己負責任的態度確認其價值和內容了。 作為創意與觀點有餘,但處理事實需要謹慎查核。

    於是接下來是,經過 ChatGPT 提供內容以後的自己的心得。

    起初這這本是在黃子佼事件之後, threads 獻祭了「男人與熊」(文章)這個議題。threads 因為觸及演算法的關係,看得到很多非同溫層的發文內容,抱怨就不說了,除了看到一堆偏激女權仔和仇女大將軍的交戰,有一篇提到關於女權主義的書單,其中有一個疑似高中生嗆聲說開書單來他就寫五百字心得(回覆連結在此,原文已刪,可惜我沒把原文連結貼上或截圖)。底下一片倒喝采,也不乏一些期待,於是開始對於「激進女權主義」有興趣,初衷是想釐清這到底原本是什麼?難道 threads 上那些偏激仔就是「激進女權主義」者嗎?

    看完書以後我想表達:沒有。激進女權主義的倡議者大概會跳出來說:「我們不一樣」。

    那些覺得怪的偏激內文就只是垃圾內容而已。我會覺得怪是沒錯的。那些會覺得經不起推敲、大量混用標籤、仇恨思想、平面化對象、去脈絡、自己為正義等等,這些都是無論性別議題在其他議題上也常會發生的。我也不想去揣測對方的意圖與能力程度,大概能做的就是離他們遠一點,心情好的時候笑一下就好。

    「喔自由,多少罪惡假汝之名行之!」

    羅蘭夫人

    「自由」在現在也常常被換成「正義」呢。

    而諷刺的是,回頭在 threads 上翻以前那些引用的文章,大多也都移除了,我以後引用覺得怪的內容要得記得截圖和說明脈絡(苦笑),要不以後想到回頭看都找不到內容會滿苦惱的。

  • Claude 的 Sublime Text4 外掛

    Claude 的 Sublime Text4 外掛

    昨天作了一份 ChatGPT 的外掛(請參考這裡),這次補 claude.ai 的外掛,克勞德這個名字聽起來就有種惡靈古堡個感覺(那是克勞薩),也是軟體設計很愛用的 AI 工具之一,希望補上 Sublime Text 裡面可以有一些貢獻與幫助。

    操作方式與上篇 ChatGPT 外掛操作相當,差異在 api 不是同加公司,還有快捷鍵需要分開設定。先附上 API 文件(貼心的是他有中文) 與外掛 repository 位置,這裡

    安裝前需要準備:

    1. Sublime Text 最新版
    2. anthropic 帳號,已有信用卡儲值(我們需要用 claude API


    安裝的方式有別於使用 Package Control 安裝,這使用手動安裝,主要是把 git 中的 “chatgpt” 資料夾放到 Sublime Text 的 Packages 資料夾中就行了。 Packages 資料的夾的位置請參考這裡,可以從 Sublime Text 的 “Preferences -> Browse Packages” 開啟。

    另外我們需要設定 anthropic 的 API Key,請參考官方網站這裡 取得,在 Sublime Text 的的外掛設定: “Preferences -> package-settings -> 👽 ChatGPT -> Settings – User” 之中添加 koken 參數(也可以複製修改 Default 的設定格式)

    使用上有設定 keymap,因為我是 mac用戶,所以操作上,選定一串文字以後快速鍵 cmd+g ,稍等幾秒 ChatGPT 將會回覆資料,將回應貼到選定文字的後面。
    修改快速鍵的話,也是從 “Preferences -> package-settings -> 👽 ChatGPT-> Key Bindings – User” 修改即可。

    手動執行的話也能在 Topbar 的 Tools 中找到 “☁️ Claude” 選項,點一下就執行。記得要選取你要的對話文字喔!

    最後來秀一下資料夾內容

    主要的 claude.py 和之前寫 chatgpt.py 功能差不多,都可以當作簡單的 request/response 機制。

    值得一提的是 claude 的 api 應該是使用了 cloudflare 來處理,我從 curl 上呼叫沒問題,但 Sublime Text 會一直收到 1010 的 403 error code ,這在幾個月前第一次嘗試的時候就有遇到,那時傻傻的一直問 AI 然後他一直旋轉我,現在突然會 Google 了XD 後來無奈只能加上 user-agent 的 header ,這太荒謬但有用。

    而且滿值得吐嘈的是:不管 ChatGPT 或是 Claude 直接詢問 API 呼叫的程式碼時,得到的 API endpoint 根本就是幻想生成的,還好 AI 公司算有良心,API 文件不是用 AI 生成的,這次沒注意到為了 www.anthropic.com 和 api.anthropic.com 卡了半小時有點嘔就是。