Skip to main content

22 posts tagged with "科技"

View All Tags

該上 K8s 嗎?

· 4 min read

我從大概一年半前就開始有在自架服務,架著架著服務就開始多了起來,這裡指的多不是兩個三個,而是十幾個以上。主要的原因是一個服務常常會需要再架一個 DB 或者 Redis。

到了我使用 docker compose 來管理的末期,已經有超過六百行的 yaml 檔用來管理我的所有服務。而後來我去成大研習的時候剛好聽到了 Kubernetes(K8s),所以我就把我所有的服務都改用 K8s 架設。

可能有些人會覺得有點殺雞焉用牛刀了,要這麼說也沒錯,其實用 docker compose 確實可以管理我那堆服務,但問題不方便啊!用上 K8s 之後管理服務變成管理數個 yaml 檔。

k8s yaml 檔資料夾截圖

而且我自己還有加上 Git 來追蹤,一切變得簡單好處理。

接著有另個問題是在轉換的初期會遇到,不管是從 Docker 或者是 Native 轉換到 K8s 一定都會遇到的就是找不到 YAML 檔的問題,像我搞最久的 Ente Photo 就沒有給 K8s 用的 Yaml 檔。

像上面那個服務,如果不熟 K8s 真的會卡很久,但好消息是,只要熟悉了之後,轉換就會非常快。像我所有的 YAML 都是從 docker compose 裡面轉出來的。

如果有讀者遇到轉換上真的有問題,也歡迎和我討論!

我自己安裝的是 K8s 的另一個變體 K3s。兩者的差別在於 K3s 所用的資源少非常多,但也有一些功能被拔掉。不過我自己沒有因為功能缺失,導致架不起來的狀況,推測應該是給更專業的用途用的。

而且裝好了之後我推薦一個管理介面叫 Lens

Lens 實際上的執行畫面截圖

有了這個可以介面,可以非常直觀地看到目前所有服務的運行狀態。當然,不是說有了這個就不用學 K8s 的概念,而是在學會之後這個可以做為輔助工具。

最後,來分享一下我學習 K8s 的過程,我自己覺得在學會 K8s 之前一定一定要先學會 Docker,不然很多東西可以轉換上會卡住。我當初學習的時候是看著 Kubernetes 30天學習筆記學會的,大概從頭看到尾加上實作就能學會了,真的不難。

希望大家有一天都能用上 K8s!

行列高手

· 3 min read

今年的八月我幾乎都在玩 Cloudflare Worker,而這個暑假做的最後一個專案昨天終於完成啦!

網站連結

行列高手是用來練習行列輸入法的工具,我參考了嘸蝦米官方的練習工具,裡面有一個部分是專門用來練習簡碼用的,因此我就把這套訓練方式搬到了行列來。

目前這個應用提供兩種訓練,分別是簡碼練習和文章練習。簡碼練習的主要目的是在初學簡碼的時候先把一二級簡碼背起來,以前一直沒有一個方便的工具,而現在有了這套就能做到有系統性的練習。

可以精準的選擇要練習的簡碼,一個一個練習完再分組練習。

行列高手簡碼練習畫面截圖

學習完簡碼之後,就需要實際投入實戰,這也是文章練習功能就是為此而生。在這裡可以選擇要啟用哪些簡碼,啟用後如果輸入的不是簡碼就會輸入失敗,達到一定的次數後會提示簡碼,這樣才能有效率地學習。

行列高手文章練習畫面截圖 行列高手文章練習畫面截圖

目前這兩個是我覺得最重要的練習功能,未來如果有更多的練習方式我也會加入到應用裡面。

如果有任何的問題都可以使用電子郵件聯絡我,或是在網站的 GitHub 內發 Issue 也行。

Adblocker 長這樣嗎

· 2 min read

如果是像我一樣堅持不買 Youtube Premium 的人,應該都吃過下面這種東西。

adblocker 通知

簡單來說就是不想要讓你繼續用免費的工具來擋廣告,要你花錢買他們的方案。但我最近發現到這個東西不只會在你把廣告擋掉的時候跳出來,而且還會在你使用 DF YouTube 的時候跳出來咬你。

這個工具簡單來說就是把一般我們在旁邊看到的這種推薦影片關掉,以防止演算法讓我們想要一直看下去。

推薦影片截圖

但問題是這裡本來就不是廣告的地方,我真的不懂為什麼我把這些地方關掉會吃上面那個通知,所以是一定要讓人看推薦影片的意思?

如果有跟我相同需求的朋友可以試試 Improve YouTube 這個插件有很多功能可以使用,其中我最喜歡的 Cinema Mode 這個功能,下面是啟動前的樣子。

充滿推薦影片還有留言的 Youtube 截圖

啟動之後可以發現下面就非常的乾淨,沒有留言或推薦影片等等,超級開心。

非常乾淨的 Youtube 截圖

其實這些功能在 FreeTube 也都能做到,但現在 Youtube 不知道用了什麼方法,讓 FreeTube 無法正常運作,確實有點可惜,所以我才會找來這些替代的插件。

追蹤碼請去掉

· 2 min read

今天來分享一個我個人很在意的小細節,這個小細節就是追蹤碼。你可能從來都沒有發現到這個東西,但現在可以說是無處不在了,這個東西會出現在你分享網址的時候,像下面這個是我朋友分享給我的 Thread 貼文。

thread 分享連結截圖

可以發現到後面有一段 xmt=,而後面接的就是追蹤碼。這個東西的目的就是用來追蹤是誰點了這個連結,以此來做為廣告推送,仔細可以看這篇

而最近我就發現到很多 IG 導到外部的連結都會有一堆追蹤碼,像下面這個就是一個例子。

超長追蹤碼範例

我不是特別針對這個人,只是剛好拿來做為範例。只是我自己覺得這樣被動收集資料不太好,而且也不是所有的人都想要被這樣追蹤。

下面還有一個我們學校的樂團也是有相同的問題,他們的音樂真的很厲害,但一直看到追蹤碼真的小扣分。

Youtube 追蹤碼範例

TeamViewer 真的過時了

· 3 min read

TeamViewer 對兩千年初就有在用電腦的人應該不會陌生,它就是一個遠端桌面軟體。小時候我第一個玩的軟體就是這個,當時我覺得可以人不用坐在電腦前面就能控制很神奇,所以我就一直玩這個。

但現在都二零二五年了,早就有很多遠端桌面軟體可以用,像我自己最喜歡的 RustDesk 就是,這個是開源的而且也不用一堆繁瑣註冊。還有像 Sunshine 這個專門設計來玩遊戲的遠端桌面延遲也低很多。

說實在的我真的想不出還有什麼理由用這個,我目前能想到的是某些套裝機有內建,不用再特別安裝吧,但問題是像 RustDesk 也都有免安裝版的了。就連另一個很知名的遠端軟體 AnyDesk 雖然說是閉源的,但人家也不用在那邊註冊啊。

下面是我要幫我朋友修個小問題的時候遇到的狀況,直接先卡在一個登入帳號加兩步驟驗證。我真的不懂,明明我要幫的人是我朋友,為什麼要驗證我是誰。

發送 Email 通知截圖 Email 內容截圖 確認新增信任設備截圖

這真的已經不是資安問題了,因為我要連的不是我自己帳號下的電腦,而是我朋友的啊,驗證這個到底有什麼用?

這邊分享一個專有軟體必變爛理論,說的就是這種專有軟體最後一定都會變得越來越爛,這就是一個最好的例子。

小小專案之日記系統

· 7 min read

我自己已經寫日記寫了四年了,再過幾天就是我自己所謂的日記日,也就是八月二十九日,我就是從這天開始寫的,一路寫到今天。

而這個暑假我想要來解決一個困惱我很久的問題,在最一開始的時候我是用 OneNote 寫的,那個時候我還在用 Windows 10,而後來有一陣子我是直接寫在 txt 檔案上。寫著寫著又覺得好像沒那麼方便,所以我就又換到「溫度日記」,我還因為幫他們回報了一個漏洞,所以有拿到一年的 VIP,但用到一年快要結束之後我就走了,因為日記的內容我覺得放在別人的伺服器讓我有點不放心就是了。

接下來就我又回到 txt 寫了好長一段時間,而我自己其實一直想要寫一套自己的日記系統,但是因為要有前後端等等我的電腦又不可能開一整天。一直到了這個暑假我決定好好的來處理一下,又很剛好的我學到了 Cloudflare R2,一切都是這麼的剛好我就想要學 Worker,我就發現到這個真的很適合用來當做練習的專案,所以就有了「龍的日記」。

Worker 好欸

一開始我就打算用 React 去做,因為這個做起來比香草 JS 爽太多了,所以我就用 Nextjs 寫完了大概的畫面,用完之後我就發現到 Nextjs 可以直接上 Worker,我當然就直接上了。

後端的部分我就沒有什麼比較特別的點,因為就是一個很單純的 Worker,但這部分我花了最多的時間在上面。

KV、D1、R2

單有 R2 其實是不夠的,當然一開始我是只有 R2 而已,但是因為我想要多一個功能就是「收藏」,所以我就開始想方法處理。我最一開始的方法是用 KV 來存所有的日記欄位,但這樣我一試就發現到完全不行,因為效能真的太爛了,而且我當晚就直接把所有的 KV 額度都用完了。

KV 用完的警告圖

不用 KV 也就來用 D1 吧,我其實本來不想要用 D1 是因為我覺得 KV 感覺起來比較簡單,沒有想到完全不行。結果 D1 因為我真的不熟 wrangler 要怎麼操作,所以就一直卡在一開始的建表,所以我就又換回 KV 用了一段時間,換回到 KV 之後我就開始狂加優化,到這裡看起來沒有什麼問題了,結果又吃了一個 list 額度用完。

無限滾動,無限優化

這周我花了整整四天在處理無限滾動這個功能,前端的部分到也好處理,我從學習到實際應用也花了我一小時而已,但接下來我就發現到速度真的很慢,我自己在測試環境感覺不出來,一到生產環境直接死掉。

接著就是開始優化,但是因為當初用 KV 卡的有點死,我花了很多時間處理也沒有用好,主要是那個 list 操作真的有點太慢了,所以我就又換回到 D1 了。

回到 D1 之後我又是瘋狂的優化,在我在外面都在想要怎麼優化才會快,最後才有了下面的成品。

用起來已經很順了,當然後端還是有東西可以優化,但是目前這樣已經很夠我用了,做完真的超級開心,因為這個就是專屬於我的東西!

好的架構上天堂

仔細看會發現到我 KV 跟 D1 這樣切來切去,我不就改 code 改到死。一切正好相反,因為後端我早早就把核心的部分跟 utils 切開,所以改的時候沒花什麼時間,我測試也有寫滿所以有 BUG 也能馬上處理。

這裡真的要推一下 Clean CodeClean Architecture 這兩本書,我自己覺得沒有看完這兩本我大概做到一半就放棄了。

當然這篇不是要來講這兩本書在說什麼,只是要推薦一下每個有在做專案的人都一定要看!

小結

這個暑假我本來是打算做到三個小專案,但是沒有想到這個就花了這麼多時間了,前前後後花了我十一天,真的滿久的就是了。主要是卡在優化那邊,我自己覺得有這個經驗之後做其它的東西應該會快很多。

接下來就是好好休息了,開學之後要開始大戰資安了。

是圖床欸

· 2 min read

圖床這個東西大家應該都有用過,最有名的就是 imgur,但因為我一直覺得把圖片放在上面有點不太好,而且聽說最近有時候也會不能用。我自己有看了伊果的這篇,但因為裡面是使用指令工具來上傳,這來用起來就有點不爽的感覺。

昨天半夜我就突然毛起來寫一個圖床,我當然知道網路上有很多人做好的,但是因為我想要跟 R2 深度集成,所以我就用 Nextjs 寫了一個放在 Worker,這樣使用起來也更流暢。整個做完大概兩個半小時,有點久就是了,主要卡在 Presigned Url 那裡。

UI 的話我用 Bootstrap 套一套而已,自己用的看的順眼最重要。

UI

之前的圖片我是開一個 bucket 再用 AList 去掛,上傳前我還會特別分資料夾這樣,但是因為我後來真的覺得有點麻煩,但是直接丟檔案又不重新命名好像又不太好,因為這樣沒什麼規律看起來很亂。

所以我就把之前的所有圖片都上到圖床,這樣就很乾淨了。搬的時候真的很順手,我覺得 UX 設計的也不差。

Cloudflare 能玩的真的很多,這個算是我想做很久了,但一直沒有時間做或者說懶的做。現在有了這個終於讓圖片有一個比較好的家了。

一次奇怪的 Ente Photo 自架 BUG

· 4 min read

Ente Photo 已經成為我的主力相簿軟體兩個月了,用起來比什麼 Immich 或是 PhotoPrism 什麼的都要好,但就在昨天的時候因為我在優化我寫的 deployment 檔,順便把一些 pod 轉成 deployment,結果轉完之後我就發現到為什麼 Ente 開不起來了?

我的 pod 一直卡在 ContainerCreating,通常第一個想到的就是用 kubectl describe pod 這條指令來看一下,結果我看到就是一切正常,成功的把 image 給 pull 下來,而且也沒有寫什麼問題。

到這了這裡我就去問了一下 Google 大神和 GenAI,兩邊給我的答案都差不多,像是什麼 PVC 掛載失敗、網路無法連接等等,但老實說這些我一看到就直接跳過了,因為我知道不可能是這些。我之前也有發生過這種錯誤,通常在第一步的時候用指令一看就會很明顯的看到了。

最後我想到的一個方法就是我把 deployment 裡面的 containers 一個一個拿掉,看看到底是哪裡卡住,這個方法也確實生效了。最後我發現到 minio 壞掉,好消息是發現了什麼壞掉,壞消息是我不知道怎麼處理。我進一步研究,發現是 minio 的 lifecycle 有問題。

lifecycle:
postStart:
exec:
command:
- sh
- -c
- |
#!/bin/sh
while ! mc config host add h0 http://localhost:3200 $(MINIO_ROOT_USER) $(MINIO_ROOT_PASSWORD) 2>/dev/null
do
echo "Waiting for minio..."
sleep 0.5
done
cd /data
mc mb -p b2-eu-cen

但到了這裡還不夠,我再次使用相同的方法,就是一點一點的刪,看哪裡可行就知道哪裡有問題,最後找到這段:

while ! mc config host add h0 http://localhost:3200 $(MINIO_ROOT_USER) $(MINIO_ROOT_PASSWORD) 2>/dev/null

等等,為什麼一個迴圈會突然壞掉?這個問題讓我想了很久,因為 Ente 也用了兩個月了,而且更氣人的是我發現到只要使用 systemctl restart k3s.service 把 k3s 整個重啟,一切就像什麼事都沒發生一樣,所有的 log 一切都正常。

接下來我就仔細的想了一下,我想到會不會是 minio 有更新?因為我在一次又一次的檢查我的 deployment.yml 檔的時候,我發現到我的 minio 沒有固定版本。如果有固定版本會像下面這樣:

有固定版本的 minio 範例

可以發現到有一段 RELEASE...30Z,那個就是固定版本,而之前是沒有的,因此我就去 docker hub 看看,果然是昨天有新的版本。

新版本的 docker hub image

因為預設 k8s 會自動發現有沒有新版的,如果有就把目前的版本更新上去,結果一更就壞掉了。

因為此我就把版本換回到一個月前的,之後就好了。

舊版本的 docker hub image

這樣的問題我居然卡了快十個小時,沒想到原因這麼簡單,算是學到了一課。

大戰系統程式 - 控制段組譯與連結載入

· 9 min read

前面我們講了基本的組譯流程,而這篇主要要講的是怎麼樣合併兩個程式,因為通常我們寫完的程式碼不會只有一份檔案,而是會有數份。

這裡的細節爆炸多,所以一定要仔細看。第一步的組譯過程和之前一樣,我會把不一樣的地方寫出來,其它相同的地方不會再重複。

下方的內容如果有錯誤,歡迎來信更正!

組譯

下方的題目取自席家年教授的練習題,如有侵權請來信告知!

題目 PDF 下載

下方為練習卷 練習卷

可以發現到有兩份程式碼需要組譯,而且兩份程式碼裡面都出現了之前沒有出現的字。第一個步驟就是先把位址寫一寫,這裡位址和之前一樣。

第一份程式:

地址標記符號指令運算元
0000TSTPGMSTART0
EXTDEFREF4
EXTREFNXTREF
...
0029REF1LDX#ENDA-TSTA
002CREF2LDATSTA,X
002FREF3+LDSNXTREF-24
0033REF4EQU*
...
0050TSTAEDU*
...
0084ENDAEDU*
0084REF5WORDTSTA+8
0087RESB12
0093ENDREF1

上面這張表格跟之前的其實沒有什麼差別,但可以發現到有兩個比較特別的是 EXTDEF 和 EXTREF,這兩個就是外部引用的程式。

還有一個東西是 EDU,後面的運算元是一個 *,而這個我們就當成保留,不佔用空間。

第二份程式碼發現到地址幫我們上好,但我一樣寫在下面。

地址標記符號指令運算元
0000NXTPGMSTART0
EXTDEFNXTREF
...
0052NXTREFLDANXTREF+20
0055NXT1LDB#NXTREF
...
0090NXT2WORDNXT2-6
0093RESW5
00A2END

接下來就是把目地的碼算出來,過程跟之前都一樣。

第一份程式碼:

地址標記符號指令運算元目地碼
0000TSTPGMSTART0
EXTDEFREF4
EXTREFNXTREF
...
0029REF1LDX#ENDA-TSTA050034
002CREF2LDATSTA,X03A021
002FREF3+LDSNXTREF-246F1FFFF8
0033REF4EQU*
...
0050TSTAEDU*
...
0084ENDAEDU*
0084REF5WORDTSTA+8000058
0087RESB12
0093ENDREF1

第二份程式碼:

地址標記符號指令運算元目地碼
0000NXTPGMSTART0
EXTDEFNXTREF
...
0052NXTREFLDANXTREF+20032011
0055NXT1LDB#NXTREF692FFA
...
0090NXT2WORDNXT2-600008A
0093RESW5
00A2END

目的程式

跟之前一樣會有兩份目的程式,但這裡跟之前不太一樣,差別在於有 EXTREF 和 EXTDEF,這兩個都會生成比較特別的紀錄。

第一份

先從第一份程式碼開始,一樣的先從表頭紀錄開始

H,TSTPGM,000000,000093

接下來我們會有兩種新的紀錄,分別是 D 紀錄和 R 紀錄,D 紀錄在代表的是自己給別人用的程式,而 R 紀錄正好相反,代表的是自己使用別人的程式。

先寫 D 紀錄,要依序寫入的資訊如下:

  • 開頭字母 D
  • 六格的標紀符號,對應到 EXTDEF 後面所寫的標紀錄號
  • 六格的標紀符號所在位址

D,REF4☐☐,000033

再來寫 R 紀錄,和 D 紀錄相同,要依序寫入的資訊如下:

  • 開頭字母 R
  • 六格的標紀符號,對應到 EXTREF 後面所寫的標紀符號

R,NXTREF

接下來的本文紀錄和之前相同,下面不再重複。

T,000029,0A,050034,03A021,6F1FFFE8

T,000084,03,000058

再來是修正紀錄基本上和之前一樣,但是有一個紀錄不太一樣。

注意到標紀位址在 REF3 那一行,可以發現到計算的時候使用到了 NXTREF 這個標紀符號,仔細看就會發現到這個使用到了 EXTREF 所標紀的符號,所以修正紀錄也要基於 NXTREF,而不是 START 的 TSTPGM,換句話說就是這裡是基於外部的程式。

M,000030,05,+NXTREF

還有一行需要修正的是 REF5,這行的話沒有什麼特別的,修正紀錄如下:

M,000084,06,+TSTPGM

最後的結束紀錄和之前一樣,沒什麼特別的

E,000029

第二份

表頭紀錄如下:

H,NXTPGM,000000,0000A2

D 紀錄如下:

D,NXTREF,000052

本文紀錄如下:

T,000052,06,032011,692FFA

T,000090,03,00008A

修正紀錄一個,如下:

M,000090,06,+NXTPGM

結束紀錄就一個 E

連結載入

接下來就是要模擬在電腦中實際載入兩份程式碼之後會發生的事,假設載入的起始位址的 5000。

而外部符號表要處理的地方比較多,控制段其實就是程式的外稱,像 TSTPGM 指的就是第一份程式碼。符號名稱就是 EXTDEF 後面寫的標紀符號,位址的話就是 START 的位址跟 END 的位址,長度就是兩者相減。

第二份程式碼跟第一份的步驟相同,但是位址要接在第一份之後。

控制段符號名稱位址長度
TSTPGMREF45000~509393
NXTPGMNXTREF5093~50E5A8

實際上執行的時候修正紀錄就會發揮作用,下面舉幾個例子,也就是練習卷的題目。

REF3 +LDS NXTREF-24 載入到記憶體的位址為 502F,修正後的目的碼為 6F1050CD

目的碼的算法就是看修正紀錄怎麼寫就怎麼做,像這題的修正紀錄是 M,000030,05,+NXTREF,所以我們要做的就是把 1FFFF8 拿出來加上 NXTREF,而 NXTREF 的值為 50E5,可以對應到剛剛的外部符號表。

REF5 WORD TST+8 載入到記憶體的位址為 5084,修正後的目的碼為 005058

NXT1 LDB #NXTREF 載入到記憶體的位址為 50E8

而最後,程式開始的地方就是第一條本文記錄開始的地方,需要注意一下要再加上初始地址,得到 5029

網頁版應用程式

· 2 min read

昨天因為我在玩 Hail 的時候不小心把手機玩到壞掉,所以我就直接重置了整個系統,重置完之後我就在想有哪些應用程式要再下載的。

這個時候我就又突然想到這篇,大意就是 Meta 的應用程式會使用一些特殊的手段來追蹤在網頁上的瀏覽紀錄等,而防止的方法就是有其中一個就是使用網頁版應用程式。

網頁版應用程式聽起來好像很高級,但其實就是在手機上直接去開 Facebook 這個網頁,那這樣就是一個網頁版應用程式。我發現到這種方法其實好處不少欸,因為之前我從抓包就發現到 FB 會一直偷傳封包還有 IG 也是,這樣一來只要網頁關掉就完全沒有問題了。

功能上面也不再像是五年前會發現有些東西不能用的問題,一切都是那麼的正常,唯一的缺點是開的時候要等一下,因為它就不再像是 APP 一樣一直接常駐在後台,而是要用的時候再跟伺服器握手拿資料,我自己是比較喜歡這樣啦,光想到我的資料一直被傳出去就覺得很不安。

而且像我自己在用的 Firefox 還會做出這種美美的圖標,不管是使用上或者美觀上都很有 APP 的感覺。