2025年6月18日 星期三

付費版GPT真的贏Gemini嗎?實際測試分享

今天嘗試請GPT以Python處理三個檔案的資料比對與合併,但付費版GPT給出的代碼卻無法順利執行。於是我轉向Gemini,以相同的提問詞詢問,卻意外發現Gemini所提供的代碼相當精確且更具效率。以我自己目前對Python淺顯的理解,也能看出Gemini所提供的程式碼相對高階且較有優化,邏輯清晰、架構明確。後來我回頭請GPT針對這兩段代碼進行比較,GPT也同意Gemini的方案更具效率與優勢,這點讓我感覺到GPT在程式生成的能力上仍有一些進步空間,期待GPT未來能持續提升品質,更精確地滿足使用者的需求。


以下是詢問GPT兩者差異回覆的內容

功能/邏輯點 你提供的版本(gemini) 我的版本(GPT)
檔案讀取 使用 try-except 包裝,有錯誤處理 沒有包裝,若檔案不存在會直接錯誤
資料前處理 明確轉換 datetime,並加註說明 有轉換,但說明較簡略
合併邏輯 A→B→C 三步驟清晰,欄位更有註解 相同邏輯,但直接寫死欄位選擇,較精簡
欄位名稱檢查 附有對欄位格式的說明與假設 假設用戶已知並匹配正確欄位
欄位過濾與排序 明確指定 output_columns,有邏輯順序 相同,但未顯示中文註解
錯誤處理 包含 readto_excel 的錯誤處理 無錯誤處理(預設成功)
彈性設計 有封裝為函式、支援參數設定 一次性執行程式,不適合模組化
Dummy 資料產生 有產生模擬資料供測試 無產生測試資料,需用戶上傳




以下代碼沒給予真實的路徑時仍然可以用代碼中的例子產出,相當不錯的方式

import pandas as pd


def reconcile_procurement_data(file_a_path, file_b_path, file_c_path, output_excel_path):

    """

    Reconciles procurement, goods receipt, and un-storaged receipt data.


    Args:

        file_a_path (str): Path to the "請採購明細" (Purchase Request Details) Excel file.

        file_b_path (str): Path to the "進料收貨入庫明細" (Goods Received and Stored Details) Excel file.

        file_c_path (str): Path to the "已收貨未入庫明細" (Goods Received Not Yet Stored Details) Excel file.

        output_excel_path (str): Path to save the reconciled Excel file.

    """


    # --- 1. Load Data ---

    try:

        df_a = pd.read_excel(file_a_path)

        df_b = pd.read_excel(file_b_path)

        df_c = pd.read_excel(file_c_path)

    except FileNotFoundError as e:

        print(f"Error: One of the input files was not found. Please check the paths. {e}")

        return

    except Exception as e:

        print(f"An error occurred while reading the Excel files: {e}")

        return


    # Standardize column names for easier merging (adjust these if your actual column names differ)

    # File A (請採購明細) expected columns: '請購部門', '請購單號', '採購單號', '料號', '採購日期'

    # File B (進料收貨入庫明細) expected columns: '採購單號', '料號', '收貨日期', '收貨單號', '異動單號', '異動項次', '數量', '送貨單號', '檢驗日期', '檢驗結果'

    # File C (已收貨未入庫明細) expected columns: '異動單號', '異動項次', '異動日期'


    # Ensure date columns are in datetime format for calculations

    df_a['採購日期'] = pd.to_datetime(df_a['採購日期'])

    df_b['收貨日期'] = pd.to_datetime(df_b['收貨日期'])

    df_c['異動日期'] = pd.to_datetime(df_c['異動日期'])


    # --- 2. Step 1: Match A with B ---

    # Merge df_a and df_b on '採購單號' and '料號'

    # We use a left merge to keep all records from df_a and add matching info from df_b.

    # Since one purchase order can have multiple receipts, this will correctly result in

    # multiple rows for a single purchase order if it has multiple receipts.

    merged_ab = pd.merge(

        df_a[['請購部門', '請購單號', '採購單號', '料號', '採購日期']],

        df_b[['採購單號', '料號', '收貨日期', '收貨單號', '異動單號', '異動項次', '數量', '送貨單號', '檢驗日期', '檢驗結果']],

        on=['採購單號', '料號'],

        how='left'

    )


    # --- 3. Step 2: Match with C ---

    # Merge the result from step 1 with df_c on '異動單號' and '異動項次'

    final_merged_df = pd.merge(

        merged_ab,

        df_c[['異動單號', '異動項次', '異動日期']],

        on=['異動單號', '異動項次'],

        how='left'

    )


    # --- 4. Step 3: Filter by Date Difference ---

    # Calculate the difference in days between '收貨日期' and '採購日期'

    final_merged_df['日期差異'] = (final_merged_df['收貨日期'] - final_merged_df['採購日期']).dt.days


    # Filter for records where the difference is greater than 7 days

    discrepancy_df = final_merged_df[abs(final_merged_df['日期差異']) > 7].copy() # Using abs to catch both earlier and later receipts


    # --- 5. Export to Excel ---

    # Select the required columns for export

    output_columns = [

        '請購部門', '請購單號', '採購單號', '料號', '採購日期',

        '收貨日期', '收貨單號', '異動單號', '異動項次', '數量',

        '送貨單號', '檢驗日期', '檢驗結果', '異動日期', '日期差異'

    ]

    discrepancy_df = discrepancy_df[output_columns]


    try:

        discrepancy_df.to_excel(output_excel_path, index=False)

        print(f"Successfully exported {len(discrepancy_df)} records to '{output_excel_path}' where the date difference is more than 7 days.")

    except Exception as e:

        print(f"An error occurred while writing the Excel file: {e}")


# --- Usage Example ---

if __name__ == "__main__":

    # Create dummy data for demonstration (replace with your actual file paths)

    # Ensure these dummy files reflect the actual column names you're using.

    # For simplicity, I'm assuming English column names in the dummy data and mapping them

    # to the Chinese names expected by the function. You should use the exact Chinese

    # column names in your actual Excel files.


    # Dummy File A: 請採購明細

    data_a = {

        '請購部門': ['RD', 'Sales', 'HR', 'RD', 'Sales'],

        '請購單號': ['REQ001', 'REQ002', 'REQ003', 'REQ004', 'REQ005'],

        '採購單號': ['PO001', 'PO002', 'PO003', 'PO004', 'PO001'],

        '料號': ['ITEM001', 'ITEM002', 'ITEM003', 'ITEM001', 'ITEM002'],

        '採購日期': ['2025-01-01', '2025-01-05', '2025-01-10', '2025-02-01', '2025-01-05']

    }

    df_a_dummy = pd.DataFrame(data_a)

    df_a_dummy.to_excel("請採購明細.xlsx", index=False)


    # Dummy File B: 進料收貨入庫明細

    data_b = {

        '採購單號': ['PO001', 'PO002', 'PO003', 'PO004', 'PO001', 'PO002'],

        '料號': ['ITEM001', 'ITEM002', 'ITEM003', 'ITEM001', 'ITEM001', 'ITEM002'],

        '收貨日期': ['2025-01-07', '2025-01-15', '2025-01-12', '2025-02-15', '2025-01-20', '2025-01-10'], # PO001/ITEM001 has two receipts, one within 7 days, one outside

        '收貨單號': ['RCV001', 'RCV002', 'RCV003', 'RCV004', 'RCV005', 'RCV006'],

        '異動單號': ['TRN001', 'TRN002', 'TRN003', 'TRN004', 'TRN005', 'TRN006'],

        '異動項次': [1, 1, 1, 1, 2, 2],

        '數量': [10, 5, 20, 8, 12, 6],

        '送貨單號': ['DLV001', 'DLV002', 'DLV003', 'DLV004', 'DLV005', 'DLV006'],

        '檢驗日期': ['2025-01-07', '2025-01-15', '2025-01-12', '2025-02-15', '2025-01-20', '2025-01-10'],

        '檢驗結果': ['OK', 'OK', 'OK', 'NG', 'OK', 'OK']

    }

    df_b_dummy = pd.DataFrame(data_b)

    df_b_dummy.to_excel("進料收貨入庫明細.xlsx", index=False)


    # Dummy File C: 已收貨未入庫明細

    data_c = {

        '異動單號': ['TRN001', 'TRN002', 'TRN003', 'TRN004', 'TRN005', 'TRN006'],

        '異動項次': [1, 1, 1, 1, 2, 2],

        '異動日期': ['2025-01-08', '2025-01-16', '2025-01-13', '2025-02-16', '2025-01-21', '2025-01-11']

    }

    df_c_dummy = pd.DataFrame(data_c)

    df_c_dummy.to_excel("已收貨未入庫明細.xlsx", index=False)


    # Define your file paths

    file_a = "請採購明細.xlsx"

    file_b = "進料收貨入庫明細.xlsx"

    file_c = "已收貨未入庫明細.xlsx"

    output_file = "採購收貨日期差異報告.xlsx"


    # Run the reconciliation

    reconcile_procurement_data(file_a, file_b, file_c, output_file)

2025年6月15日 星期日

AI x Python:提升效率的超強組合

6月12日參加了「AI與Python協作課程」,透過這次實作課,我更深入了解Python實務上的運用方式。雖然課程時間有限,內容以實作為主,較少涉及基礎理論的講解,但幸好我之前自學過VBA及一些Python的基本概念,因此更能快速理解講師的操作示範。特別是講師展示如何搭配AI快速完成Python代碼,更讓我感覺到自己也有能力運用AI快速完成符合個人需求的程式。像這次使用AI撰寫Python爬蟲抓取股價資料,非常迅速就完成,而之前透過AI產生的VBA爬蟲程式卻未能順利運行,這也讓我對於Python在爬蟲方面的強大效能有了更深刻的印象。


回想幾年前初學Python時都是在本機安裝環境後使用,這次講師示範了Google Colaboratory,透過線上環境直接撰寫Python程式,不須額外安裝本機環境,省去不少麻煩。此外,講師介紹的Google Workspace Marketplace(類似手機上的應用程式商店),提供各式實用工具的整合功能,也拓展了我的視野。透過線上服務結合AI使用Python,讓我在非程式專業領域的工作,也能快速上手與運用。未來無論是在工作效率提升上,或是個人日常需求如爬蟲、檔案分類等任務,將變得更加便利與容易。


下面是我用ai給予的代碼run股價的畫面。

google colaboratory
google colaboratory_web_python


2025年5月19日 星期一

VBA_廢品轉換

 以下是我請AI做的動作,AI整理我要的動作如下,問了ChatGPT、gemini、Grok,之前詢問過的簡單版前身,是gemini勝出,這次Grok勝出,但Gpt修改錯誤後,也可以運行。



廢品轉換的問題資料
廢品轉換的問題資料

廢品轉換的結果
廢品轉換的結果










✅ 第一個動作:

  1. 找出料號為「3開頭」的第一筆出庫(數量為負數)資料。

  2. 根據該出庫的「單號」,列出料號為「1開頭」的轉換庫存資料(相同單號)。

✅ 第二個動作:

針對每一筆第一動作中出現於 J欄的料號,找出該料號在該日期以後的**第一筆出庫(負數)**紀錄,並記錄下來。


Sub 出庫轉換追蹤_GPT版()


    Dim wsA As Worksheet, wsB As Worksheet

    Dim lastRowA As Long, outRow As Long

    Dim dictFirstOut As Object, dictTransfer As Object, dictSecondOut As Object

    Dim i As Long, key As String

    Dim partNo As String, qty As Double, docDate As Date, docNo As String

    Dim item As Variant

    Dim cellData As Variant


    Set wsA = ThisWorkbook.Sheets("A")

    Set wsB = ThisWorkbook.Sheets("B")

    wsB.Cells.ClearContents

    

    lastRowA = wsA.Cells(wsA.Rows.Count, "A").End(xlUp).Row

    outRow = 2 '從第2列開始輸出

    Set dictFirstOut = CreateObject("Scripting.Dictionary")

    Set dictTransfer = CreateObject("Scripting.Dictionary")

    Set dictSecondOut = CreateObject("Scripting.Dictionary")

    

    ' ========== 第一個動作:找出料號3開頭第一筆出庫 ==========

    For i = 2 To lastRowA

        partNo = Trim(wsA.Cells(i, "A").Value)

        qty = wsA.Cells(i, "H").Value

        docNo = wsA.Cells(i, "G").Value


        If Left(partNo, 1) = "3" And qty < 0 Then

            If Not dictFirstOut.exists(partNo) Then

                dictFirstOut.Add partNo, i

            End If

        End If

    Next i

    

    ' 輸出料號3開頭第一筆出庫

    wsB.Cells(1, 1).Resize(1, 9).Value = Array("料號", "品名", "規格", "倉庫", "儲位", "單據日期", "單號", "數量", "單位")

    wsB.Cells(1, 10).Resize(1, 9).Value = Array("轉入料號", "品名", "規格", "倉庫", "儲位", "單據日期", "單號", "數量", "單位")

    

    For Each key In dictFirstOut.Keys

        i = dictFirstOut(key)

        docNo = wsA.Cells(i, "G").Value

        docDate = wsA.Cells(i, "F").Value


        ' 輸出出庫資料(3開頭)

        For j = 1 To 9

            wsB.Cells(outRow, j).Value = wsA.Cells(i, j).Value

        Next j

        

        ' ========== 取得轉換庫存(同單號且料號為1開頭) ==========

        For k = 2 To lastRowA

            If wsA.Cells(k, "G").Value = docNo And Left(wsA.Cells(k, "A").Value, 1) = "1" Then

                For j = 1 To 9

                    wsB.Cells(outRow, 9 + j).Value = wsA.Cells(k, j).Value

                Next j

                ' 儲存料號及日期,用於第二個動作

                dictTransfer.Add outRow, Array(wsA.Cells(k, "A").Value, docDate)

                Exit For '只取一筆轉入資料

            End If

        Next k

        

        outRow = outRow + 1

    Next key

    

    ' ========== 第二個動作:找出J欄料號對應日期後第一筆出庫 ==========

    wsB.Cells(1, 19).Resize(1, 9).Value = Array("後續出庫_料號", "品名", "規格", "倉庫", "儲位", "單據日期", "單號", "數量", "單位")

    

    For Each key In dictTransfer.Keys

        partNo = dictTransfer(key)(0)

        docDate = dictTransfer(key)(1)

        found = False

        For i = 2 To lastRowA

            If wsA.Cells(i, "A").Value = partNo And wsA.Cells(i, "H").Value < 0 Then

                If wsA.Cells(i, "F").Value > docDate Then

                    ' 找到符合條件的出庫

                    For j = 1 To 9

                        wsB.Cells(key, 18 + j).Value = wsA.Cells(i, j).Value

                    Next j

                    Exit For

                End If

            End If

        Next i

    Next key


    MsgBox "處理完成!"


End Sub


---------------------以下為grok版,代碼行數差不多

Option Explicit


Sub ProcessInventory_grok()

    Dim wsA As Worksheet, wsB As Worksheet

    Dim lastRowA As Long, lastRowB As Long

    Dim i As Long, j As Long, outputRow As Long

    Dim dict As Object, key As Variant

    Dim firstOut As Object, transferOut As Object

    Dim found As Boolean

    

    ' 設定工作表

    Set wsA = Sheets("A") ' 庫存明細帳

    Set wsB = Sheets("B") ' 整理結果

    lastRowA = wsA.Cells(wsA.Rows.Count, "A").End(xlUp).Row

    

    ' 清空 SheetB 內容(保留標題)

    wsB.Cells.ClearContents

    wsB.Range("A1:I1").Value = Array("料號", "品名", "規格", "倉庫", "儲位", "單據日期", "單號", "數量", "單位")

    wsB.Range("J1:R1").Value = Array("料號", "品名", "規格", "倉庫", "儲位", "單據日期", "單號", "數量", "單位")

    wsB.Range("S1:AA1").Value = Array("料號", "品名", "規格", "倉庫", "儲位", "單據日期", "單號", "數量", "單位")

    

    ' 使用 Dictionary 儲存料號以 3 開頭的第一筆出庫記錄

    Set dict = CreateObject("Scripting.Dictionary")

    Set firstOut = CreateObject("Scripting.Dictionary")

    

    ' 第一個動作:找出料號以 3 開頭的第一筆出庫記錄

    For i = 2 To lastRowA

        If Left(wsA.Cells(i, 1).Value, 1) = "3" And wsA.Cells(i, 8).Value < 0 Then

            Dim partNo As String

            partNo = wsA.Cells(i, 1).Value

            If Not firstOut.exists(partNo) Then

                firstOut.Add partNo, i

            Else

                ' 比較單據日期,保留最早的

                If wsA.Cells(i, 6).Value < wsA.Cells(firstOut(partNo), 6).Value Then

                    firstOut(partNo) = i

                End If

            End If

        End If

    Next i

    

    ' 將結果寫入 SheetB

    outputRow = 2

    For Each key In firstOut.Keys

        i = firstOut(key)

        ' 寫入 A:I 欄(料號以 3 開頭的第一筆出庫)

        wsB.Range("A" & outputRow & ":I" & outputRow).Value = _

            wsA.Range("A" & i & ":I" & i).Value

        

        ' 找出同單號下料號以 1 開頭的記錄

        Dim docNo As String

        docNo = wsA.Cells(i, 7).Value

        found = False

        For j = 2 To lastRowA

            If wsA.Cells(j, 7).Value = docNo And Left(wsA.Cells(j, 1).Value, 1) = "1" Then

                ' 寫入 J:R 欄(轉換庫存訊息)

                wsB.Range("J" & outputRow & ":R" & outputRow).Value = _

                    wsA.Range("A" & j & ":I" & j).Value

                found = True

                Exit For ' 假設每單號只有一筆料號以 1 開頭的記錄

            End If

        Next j

        If found Then outputRow = outputRow + 1

    Next key

    

    ' 第二個動作:比對 J 欄料號,找出日期之後的第一筆出庫

    Set transferOut = CreateObject("Scripting.Dictionary")

    lastRowB = wsB.Cells(wsB.Rows.Count, "A").End(xlUp).Row

    

    For i = 2 To lastRowB

        partNo = wsB.Cells(i, 10).Value ' J 欄料號

        If partNo <> "" And Left(partNo, 1) = "1" Then

            Dim refDate As Date

            refDate = wsB.Cells(i, 15).Value ' O 欄單據日期

            Dim earliestRow As Long, earliestDate As Date

            earliestRow = 0

            earliestDate = DateSerial(9999, 12, 31) ' 初始為遠未來日期

            

            ' 找出該料號在參考日期之後的第一筆出庫

            For j = 2 To lastRowA

                If wsA.Cells(j, 1).Value = partNo And wsA.Cells(j, 8).Value < 0 And _

                   wsA.Cells(j, 6).Value > refDate Then

                    If wsA.Cells(j, 6).Value < earliestDate Then

                        earliestDate = wsA.Cells(j, 6).Value

                        earliestRow = j

                    End If

                End If

            Next j

            

            ' 寫入 S:AA 欄

            If earliestRow > 0 Then

                wsB.Range("S" & i & ":AA" & i).Value = _

                    wsA.Range("A" & earliestRow & ":I" & earliestRow).Value

            End If

        End If

    Next i

    

    MsgBox "處理完成!請檢查 SheetB 的結果。", vbInformation

End Sub



2025年5月10日 星期六

購入新的AI PC

 



5/7拿到新購入的迷你AI電腦,在此簡單做個紀錄。


項目規格內容
型號ASUS NUC( NUC14RVB)
處理器Intel Core Ultra 7 155H(Meteor Lake,7nm)
16 核心(6P+8E+2LP) / 22 執行緒,最高時脈 4.8GHz
內建 AI NPU(Intel AI Boost)
TDP28W(基礎功耗),適合效能與節能兼顧的使用場景
主機板ASUSTeK Computer Inc. 型號 NUC14RVB
支援 PCIe Gen5 / Gen4
記憶體32GB DDR5(雙通道 2x16GB)
運作頻率約 DDR5-1514(預設 JEDEC 值)
儲存裝置1TB PCIe Gen4 M.2 SSD(根據您選購的版本與平台判斷)
顯示晶片Intel Arc GPU(內建於 Meteor Lake)
無線連線Wi-Fi 6E + Bluetooth 5.x(NUC 系列標配)
其他功能Thunderbolt 4、2.5Gb LAN、有多組 USB-C、HDMI 等輸出
作業系統Windows 11 Pro(隨機預載)
BIOS 日期2025/01/08,已為新版 BIOS,支援 Meteor Lake 平台

2025年3月30日 星期日

有Ai的協助,自學python 需達到的程度

在有ai的情況下,學習python 需達到的程度,比我想的多了些,不過要能看懂及修改的確是需要具備。



很好的問題!以你結合 AI 製作投資 YouTube 影片的目標來看,其實不需要學習到非常進階的程式設計程度,但要掌握以下幾個關鍵層級:


【你該掌握的 Python 能力範圍】

一、基礎語法(1~2 週)

  • 變數、資料型別(list, dict, tuple)
  • 條件判斷、迴圈、函式定義
  • 錯誤處理(try/except)

目標:能看懂簡單 Python 程式,修改別人的腳本


二、資料處理與分析(1~2 個月)

  • Pandas:讀取 CSV、篩選欄位、資料清理、群組統計
  • NumPy:簡單數學運算(不一定必學,但常搭配 Pandas)
  • Matplotlib / Plotly:製作折線圖、K 線圖、配息趨勢圖

目標:能自動化投資數據分析、生成圖表(如抓 ETF 歷史報酬、個股本益比變化)


三、抓取資料與自動化(1~2 個月)

  • Requests / BeautifulSoup:網路爬蟲,抓 Yahoo Finance、CMoney 等網站的股價/財報
  • OpenAI API / Hugging Face Transformers(若需用 AI)
    • 呼叫 ChatGPT API,生成腳本、自動摘要財報、新聞整理

目標:用程式自動抓資料、簡單應用 AI 工具,減少你手動處理的時間


四、進階選修(未必要學,但可加分)

  • Streamlit / Gradio:快速把 Python 分析做成互動網站(展示投資模型)
  • LangChain / Agent 工具:建構 AI 助理(進階應用)
  • Selenium / Playwright:模擬點選登入、擷取資料(進階爬蟲)

【你可採取的學習方式】

1. 專案導向學習

  • 舉例:「用 Python 製作一份每月配息股 Top10 排行榜」
  • 比較容易吸收,且能與影片腳本或圖表製作整合

2. 搭配 AI 協助學習

  • 問我:「這段程式碼的意思是什麼?」「能幫我改成顯示殖利率前10名股票嗎?」

【總結】

只要學到「資料處理 + 圖表繪製 + 自動化爬資料」這三塊,你就已經可以打造一個 AI + 投資資料驅動的頻道了


Gpt提供的學習清單


以下是依照個人工作技能等相關領域,詢問gpt得到的學習清單,雖然有些建議是之前就想過的內容,但gpt給予階段性的建議,至於執行程度會與空閒時間有關,還沒退休時學習新事物,可能會跟工作上被要求學習的內容有衝突,但仍然先收下參考。



太好了!你結合「會計+稽核+投資+自動化工具」的背景,再加入 AI 與內容創作,未來打造個人投資品牌 YouTube 頻道會非常有潛力。

以下是為你規劃的2~3 年學習路線圖,分為「技能基礎」、「內容創作」、「AI應用」三大方向。


【第 1 階段】打底期(0-6 個月)

目標:強化資料呈現能力,開始製作試驗內容

技能學習

  1. 進階 Power BI
    • DAX 語法、模型設計
    • 投資分析報表(如殖利率比較、ETF 組合績效)
  2. 簡報與說故事技巧
    • 學習如何把數據講成故事(推薦:《Storytelling with Data》)
  3. 影音剪輯工具入門
    • CapCutDaVinci Resolve(免費也夠用)
    • 學會剪片、加字幕、配音

小任務

  • 開始製作投資觀念簡報(如「股息成長股 vs 高殖利率股」)
  • 練習用 Power BI 呈現簡單投資分析,搭配簡報說明
  • 看 5 個投資型 YouTuber 學他們的腳本架構與講法

【第 2 階段】加速期(6~12 個月)

目標:進入AI輔助製作、產出簡單影片、建立觀眾輪廓

技能學習

  1. ChatGPT / AI 文字工具應用
    • 寫影片腳本、標題、影片描述、SEO 標籤
  2. AI 圖像 / 簡報製作
    • 使用 Canva、Gamma 或 Microsoft Designer 製作吸睛封面與簡報
  3. AI 語音工具
    • ElevenLabs、Voice AI:可用 AI 語音配音節省錄音時間

小任務

  • 發佈第一支 YouTube Shorts 或簡短解說影片
  • 用 ChatGPT + Power BI 組合製作一個「每月投資觀點分享」
  • 測試不同主題吸引力(如財報解讀、ETF比較、投資心法)

【第 3 階段】深化與品牌建立期(1~2 年)

目標:穩定產出影片內容,打造個人品牌與社群

技能深化

  1. 腳本設計與節目架構
    • 建立固定欄位(如:本週ETF觀察、投資書摘、資產配置術)
  2. YouTube 成長策略
    • 了解演算法、觀眾維度(CTR、觀看時長)
    • 學會使用 YouTube Analytics 分析成效
  3. 建立社群與變現模式
    • 經營 IG / FB / Line 社群
    • 發展數位商品(如投資模版、電子書、課程)

【第 4 階段】延伸與擴張期(2~3 年)

目標:內容商業化,打造個人品牌與收入來源

可以發展方向:

  • 線上課程:入門投資、財報閱讀、用 Power BI 看懂股票
  • 專屬社群/訂閱服務:付費社團、月度資產配置分享
  • 企業合作或顧問案:投資品牌合作、報表顧問等


記錄我的AI進化之路:從初次付費版開始

 

3/12正式將GPT升級為付費版本,主要是因為工作上許多專業內容需要AI快速且大量的初步資料整理。經過半個月的實際使用,感覺付費版本確實相當划算,不僅速度更快,回答的精確度與實用性也明顯提高,帶來了更高的工作效率。

原本還考慮要不要同時訂閱另一家AI工具,不過現階段各家AI仍有提供一定程度的免費使用額度,以目前的需求而言,一個付費版配合其他免費工具,已經綽綽有餘。或許未來當我工作中更深度地融入AI協作時,會再考慮訂閱第二個付費AI服務。

目前在這裡特別記錄一下半個月以來使用AI的心得,未來再回頭檢視AI工具對我的工作效率、決策品質,以及整體生活帶來了哪些影響。

2025年1月12日 星期日

清洗儲熱桶熱水器

1/4,我自行拆下儲熱桶的電熱棒,清理內部並排除其中的泥沙。上一次清理是在2017/12/31(事隔7年),當時請維修人員檢查熱水器不熱的原因,順便清理了儲熱桶內的泥沙和結晶。當時我觀察工人拆裝的方式,發現操作相當簡單,因此這次決定自己動手處理。拆下後發現泥沙比想像中少,讓我不禁懷疑岳母當初購買的儲熱桶是否為二手品(才隔6年),因為之前清理時內部相當髒亂。


這次自行拆裝還有另一個原因,是想確認是否因泥沙堆積導致漏水。後來發現問題其實是水管接頭未鎖緊所致。經過這次經驗,未來若再次發生漏水問題,我會先仔細檢查並確認原因,避免浪費時間處理不相關的部分。同時,這次的操作也讓我再次確認拆裝並不困難。此外,電熱棒似乎已接近需要更換的狀態,下一次處理時,應該能更快速完成。


注意事項:斷水、斷電

使用工具:WD40((除鏽)、鉗子、一字起子(止水)、十字起子



使用工具


斷水

底部可以簡單放水清潔

電熱棒接法







電熱棒4KW



電熱棒長度





儲熱桶內排空清潔







漏水的地方

乾掉後的泥沙(大約1小碗)









更換紗窗

 

今年第一次挑戰自己動手更換紗窗。回想兩年前,曾經請人更換3樓的紗窗,當時花費約1500-2000元左右。這次因為老婆大人在IG上看到有人到小北百貨買DIY工具自行更換紗窗,便提議我試試看,於是我也決定親自動手操作。


這次總共更換了頂樓曬衣場的3個紗窗。1月5日先更換了第一片,花費約1小時完成。到了1月11日,再接著更換另外兩片,經驗累積後,速度進步到每片約30分鐘。


第一片紗窗更換時,使用的是4.5mm壓條。本來剪了一小段舊壓條到賣場比對,但可能因舊壓條已經受擠壓縮小,導致尺寸判斷錯誤。當時滾紗窗的過程非常順利,但裝好後感覺紗窗稍微鬆動,似乎不夠緊實。後來,為了更穩固,我另外購入了5.5mm壓條。這次壓條非常緊實,甚至因為滾壓力度過大,還把紗窗滾到有些缺角。不過,相較於第一片,後來的兩片更換得更加牢固,整體完成度也提升許多。


這次DIY的過程,雖然一開始有些手忙腳亂,但在經驗中學習,越做越熟練,最終也完成了一項看似不容易的挑戰!



工具:剪刀、美工刀、一字起子(可以不用)、滾輪(小北)、4.5nm壓條(小北)、5.5nm壓條(小北)、長尾夾(固定邊框)

紗窗:防霾紗窗(小北)







更換工具

換好的紗窗

裝上後

防霾紗窗

防霾紗窗






更換浴室通風扇

 

上週(1/2),小孩浴室的通風扇壞了,讓我聯想到之前主臥的通風扇也曾壞掉並更換過。因為有過一次經驗,這次更換速度比上次(2021/11)快了許多,也更加熟練。


在挑選過程中,我查了一些其他品牌,但最後還是選擇了建商原本使用的品牌,猜想價格會比較實惠。第一次購買時印象中約花了1000元,而這次在蝦皮一次買了兩台,平均每台約850元。以主臥更換後使用10年的壽命來看,這樣的價格相當划算。


舊的通風扇拆下後,我簡單清理了一下,打算試試用潤滑油處理,看看是否能解決問題,或許還能繼續使用,延長它的使用壽命。


  • 品牌(KNS康乃馨 ES-100)
  • 使用工具電動起子(十字、一字),一字用在電線接頭(舊的接法鬆開)




更換前內部已經有點髒


 

更換前先確認接的方式


更換後


付費版GPT真的贏Gemini嗎?實際測試分享

今天嘗試請GPT以Python處理三個檔案的資料比對與合併,但付費版GPT給出的代碼卻無法順利執行。於是我轉向Gemini,以相同的提問詞詢問,卻意外發現Gemini所提供的代碼相當精確且更具效率。以我自己目前對Python淺顯的理解,也能看出Gemini所提供的程式碼相對高階且...