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) })
        }
    }
}