比部落格廢一點,但是又比推特認真一點
還有一些我懶得確認的想法
還有一些我懶得確認的想法
第二個做法可以改成定義一個死板的 Tree,提供各種操作,每個操作就會附贈一個通知 Update 的副作用,缺點很明顯,做不到定義以外的操作,而且樹的形狀能多複雜取決於預先定義的 Tree
另一個想法是把 Tree 變成 immutable,這樣就可以有每個動作存一個 snapshot,然後再讓 Update 自己想辦法渲染,但是因為現在的 Tree 用到了指標,要想辦法解決指標問題
而且可預期的,這個方式記憶體需求會大一點
另一個想法是把 Tree 變成 immutable,這樣就可以有每個動作存一個 snapshot,然後再讓 Update 自己想辦法渲染,但是因為現在的 Tree 用到了指標,要想辦法解決指標問題
而且可預期的,這個方式記憶體需求會大一點
整個程式寫起來非常麻煩,要區分很多不同種類的動作、決定下一個動作等等,而且現在的架構是強制 tail calling,所以無法往下搜尋完後往上再 rebalance
要解決這個問題的話我有個想法,弄一個 PackedMsg,一次拆一層,回傳 Cmd 時可以塞不只一個進去,最外層的就是下次執行的 Cmd。但是這個寫起來也麻煩,不直覺
以上是比較符合 bubbletea 設計的做法,另一個解法是開一個 goroutine,每一個動作就往某個 channel 送出訊號,通知 update 可以畫了(這裡怎麼設計還得想想,可能是傳一整個樹的 snapshot 過去?),並且等待 Update 通知完成的訊號再進行下一步,這樣就類似 motion canvas 用 yeild 暫停函數的做法
如果 simbafs/tree 要支援動畫,樹應該要改成 immutable,然後 Tree.Op() 會回傳一個有 UpdateTreeCmd 的陣列,依序執行
每個 UpdateTreeCmd 代表一刻的狀態
但這樣就會大幅介入演算法的執行。例如 search 這個動作,就要每移動一次 current 就回傳一個 tree,那麼現在在執行什麼動作、各個指標指在哪裡都要存在 Tree 裡
Tree 新增欄位 jobs 和 map[string]pointers
jobs[0] 表示目前在幹嘛,例如 search node 10, 然後 pointers 包含一個指向 Node 的指標,還有顏色、標籤等等演算法無關的東西。收到 UpdateTreeCmd 之後會根據這兩個欄位和實際的 Tree 決定要幹嘛,例如把 curr 移到 curr.Left,然後把整棵樹回傳,進入下一個 UpdateTreeCmd
那麼剛剛 Op 回傳一個陣列的 UpdateTreeCmd 就要改成回傳第一步,後續步驟根據第一步執行結果而定
這樣好像比較符合 bubbletea 的設計
那麼 Tree 的設計就改成一個大大的 state machine,他的狀態分別是 tree, jobs, pointers
每個 UpdateTreeCmd 代表一刻的狀態
但這樣就會大幅介入演算法的執行。例如 search 這個動作,就要每移動一次 current 就回傳一個 tree,那麼現在在執行什麼動作、各個指標指在哪裡都要存在 Tree 裡
Tree 新增欄位 jobs 和 map[string]pointers
jobs[0] 表示目前在幹嘛,例如 search node 10, 然後 pointers 包含一個指向 Node 的指標,還有顏色、標籤等等演算法無關的東西。收到 UpdateTreeCmd 之後會根據這兩個欄位和實際的 Tree 決定要幹嘛,例如把 curr 移到 curr.Left,然後把整棵樹回傳,進入下一個 UpdateTreeCmd
那麼剛剛 Op 回傳一個陣列的 UpdateTreeCmd 就要改成回傳第一步,後續步驟根據第一步執行結果而定
這樣好像比較符合 bubbletea 的設計
那麼 Tree 的設計就改成一個大大的 state machine,他的狀態分別是 tree, jobs, pointers
關於臺灣隊 vs 中華隊這個話題
有官方身份的人說中華隊我是不介意,畢竟現在它就叫「中華隊」,之前公投也沒過,而有官方身份的人要遵守法律,說中華隊無可厚非
而我自己都一律寫臺灣隊,因為「中華台北」這東西怎麼看都是自降國格
有官方身份的人說中華隊我是不介意,畢竟現在它就叫「中華隊」,之前公投也沒過,而有官方身份的人要遵守法律,說中華隊無可厚非
而我自己都一律寫臺灣隊,因為「中華台北」這東西怎麼看都是自降國格
當 HTML 中的 a 標籤連到一個外部網站時,因為資安考量可以加上
另外,如果要在新分頁開啟,可以加上
https://dev.to/tlakomy/creating-a-safe-external-html-link-whats-the-deal-with-nofollow-noopener-norefferer--5a4i
rel="nofollow noopener noreferrer external"
另外,如果要在新分頁開啟,可以加上
target="_blank"
https://dev.to/tlakomy/creating-a-safe-external-html-link-whats-the-deal-with-nofollow-noopener-norefferer--5a4i
另一個夢是在考試,教室座位很少,而且幾乎沒位子,有人甚至在我旁邊的走道考試,幾乎都擋到我的視線了。發考卷的時候數量不夠,然後助教說字太小他馬上再去重印一份。不過我有拿到所以就先寫了,幸好我的考卷沒什麼問題。考卷內容都是簡答題之類的,不過可以翻書,但是要寫出他在課本哪一頁,有夠麻煩。我隔壁那個同學寫超快,我才一半他就寫完了。
考完試後就去搭車回家,然後就有上面的高鐵劇情
考完試後就去搭車回家,然後就有上面的高鐵劇情
正在讀 Golang 的 net/http 原始碼,發現 Golang 標準庫中常常看到一個寫法,例如
這個寫法看起來很多餘,問 ChatGPT 他說方便測試、提昇封裝性之類的理由,但是都沒有說服我。直到我看到了這段,在 roundtrip.go 中
RoundTrip 呼叫了 roundTrip,有趣的是這個檔案有個編譯器設定
這個只在非 wasm 環境使用,當編譯目標是 wasm 時,就會去另一個檔案 roundtrip_js.go 用另一個函式。
看到這裡我才知道,一個 public function 什麼都不做只呼叫一個 private function 的用意是編譯時可以用不同檔案,而且不破壞函數呼叫的形式。
func (c *Client) Do (req *Request) (Response, error) {
return c.do(req)
}
unc (c *Client) Do (req *Request) (Response, error) {
// do something here......
}
這個寫法看起來很多餘,問 ChatGPT 他說方便測試、提昇封裝性之類的理由,但是都沒有說服我。直到我看到了這段,在 roundtrip.go 中
func (t *Transport) RoundTrip(req *Request) (*Response, error) {
return t.roundTrip(req)
}
RoundTrip 呼叫了 roundTrip,有趣的是這個檔案有個編譯器設定
//go:build !js
這個只在非 wasm 環境使用,當編譯目標是 wasm 時,就會去另一個檔案 roundtrip_js.go 用另一個函式。
看到這裡我才知道,一個 public function 什麼都不做只呼叫一個 private function 的用意是編譯時可以用不同檔案,而且不破壞函數呼叫的形式。