2026年3月29日 星期日

[AI] 我叫 Claude 和 Gemini CLI 幫我做遊戲 UI,這差異也太大了

我最近在玩一個 side project,在正式動工之前,我想先用 AI 工具快速生一版測試 UI 感受一下。於是我做了一個小實驗,把同樣的設計規格丟給 Claude Code 和 Gemini CLI,看看誰交得出可以用的東西。

結論先說:差很多。而且差別相當大

我給的任務

Prompt 不是隨便一句話,我把完整設計規格都餵進去了:色彩系統、字型規範、各難度的 HP 和傷害數值、UI 元件風格,包含「背景要用程式生成山脈風景,不使用任何圖片」這種很具體的要求。

Claude Code 的結果

第一眼的感覺是:這個東西看起來像是真的做出來要用的。

背景山脈用程式畫出來了,天空有漸層,四張卡片各自有難度色條(Easy 綠、Normal 藍、Hard 橘、Extreme 紅),選中的卡片有藍色邊框——它知道這些卡片是可以被點選的,不是靜態裝飾。數字用的字型也確實對上了規格。

它不只是執行了指令,更像是讀懂了我要做什麼,然後做了設計決策。

Gemini CLI 的結果


我多看了幾秒才搞清楚這是什麼。

版面沒有結構,標題、星星、難度名稱全部排在一起,像是有人在記事本裡打了一份說明文件然後截圖給我看。沒有背景、沒有卡片、沒有顏色,星星甚至還是空心的。

公平地說:資訊都在,難度名稱、題型說明一個沒少。但「正確的資訊」和「可以用的畫面」是完全不同的兩件事。

AI 輔助開發,我現在的想法

這次實驗讓我重新思考一件事,用 AI 做開發,難點從來不是「讓它執行指令」,而是「它能不能把你腦袋裡的意圖轉成實際的決策」。

「半透明卡片」要怎麼做才有質感?山脈要幾層、透明度怎麼疊才自然?這些細節我在規格書裡都只描述了感覺,沒有給答案——因為我自己也不知道答案。這需要的不只是照著清單做事,而是真的理解「這個遊戲想給人什麼感受」,然後做出對應的判斷。

Claude Code 的結果讓我覺得那個東西後面有個人在做設計。Gemini CLI 的結果,讓我覺得它完成了一份清單。

Claude Code 的輸出也不是零缺陷,還有幾個細節要調。但它給的是一個可以繼續改的起點,而不是一個要從頭重蓋的廢墟。


2025年12月25日 星期四

[投資] 2025 年投資回顧與未來展望

2025 年經過了投資決策重大改變,以結論來說是可行的,今年市值增加 34.2%,表現勝過台股和美股(台股大盤 27.71%,NASDAQ 18.75%),報酬有貼著大盤在走,其實我就很滿意了,算是有符合預期,重點是把多點研究投資的時間移走,放到我覺得更想花時間的地方,才是最值得的事。

重點數字

市值增加:34.2%
平均現金水位:6.16%(比去年低)
台股大盤投報:27.71%
NASDAQ 投報:18.75%

2026 年的策略:定期定額 指數型 ETF

2025 年標的

006208、0050、QQQ

2025 年市值變化圖

2025年8月9日 星期六

[Podcast] 博音 EP186 訪問侯文詠

不知為何覺得這次訪問還蠻喜歡的,好像有些事情值得整理一下

成長並非單純地「變得更好、更厲害、更強」,有時更是因為累積了經驗和想法,能夠對過去的自己或發生的事情有新的看法或理解

相當有感,無論是大到人生觀或價值觀,小一點到職場,再小一點到玩個傳說對決,都很適用的想法

侯文詠在30歲前後擔任末期癌症病人的疼痛控制醫生,這讓他從「生命終點」的視角來看人生。他發現金錢、名氣、權力都不是最重要的,親密關係才是病人最放不下的

真的是如此,我覺得,認清你最重要的親密關係,從平常就開始好好守護,就算突然有個意外發生也不會有任何遺憾

金錢有時會限制想像,重要的是「不要去追錢,只有錢追著我」。把喜歡的事做好,並想辦法持續喜歡它

每天上班覺得累,只有發薪水那天才有短暫的快樂,是追錢的思維,試著改變一下,訓練心態把工作成喜歡的事,把喜歡的事做好,或許會有不同發展,或是換個不同工作

他強調金錢最大的用處是「買選擇權」,能讓你「有得選」,例如有能力拒絕不喜歡的百萬演講

就跟文憑的概念一樣,或許能讓你有機會了解更多事情,讓你知道未來其實有更多選擇;遇到問題時的思路也可以同樣套用,若這件事情做了能讓你有更多選擇的話,會是比較好的

要成為自己不討厭的大人,必須保留一小部分(如5%-10%)的時間,允許自己「沒效率、耍賴、耍廢」,去做自己喜歡的事,甚至只是嘗試沒去過的餐廳

效率至上的人,也不是做所有事都很有效率,而是做出沒效率的事情時會格外痛苦,試著平常就讓自己不要這麼有效率,或許會有不同的心態,這想法蠻不錯的

Reference

【#博音】EP186 | 誰要聊歡樂三國志啊!我只想聊怎麼成為自己喜歡的人 ft. 侯文詠


2025年8月3日 星期日

[書籍分享] 別把你的錢留到死:懂得花錢,是最好的投資——理想人生的 9 大財務思維

 

書籍圖片:來自 Kobo
評分:★★★

書中重點在分享觀念,沒有太具體的做法,畢竟每個人情況都不同,有觀念應該更勝於做法。


看完最大的的收穫在於,對於退休有規劃的人,或許可以想得簡單一些,不要對自己太苛刻了,重點在於金錢是否能帶來較好的收獲,書中強調的是記憶複利,把錢花在美好的回憶是非常值得的,像是旅行。


下面也分享一些覺得不錯的段落


金錢的效用會隨著年齡增長而下降

你享受體驗的能力,取決於你的經濟能力和你的健康,持續累責財富並不一定能為你帶來更多的體驗,因為無論你多有錢,日益惡化的健康狀況都會限制你享受某些體驗。健康衰退和財富增加的黃金交叉約為 45 歲。

遺產要給在較佳的時機

把錢給孩子的最佳時間是 26 ~ 35 歲之間,不會太早到他們會揮霍殆盡,也不會太晚到拿到這筆錢沒什麼感覺,能給在他們真的需要一筆錢的時候,會是較佳的時機,可能會是他們需要買房子或者是賺業的時候。

2025年2月16日 星期日

[投資] 投資決策重大改變

Photo by Pixabay

以後就只買 006208 QQQ

還是得面對一個投資上長久以來的問題,那就是最終我只想買 ETF 就好,若知道最終要這麼做,那為何不現在就這麼做呢?這樣可以讓我再花更少時間在投資上,關注個股有無出問題,真的要處置時還要考慮一次賣出或分批賣出,當時是賺還賠等等棘手的問題,實在還是會花太多時間了,而且重點是花時間下去研究,也不見得會有相對應的報酬,這時間花下去的投報率實在不高


再跟 Claude、Perplexity 和 ChatGPT 討論了一下長期投入和單筆投入的風險和選擇優缺後,大致歸納如下

  1. 長期來看約 2/3 的情況下,單筆投入的報酬率優於分批投入,而單筆投入的缺點是會在市場下跌時心理壓力較大;我目前在做再平衡的過程中,手上有很多現金時才做單筆投入,其他時間我只要確保我每月都能投錢進市場,仍是降低風險的作法,有長期投資 15~20 年的心理準備來說,心理壓力應該還行
  2. 選擇 6208 和 QQQ,缺點大概就是 6208 有很大比例是台積電,但 6208 本來就有汰弱留強的機制所以這點不擔心,QQQ 的缺點就是以科技業為主和波動大,我會每個月定期定額投入的話,也就是降低風險的做法,所以波動大的缺點應該還好
  3. 最後就是 QQQ 有匯率風險,這點倒是可以思考一下,若還是以生活在台灣主要使用台幣來思考的話,可以在這 20 年投資期間慢慢改變 QQQ 在資產裡的比重減少匯率風險,從 50% 每年大約減少 2.6 左右,到 20 年後剛好降到 0%

這個月會將 00878、中華電、合庫金、AAPLTSLAARKW 一次賣掉,然後把錢一次投入 006208 QQQ,接著就繼續每月持續定期定額

2025年1月18日 星期六

[投資] 2025 標的改變策略

Photo by Andrea Piacquadio

決定了,把合庫金和中華電逐漸移出我的投資組合

原因與風險思考

其實這件事我已經思考了很久。雖然我每月只花一天處理投資決策,但這個問題常會讓我多花時間,因此,我決定在 2025 年將這件事想清楚並做好決策。

關於中華電和合庫金,自 2022 年起,我採用 "定期定額 + 再平衡" 的投資方式,主要目的是透過它們來領取穩定的股息。回顧過去的投資表現,這兩個標的在市場大漲大跌時都能保持小漲小跌,確實是一種穩定軍心的概念股,非常符合我保守的投資屬性。但隨著我逐漸理解到,退休後也可以透過賣股票來獲得現金,而不一定需要完全依賴股息收入,這讓我開始思考,是否還有必要繼續持有它們。

定期定額的確是一種平滑市場波動的策略,而當投資組合中再加入防守型標的時,這種平滑效果會更加明顯。但從 2021 年到現在,經歷了股市的起伏,再回頭檢視每年的投資報酬率,我發現其實不需要讓投資組合「這麼」平滑。我認為可以嘗試減少部分平滑因子,讓組合稍微承擔更多波動,同時追求更高的潛在報酬。再加上去年中,我已經開始逐步移出一些美股中風險較高的標的(link),這更加堅定了我進一步調整投資組合的想法。

所以,我決定把合庫金和中華電移出標的,最後會只留下 006208、00878、AAPL 和 QQQ

如何逐漸賣出

賺錢時,賣掉一份,同時也買一份本月要買的標的,讓資金轉換過去
賠錢時,因為我不想賠錢,繼續投入,讓虧損平滑一些,也能持續參與

Reference

[投資] 2022 年投資回顧與未來展望
[投資] 定期定額過程中改變投資標的



2024年12月21日 星期六

[投資] 2024 年投資回顧與未來展望

Photo by Matheus Bertelli

2024 年繼續使用 定期定額+再平衡 的操作,今年市值增加 47.93%,表現小贏台股,超越美股(台股大盤 45%,NASDAQ 30%),到去年都還一直在想這樣的投資策略,到底會不會持續打贏大盤,我今年真的是想通了,就是我找不出答案 😂,只要投資策略能讓我能持續在市場上,報酬率能跟著大盤走其實就足夠了,所以今年的策略也開始做些調整,我想把 TSLA 和 ARKW 這種風險較高的慢慢移出,換成其他目前手上風險較低的標的,可預期的是整個投資會漸漸往大盤靠,蠻好的

重點數字

市值增加:47.93%
平均現金水位:11.77%
台股大盤投報:45%
NASDAQ 投報:30%

2025 年的策略:定期定額 + 再平衡 + 慢慢移出風險較高的標的

定期定額:每個月操作一次,輪流投入每個標的,當標的歷史價格低於十年前太多時,當次投入兩倍

再平衡:每半年將投報超過 20% 或平均的標的,賣出賺錢的部份

2025 年標的

006208、00878、5880 合庫金、2412 中華電、QQQ、ARKW、AAPL、TSLA

2024 年市值變化圖



2024年6月15日 星期六

[投資] 定期定額過程中改變投資標的

Photo by Ketut Subiyanto

投資標的裡有包含一些高風險的像是 TSLA & ARKW,在心裡想了一套適合自己的做法,想要在未來慢慢的減少佔比,做到持續不影響心情和不增加研究投資時間

賠錢時繼續定期定額

未來會如何真的不確定,能確定的只有我不想賠錢 😂,既然已經定期定額一段時間了,就繼續在賠錢時投入,讓虧損平滑一些,也能持續參與

賺錢時把部份賣出換成其他標的

有賺錢的時候,把定期定額的金額從這些標的裡賣出,直接轉換成其他標的,以我為例,就是轉到 QQQ

2024年6月2日 星期日

[selenium] chrome driver issue: disconnected: not connected to DevTools

使用 chrome driver 第 6 個月後,第一次遇到這個問題,記錄一下處理過程,遇到問題如下圖


這是發生在不斷發出 request 後的 11 分鐘左右才遇到的,若是使用時間較短的,目前沒遇到此問題。

然後我又看到下面資訊,想說,該不會是 browser 和 chrome driver 的版本第四個數字不一樣造成的吧?
capabilities":{"acceptInsecureCerts":false,"browserName":"chrome-headless-shell","browserVersion":"125.0.6422.142","chrome":{"chromedriverVersion":"125.0.6422.141

但 chrome driver 目前能 download 到的只有 125.0.6422.141,該不會這個 .142 版的 browser 有什麼更新真的讓 .141 driver 產生問題了吧,google 了一下,目前沒發現什麼解法,

[後記][2024/07/06] 後來又有一天什麼都沒動,再重跑一次就可以用了,結論就是,不確定原因是什麼,但這個原因可能會消失,之後若再遇到的話,若 chrome driver 都更新好了,就只能改天再試試了


2024年2月25日 星期日

[scrapy] 實戰記錄 - 台北 101 網站

攝影師:Pixabay

為了增加百貨公司品牌爬蟲的內容, 近期開始研究台北 101 網站,找到這裡可以看到全部的品牌,把這些都爬出來就行了

先找出正確的 element

從下圖可看出,這些品牌存在於 "listarea logo" class 下面的 "cardobj lazyload show" class 中

問題:

準備好 request https://www.taipei-101.com.tw/tw/shopping/brandsearch 然後去拿 "cardobj lazyload show" class 裡的資料,但會發現抓不到資料,將 response.text 印出來後存成檔案才發現,"listarea logo" class 裡是沒有內容的

處理方式:

發現這些品牌資訊是另外 request 去拿到 json 檔案回來 parse 而成

這邊直接找出此 request,直接用 python 去抓回來 parse 完成





2023年12月30日 星期六

[投資] 2023 年投資回顧與未來展望

攝影師:Walls.io

2023 年使用了定期定額+再平衡的操作,今年用市值來看績效比較單純,市值增加 62.5%,若不計算入金也就是純投資的部份,市值增加 51%,表現超越台美股大盤(台股大盤 24%、NASDAQ 43%),記得去年投資回顧有提到,大盤投報好的時候,我的投報可能會落後,看來打破了這個預期;既然時間用的少,大盤好與壞時的績效都還可以接受,那就繼續這麼做下去吧。

重點數字

市值增加:62.5%
市值(不含入金)增加:51%
平均現金水位:11.7%
台股大盤投報:24%
NASDAQ 投報:43%

2024 年的策略:定期定額 + 再平衡

定期定額:每個月操作一次,輪流投入每個標的,當標的歷史價格低於十年前太多時,當次投入兩倍

再平衡:每半年將投報超過 20% 或平均的標的,賣出賺錢的部份

2024 年標的

006208、00878、5880 合庫金、2412 中華電、QQQ、ARKW、AAPL、TSLA

2023 年市值變化圖





2023年12月3日 星期日

[App] 百貨小工具隱私權保護政策

非常歡迎您使用百貨小工具,為了讓您安心使用百貨小工具的各項服務,特此向您說明百貨小工具的隱私權保護政策,以保障您的權益,請您詳閱下列內容:


隱私權保護政策的適用範圍
隱私權保護政策內容,包括百貨小工具如何處理在您使用百貨小工具時收集到的使用情況,但絕對不會收集個人隱私資料。隱私權保護政策不適用於百貨小工具以外的相關連結網站,也不適用於非百貨小工具所委託或參與管理的人員。

個人資料的蒐集、處理及利用方式
當您使用百貨小工具時,百貨小工具會記錄您的點選資料,做為改進百貨小工具的參考依據,此記錄為內部應用,絕對不會對外公佈。我們會視需要公佈統計數據,但不會涉及個人資料。

資料之保護
百貨小工具完全使用 Google 提供的開發環境與平台工具,完全沒有使用第三方資源。

隱私權保護政策之修正
百貨小工具隱私權保護政策將因應需求隨時進行修政,修正後的條款將刊登於此。

2023年10月18日 星期三

[iOS][Swift][App] Xcode 15 and iOS 17 Error: DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS, use TOOLCHAIN_DIR instead

Error message

升級到 iOS 17 後,也得升級到 Xcode 15 才能使用了,但原本的 project 卻無法 build 了,遇到的就是上圖的 error,以下是解決方法

  • 請確保 xcode-select -p 有選在正確的 Xcode 15 路徑上
  • brew upgrade cocoapods
    • 若不是使用 brew 的話請使用下面
      • gem update cocoapods
  • Delete Pod directory in your App(if present)
  • pod install
  • pod repo update
  • pod install
  • Clean project 且重 build

Reference

  1. Xcode 15 and iOS 17 - Error: DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS, use TOOLCHAIN_DIR instead #12065 (link)

2023年8月29日 星期二

[iOS][Swift][App] 實作搜尋建議

Photo by Ketut Subiyanto

簡單記錄一下實作搜尋建議的方法,完整的程式在下方

struct ContentView: View {
    @State private var searchText = ""
    @State private var selectedSuggestion = ""
    // 建議列表
    @State private var suggestions: [String] = ["Apple 蘋果", "ALLSAINTS", "BOTTEGA VENETA", "COSME DECORTE 黛珂", "Nike 耐吉", "Dell 戴爾", "COS", "Zara", "Emilie Louis", "L.ERICKSON", "SPRAYGROUND", "gubami Social-法式tapas餐廳", "Sarabeth's"]
    @State private var showSuggestions = false
    
    var body: some View {
        VStack {
	    // 搜尋欄位
            TextField("Search", text: $searchText)
                .padding(.horizontal, 15)
                .padding(.vertical, 10)
                .background(Color(.systemGray6))
                .cornerRadius(8)
                .padding(.top, 10)
                .padding(.bottom, 5)
                .onChange(of: searchText) { newValue in
                    showSuggestions = !newValue.isEmpty
                }
            
            // 選擇搜尋建議後的顯示
            if !selectedSuggestion.isEmpty {
                Text("Selected: \(selectedSuggestion)")
                    .padding(.top, 10)
            }
                        
            if showSuggestions {
                List {
                    ForEach(filteredSuggestions, id: \.self) { suggestion in
                        Text(suggestion)
                            .onTapGesture {
                                selectedSuggestion = suggestion
                                searchText = ""  // 清空 TextField
                                showSuggestions = false  // 隱藏建議列表
                            }
                    }
                    if filteredSuggestions.isEmpty {
                        Text("找不到品牌")
                            .foregroundColor(.gray)
                    }
                }
                .background(Color.white)
                .cornerRadius(8)
                .shadow(radius: 5)
                .padding()
            }
            Spacer()  // 添加一個間距,以便頁面內容和建議列表不重疊
        }
        .padding()
        
        var filteredSuggestions: [String] {
            if searchText.isEmpty {
                return []
            }
            return suggestions.filter({ $0.localizedCaseInsensitiveContains(searchText) })
        }
    }
}

2023年8月26日 星期六

[iOS][Swift][App] 整合 Google AdMob 到 iOS App

Photo by Ketut Subiyanto

我在整合 Google AdMob 時卡了超久,Google 了也沒找到很直接能解決的方法,想說在此做個記錄,讓以後的我能照著做,也讓遇到類似問題的人能夠有個解法,以下是參考 官方說明 做的

第一動,Import the Mobile Ads SDK

先在 xocde project 的根目錄下(.xcodeproj 檔案的路徑)執行 pod init,這樣就能產生一個 Podfile 檔案,若沒安裝 cocopods 可以 follow 這裡 安裝,然後再按照 這裡 的做法,加

pod 'Google-Mobile-Ads-SDK'

在 Podfile 檔案,然後執行下面,記得此時要將 xcode 關閉

pod install --repo-update

這邊我遇到一個問題

[!] Unable to determine the platform for the `your project name` target.

解決方法是將 Podfile 檔案裡的第二行 uncomment 就可以了,完成後如下


platform :ios, '9.0'


第二動,Update your Info.plist

遇到的第一個問題是,我找不到 Info.plist 檔案

參考 這邊,原來 info.plist 變成了 project 設定裡的 tab

然後將 GADApplicationIdentifier (1個) 和 SKAdNetworkItems (49個) 輸入(如下圖紅框)


第三動,建立 banner structure 來呼叫顯示廣告
import GoogleMobileAds
struct BannerVC: UIViewControllerRepresentable {
    var bannerID: String
    var width: CGFloat

    func makeUIViewController(context: Context) -> UIViewController {
        let view = GADBannerView(adSize: GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(width))

        let viewController = UIViewController()
        view.adUnitID = bannerID
        
        view.rootViewController = viewController
        viewController.view.addSubview(view)

#if false
        /* Simulator */
        let request = GADRequest()
        let extras = GADExtras()
        extras.additionalParameters = ["suppress_test_label": "1"]
        request.register(extras)
        view.load(request)
#else
        /* Real device */
        view.load(GADRequest())
#endif
        
        return viewController
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
}

struct Banner: View {
    var bannerID: String
    var width: CGFloat

    var size: CGSize {
        return GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(width).size
    }

    var body: some View {
        BannerVC(bannerID: bannerID, width: width)
            .frame(width: size.width, height: size.height)
    }
}
struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text("Hello, world!")
        }
        .padding()
        Banner(bannerID: "ca-app-pub-3940256099942544/2934735716", width: UIScreen.main.bounds.width)
    }
} 

實作方式如上,這邊用的 bannerID 是測試使用的,請參考這邊,順利的話就可以看到下面的畫面

Simulator

若不想在 Simulator 上看到 "Test mode" 的字樣,將上面程式的 /* Simulator */ 上的 if false 改成 if true,就可將之移除如下圖,這功能在你上架 app 提供截圖時會用到
若是跑在實機上的話,上述的程式記得改成 if false,會看到如下畫面
Note

若想 build 在 Mac 上會遇到 No such module 'GoogleMobileAds' 的 error,這個問題我也想知道解答,歡迎提供給我,謝謝

環境

  • Mac Mini M1
  • Xcode Version 14.3 (14E222b)
  • iPhone 12 Pro Max (16.6)

Reference

  • COCOAPODS getting-start (link)
  • Mobile Ads SDK (iOS) Get Started (link)

2023年6月3日 星期六

[scrapy] 使用 scrapy 爬不到資料

Photo by ThisIsEngineering

記錄一下使用 scrapy 遇到的一些問題

問題:
用 browser 打開這個網頁明明就能看到畫面,但使用下面方法後
scrapy shell https://info.sogo.com.tw/tp1/floors/B2 
view(response)
卻只能看到下面錯誤

後來發現,這是因為少設定了 USER_AGENT 的關係,user agent 通常是用來識別 request 這方的軟體、os、device 等資訊,有些 server 會檢查這個 http header 資訊,若沒有的話,就不會回傳正確 response

處理方式:
在 settings.py 裡找到 USER_AGENT 設定,將一個正確的 user agent 填入即可,這邊我是參考 chrome 的 user agent 填入(如下)

問題:
網頁能打開後,卻找不到品牌列表,用 browser 打開往下 scroll 後,會看到如下的畫面,品牌列表的部份看起來是被放在這樣的結構裡

<div class="tab-content">
...
<a href="xxxx" class="brandBox">...</a>

但是使用
scrapy shell https://info.sogo.com.tw/tp1/floors/B2 
view(response)
卻只能看到 <div class="tab-content"> 裡沒有 brandBox 的資料

分析:
用 chrome 的 inspect 可以找到品牌列表是用這個 request 來的

而這個 request 是由 jquery-3.2.0.min.js 裡呼叫的
由此就能確定,找不到品牌列表是因為他是 javascript 的 request 而來的,scrapy 預設是爬靜態網頁,所以我邊需要針對這個 javascript 的 request 多做處理才行

這邊分享兩個 debug 技巧,
1. 在 spider 程式內呼叫 scrapy shell 的功能,在 def parse() 裡寫到下面即可
from scrapy.shell import inspect_response
inspect_response(response, self)
2. 在 spider 程式內印出 response 網頁資料,做法如下
def write_to_file(self, words):
    with open("logging.log", "a") as f:
        f.write(words)

def parse():
    self.write_to_file("response text: %s" % response.text)

處理方式:
使用 selenium 幫忙處理 javascript 的 request,照下面方法將 selenium 安裝且設定好,使用 selenium 的 function 做同一個 url 的 request,response 的資料裡就有品牌列表了
安裝 selenium
pip install scrapy-selenium
安裝 chrome driver
這裡下載跟自己使用的 chrome driver 相近的版本
在 settings.py 裡做好設定
總共四個設定,SELENIUM_DRIVER_EXECUTABLE_PATH 就是填上面下載的 chrome driver 檔案的路徑
在 spider 中使用
這邊不使用原本的 start_urls,而是使用如下的做法
from scrapy_selenium import SeleniumRequest
def start_request(self):
    target_url = "xxx"
    yield SeleniumRequest(url=target_url, callback=self.parse)

原本使用下面兩行去看有多少品牌是 0,設定成功之後,就可以看到 60
brands_num = len(response.xpath('//a[@class="brandBox"]'))
print("brands_num: " + (str)(brands_num))

Reference

2023年2月26日 星期日

[Web] 開源傳說小工具網頁版

Photo by Ben Taylor

在 [App] iOS 傳說小工具誕生以及網頁版結束維護 有提到,網頁版傳說小工具會想 open source,好讓有興趣的人可以繼續維護,現在完成開源了。

開源傳說對決網頁版
https://github.com/bradchow/toolsofrov_web

開源的程式碼原本是在 Heroku 上運作在 php 後台的,所以只要有 php 環境,放上這些檔案就可以直接使用,我只有把下面程式拿掉,然後加上一些 readme.md 和 LICENSE.md

1. Firebase
2. Google Analytics
3. Google Adsense

2023年1月20日 星期五

[App] iOS 傳說小工具誕生以及網頁版結束維護

Photo by Brett Jordan

網頁版傳說小工具使用的主機 Heroku,已經停止免費提供網頁服務了,傳說小工具一直以來的變現能力都不好,所以也不打算花錢買 Heroku 的服務,雖然網頁版傳說小工具就這樣畫上句點,但未來有打算將他 open source,讓有興趣的人可以繼續維護。

網頁版從 2017 年開始服務,當時還提到若要開發 iOS 版必定要花上很長一段時間,我一直沒有忘記這件事,工作緣故讓我必須多接觸 iOS 相關環境,這也正是我著手進行 iOS 版的契機,雖然變現能力不好,Apple Developer 的保護費費用也相當高(每年 100 美金),但在 Android Play Store 後台看到還是有不少人在使用,決定還是要完成這件事,2017 年推出了 Android 版,在經過了 5 年多之後,iOS 版傳說小工具終於上架了,同樣的,第一版功能還蠻陽春,讓我們慢慢改進

傳說小工具 App Store 連結
https://apps.apple.com/app/id1664793884

傳說小工具粉絲專頁
https://www.facebook.com/toolsofrov/


2022年12月31日 星期六

[投資] 2022 年投資回顧與未來展望

Photo by Engin Akyurt

2022 年使用了定期定額+再平衡的操作,已實現投報 1.87%,未實現投報 -20%,從台股大盤 -22%、NASDAQ -33% 看來,表現雖是有比大盤好,但這可能也代表大盤投報好的時候我的投報可能會落後。一個月操作一次的期望都有做到,花的時間也比以前再更少,過程跟績效都符合預期,就這麼繼續做下去吧。

2023 年的策略:定期定額 + 再平衡

定期定額:每個月操作一次,投入月 KD 較低的標的
再平衡:每月若有投報超過 20% 的標的以及每半年做整體再平衡

標的(與去年相同)

0050、00878、5880 合庫金、2412 中華電、QQQ、ARKW、AAPL、TSLA

最後附上 2022 年市值變化圖,資產還能往上的原因是,每個月都有持續投錢進來,只能說金額不多的時候,每個月的存錢會佔較高比例 XD,數字比例上比較好看





2022年12月26日 星期一

[Xcode] 升級 Xcode  後打不開專案 Could not open workspace file at xxx

舊版 Xcode 升級後,打開 Xcode 按下既有 project,遇到上面問題,莫名其秒

解法也不難,從 Finder 裡找到 project 位置,直接執行 <你的 project>.xcodeproj 就能打開了