文章

顯示從 2022 起發佈的文章

[LeetCode] 寫了400題 LeetCode 後的經驗

圖片
相信大部分人寫 LeetCode 是為了面試,我也不例外,我的 LeetCode 過程大概可以分成三段: 一開始覺得很難,就斷斷續續的寫,也不知道方向在哪 面試將近,每天瘋狂地刷題目 面試後,每天寫 daily challenge 磨練自己的技巧 我就列出一些我覺得我寫 LeetCode 犯的一些錯誤,還有後來要怎麼避免的方法。 LeetCode 常犯的錯誤 錯誤 1: 按照題號寫 一開始只是覺得說哪天會要面試,所以我先來寫寫看,所以就從題號 1, 2, 3, ... 往後慢慢寫。後來發現這樣寫其實不是很好的做法,因為: 遇到 hard 的題目就會讓人卡住花很多時間,而這些 hard 題目要達到 optimized solution 的一些步驟會需要練過一些 easy 或 medium 的題目的解法才會知道怎麼寫 遇到困難一點的題目就會讓人害怕不想繼續解 相反地,遇到連續好幾題太簡單的題目也會讓人失去興趣 後來我就開始搜尋網路上有沒有人推薦 LeetCode 要寫哪些題目,於是就找到了幾個不錯的資源: LeetCode 本身自己的 Study Plan ,像是 LeetCode 75, Data Structure, Algorithm, Dynamic Programming, Programming Skills, Graph Theory 免費版的其實我都解過一輪了,但有的題目沒有官方解答,就只能去挖討論版的解答 NeetCode 150/Blind 75 ,reddit r/LeetCode 滿推的清單,也有按照 pattern 分類,可以重複練習不熟的 pattern LeetCode Patterns ,除了列出 patterns 以外還有問過題目的公司清單,題目都滿經典的,就算是 easy problem 也其實都值得讓人思考各式各樣不同的寫法 以上清單的題目其實都高度重複,我在面試前會專注去練這家公司愛考的 pattern (像是 Google HR 就說 DP & Graph 題目可以多練)。 錯誤 2: 太在意語法和 Clean Code LeetCode 的 solution 以及討論區的解答其實可以分成兩大類: competitive programming 與 clean code。但其實我覺得自己需要走哪個風格要看你寫 LeetC

[試算表] 追蹤台股 Google Spreadsheet (未實現損益/已實現損益)

圖片
在 Dcard 上發了一篇文結果引起超多網友回應想要看試算表,我就來整理一下我追蹤台股用的 Google 試算表給大家。 這個試算表我目標是以 "簡單" 為主,底下我也會講解公式的運作原理,希望大家能以此試算表輕鬆擴充自己想要的功能。 功能 未實現損益 (Unrealized Gain/Loss 表) 不管同一支股票是不是有部分已經賣出,只要你還持有未賣出的股票這邊都看的到。 已實現損益 (Realized Profit/Loss 表) 我過去的績效如何? 在這個表一目了然。 未實現損益: 詳細資料 (Unrealized Stats 表) 我還持有多少股? 每股市值多少? 每股的成本是多少? 在這個表可以快速追蹤。 手機友善 (Mobile Friendly) 我為了在手機上也可以快速看我想看的資訊,把 "Unrealized Gain/Loss" 做成比較窄的版型。 只要下載 Google Sheets app 打開試算表就可以了。 Google Spreadsheet 連結 Google Drive 連結 Stock Tracking 使用方式 請先點 "檔案" -> "建立副本",copy 一份試算表到你自己的 Google Drive 將 "Current Price" 表單中填上你想要追蹤的股票代號和名稱 將 "Transactions" 表單中刪除範例資料,但請務必留下第 2 列 (因為有公式),然後慢慢往下填入你的資料 Step 1: 檔案 -> 建立副本 Step 2: 新增/刪除股票代號和名稱 (紅框圈起處),灰色底欄位代表有公式 Step 3: 在 "Transactions" 表填入資料到白色底欄位 (紅框圈起處),灰色底欄位代表要讓公式自動計算 未實現損益的正確算法 其實在發 Dcard 文之前我自己也像 另外一個表單 犯了同樣的錯誤,就是只有在股票全部賣光光 (持有 0 股) 後計算的未實現損益才會正確。還沒全部賣光怎麼辦? 難道就不顯示了嗎? 飲料的例子 只要股票中途賣出一部分,目前還持有部分股票的話,感覺計算就突然變得很複雜。但不用怕,我們來用飲料當作股票舉個超簡單的例子 (1 杯=1

[Qt] PySide 如何 debug 沒有 stack trace 的 Segmentation Fault

圖片
雖然 PySide 是 open source 也很好用,但如果我們用 PySide 寫了一些有 bug 的程式,GUI 在做了某個操作後就會無預警 crash 消失不見,只留下哀傷的一行訊息在 console 上: Segmentation fault 現在是要怎麼 debug?  最近我就想用 QTableView + QAbstractItemModel 做一個可以動態新增資料的 table,但是以下的程式碼跑起來就會遇到 segmentation fault (完整的程式碼在文章最下面): from typing import Any, List import sys from PySide2 import QtCore, QtWidgets class DataModel(QtCore.QAbstractItemModel): ... class MainDialog(QtWidgets.QDialog): ... if __name__ == "__main__": ... 看了一下我也不知道問題在哪,我也不太曉得 QAbstractItemModel 哪幾個 functions 是一定要 override 的,現在該怎辦? 解法1: 暫時切換成 PyQt 當我們把一開始的 import 全部換成: from PyQt5 import QtCore, QtWidgets 再跑一次程式,這時候 GUI 不僅不會 crash,console 上還會多一行完整的訊息: NotImplementedError: QAbstractItemModel.index() is abstract and must be overridden Oh 原來我忘記要 override "index" function 了。 解法2: 用 gdb 來 debug 如果遇到提示還不夠明顯的狀況,我們可以用 gdb 來 debug。 等等! gdb 不是給 C++ 用的嗎? 和 Python 有什麼關係? 原來 PySide (Qt for Python) 只是像是用 Python 的殼把 Qt C++ 的程式碼包起來,詳細的運作原理可以參考  Qt for Python/Shibok

[技巧] 同硬碟不同OS動態切換 Rustup/Cargo 路徑

問題 Linux 上不管切換到 x86 還是 Arm 工作上都是用同一個 mount 到的路徑,所以 $HOME 其實資料都一樣。 但如果我在 x86 上安裝 Rustup 和 Cargo 到預設的路徑 ~/.rustup 和 ~/.cargo,假設我安裝了 exa ,切換到 Arm 上後就會跳出下面這樣的錯誤訊息: -bash: /xxx/.cargo/bin/exa: cannot execute binary file 原因 因為 Cargo 的 packages 當初是在 x86 上編譯的,當然就沒辦法在 Arm 平台上執行。 解決方式 第一個直覺想法就是,有沒有辦法在 x86 與 Arm 上都安裝同一個 package,只是安裝在不同路徑。查了一下網路就看到如何 客製化 Rustup/Cargo 安裝在自訂的路徑 : Rustup: 執行 rustup-init 前設定 RUSTUP_HOME Cargo: 執行 rustup-init 前設定 CARGO_HOME 利用這樣的環境變數,我們就可以寫一些 Bash scripts 來達到多個 OS 上的安裝和動態切換。 Bash Script: 安裝 Rustup 在不同的 OS 上 例如我們在 x86 上安裝就可以這樣寫: #!/bin/bash export RUSTUP_HOME="$HOME/x86_64/rustup" export CARGO_HOME="$HOME/x86_64/cargo" cd "$RUSTUP_HOME" # Download rustup script curl https://sh.rustup.rs -sSf >rustup.sh # Install rustup bash rustup.sh -y --no-modify-path 在 Arm 上安裝就換一下 RUSTUP_HOME 和 CARGO_HOME 路徑就好: #!/bin/bash export RUSTUP_HOME="$HOME/arm64/rustup" export CARGO_HOME="$HOME/arm64/cargo" cd "$RUSTUP_H

[技巧] 只看就好! 瀏覽被IT封鎖的網頁,不安裝任何軟體

圖片
公司為了怕檔案外洩或上班偷懶難免會封鎖一些特定的網站,但有時候做研究或查資料卻也被擋下來就會頗無奈的。 但其實如果我們只想 "看一下" 被封鎖的網頁,不需要與網頁互動的話,其實有幾種繞過 IT 封鎖的簡單方式。不需要亂裝什麼軟體,也不用 Proxy/VPN,為什麼呢? 因為 Proxy/VPN/隨身碟在我們公司擋得非常徹底,想裝軟體也不是那麼容易,不然就是很容易被發現。 方法 1: 利用 Google Cached 公司把 LINE 相關的網頁和軟體全部封鎖了,可是我想看一下最新的貼圖有哪些? 我只想看一下就好的話可以利用 Google Cached (頁庫存檔): 網頁搜尋結果右上角三角形箭頭點一下,再點 "頁庫存檔": 英文版不太一樣 英文版的話步驟稍微多一點,Google 網頁搜尋結果右上角通常會有三個點的圖示: 點下去之後會額外跳出一個關於這個頁面的資訊,下面有個 Cached 按鈕: 再點下去就可以看被 cached 的網頁: 雖然被 cached 的網頁也不代表最新的就是了,但至少我可以看一下。 方法 2: 利用 Google Translate 公司把 Google Drive 相關的網頁都封鎖了,所以 Google 文件和表單是最容易看不見的。但很常一些活動消息會放在 Google Drive 上就會看不見很麻煩,例如說彰化縣衛生局的  COVID-19疫苗接種合約院所 網頁裡面從公司電腦看,就會發現名冊和名單全部都被封鎖看不到。 這時候就可以把網址貼到 Google 翻譯中: 翻譯成什麼語言不重要,接著點一下右邊的連結進到翻譯過的網頁: 再點右上角翻譯的語言改回 Original 原本的語言,不然就算你選翻譯成繁體中文他也會經過翻譯變得怪怪的。(另外 Google Docs 會以為網頁故障跳出一些 error overlay,我這邊就用 DevTools 把他強制移除。) 雖然翻譯的網頁常常格式會跑掉,但只少我們可以看的到重要資訊了。 方法 3: 利用 Wayback Machine 網站時光機 ( Wayback Machine ) 是類似方法 1 的方式,也是把想要看的網址貼進去: 底下會有 calendar 提供不同時間的網頁快照 (snapshot),或是直接點最新的日期像是上面圖片中的 "

[Side Project] 用 PySide2 (Qt Python) 實作 Prototype Pattern 與樂譜編輯器

圖片
最近讀書會剛好要報 Prototype Pattern,看了一下  Design Patterns: Elements of Reusable Object-Oriented Software 的 prototype 這章節。書中一開始動機說明一個五線譜的 GUI 編輯器,後面 sample code 卻是用像是 toy example 的迷宮,這樣真的兜不攏也看不太懂。 網路上找了一下也沒有人為了 prototype pattern 做五線譜的範例,剛好最近工作上會碰到 PySide2 ,於是我想想,乾脆來把五線譜的範例做出來順便練習一下 Qt 的 QGraphicsView 要怎麼使用,也順便展示 prototype pattern 的優缺點。 Side Project on  GitHub 簡單的樂譜編輯器 GUI Users 可以從左邊拖曳樂譜上的符號到右邊的畫板上,畫板 (canvas) 上的符號也可以事後再進行拖曳、旋轉。 就算簡單也該有的功能 為了讓範例簡單,我就只做了書中提到的 half note 和 whole note,不要加進一大堆其他符號來讓整個 example 複雜化。但相對地我們也不能弄得太簡單太像 toy example 看了沒感覺。 我就多做了幾個比較像 real project 的功能: 拖曳的符號會像是磁鐵一樣 snap to lines/spaces 到最近的五線譜線上或空格(間) 內 拖曳符號時我把預設有的圖示 (indicator) 隱藏,拖曳中 (dragging) 也看的到放開 (drop) 後的樣子 我限制拖曳的符號只能在畫板 (canvas) 中移動,不給使用者拖曳到不見或卡在邊邊一半 Prototype Pattern 優點 1: 可以 Reuse Framework 不用 prototype pattern 我們會怎麼做創 object 的 framework? 我們可能就會創出一大堆平行化的 GraphicTool ( 橘色 的部分) 用來造代表樂譜符號的 Graphic: 書中說 framework 不應該知道 application 任何細節才對,萬一今天 application 改成做遊戲地圖編輯器呢? 難道要創更多 GraphicTool? 那可能我們會先發瘋。 所以 prototype patter

此網誌的熱門文章

[試算表] 追蹤台股 Google Spreadsheet (未實現損益/已實現損益)

[Side Project] 互動式教學神經網路反向傳播 Interactive Computational Graph

[插件] 在 Chrome 網頁做區分大小寫的搜尋