用tag實作Password Mask

我其實滿驚訝目前好像沒有任何library有實作這個,或者有但是我找不到,所以我就實作了一個。別看這功能看起來很小巧簡單,這個需要對reflect有相當的認識,所以把製作心得記錄下來。

成品網址

https://github.com/Rayer/hood

需求

通常我們server boot up的時候需要印出很多log,有時候無可避免的要把整個config給印到log上,這樣會產生一個問題:要是config內含敏感資訊,如帳號跟密碼,這就會產生一些資安問題:

log.Infof("bootup with config : %+v", config)

印出來就會像這樣(標準的%+v會印出來的格式)

{Host:192.168.1.1 User:username Password:mypassword123}


顯然,這是不太恰當的,所以我們總歸來講有幾種作法

  1. 把他轉json再印,把敏感的地方用 json:"-"讓他不被印出來
  2. 實作 func String() string,把敏感資料手動by key抹除掉
Read more “用tag實作Password Mask”
Leave a comment

將服務遷移到Google Cloud Functions

最近開始把腦筋動到每個月要吃掉我20鎂的linode,看看能不能用Google Compute Platform來取代掉單純的VM。GCP本身有提供Free Tier, 所以只要小心地控制用量,搬遷應該是可以省下一筆,而且也可以玩玩GCP的一些新功能。

需求分析

我這次先搬遷之前寫的一個爬蟲服務,這個爬蟲服務應該是我現有服務裡面最簡單的一個,首先先分析一下他有什麼特性:

  • 需要定時被喚醒(設計上大概10分鐘一次就夠了)
  • 需要一個地方存放爬下來的分析資料
  • 不需要實體上的Database
  • 程式本體相當小
Read more “將服務遷移到Google Cloud Functions”
Leave a comment

沒原生Thread Pool,那我們自製Worker Group

可以先看看上一篇沒Thread Pool,Limiter也好?真的嗎? 來個前情提要。

Worker Group其實基本概念跟Thread Pool很像,就是:

  • 一堆Worker在跑,等著接收參數並且輸出結果
  • 單一Worker擁有一個用來輸入參數的channel,以及一個用以輸出結果的channel
  • Worker可被context的Done()終結,或者:
  • 可被WaitGroup終結

不過由於go沒有generic(目前版本是1.16,在1.17/1.18會支援),所以這兩個channel都沒辦法寫得很漂亮,這也是大多數Worker Pool要不就是得用chan interface{}來寫,不然就是寫不出來。不過Worker Group這種東西其實夠輕量,輕量到其實自己打造都是可以的,這邊就介紹一下怎麼自己打造一個Worker Pool,以及揭秘為什麼很多CLI/UI都需要有一個自己的UI Thread(go沒thread,所以稱為UI routine吧)。

Read more “沒原生Thread Pool,那我們自製Worker Group”
One Comment

沒Thread Pool,Limiter也好?真的嗎?

眾所皆知Go是沒有原生的Thread Pool這種東西,這在寫Crawler的時候會造成一些小小的不便。比方說你想要crawl PTT,這樣打一打大概2秒內DDoS protection就把你擋起來了:

docUrlList, _ := GetDocUrlList() //拿到某個版的文章列表
for _, docUrl := range docUrlList {
	go func() {
		docUrl := docUrl
		p, _ := ParseSingleRawDocument(docUrl)
		parseChannel <- p
	}()
}
Read more “沒Thread Pool,Limiter也好?真的嗎?”
2 Comments

把資料(包含本站)從崩潰的Linode VM救出來

大約在2021.05.26的時候,我架在Linode上的站做了一次升級從Ubuntu 17.10=>20.04,我本來打的如意算盤是,我既然每個月都有額外交五塊錢給linode做備份,那升級後要是有什麼問題,理論上從備份回復就沒事了吧!

我先直接講結論,他的確是有備份,但是…. mount不回去,乾,那我要你這備份幹嘛!

Read more “把資料(包含本站)從崩潰的Linode VM救出來”
Leave a comment

解決GoLand在M1 Mac上delve的問題

前陣子delve終於把m1 support給integrate到main branch了,不過由於一來他還沒tag release,二來GoLand並沒有讓你選擇外置delve的選項,所以只能用它內置壞掉的delve。

不過其實是可以使用外置delve的,也一併可以經由compile新的delve解決m1相容問題。這邊有提供一些解法,翻譯成中文大概就是這樣:

  1. 安裝arm64版本的go,最簡單的方法就是直接brew install golang.
  2. 確認安裝的是Apple Silicon版本的GoLand
  3. 抓下並且編譯delve main branch。具體的做法是 git clone https://github.com/go-delve/delve,然後進入delve目錄make install。他會把delve執行檔放到 ~/go/bin/dlv。
  4. 打開GoLand,選單選Help->Custom VM Options,增加一行 -Ddlv.path=/Users/<你的ID>/go/bin/dlv
  5. 重啟GoLand,恭喜,你的GoLand的debugger正常了。
One Comment

目前Macbook M1開發環境測試

這是一張列表,從今天(1/11)看我用到的開發工具的測試,看看能不能使用。

Jetbrains IDEs

可用,而且有特別的Apple Silicon版本。目前僅有AppCode(取代Xcode)沒有而已,其他主流開發的IDE應該都有了。

OpenJDK

目前無法從Homebrew安裝OpenJDK,AdoptOpenJDK似乎也還沒跟上(雖然x86版本似乎是可以用)。普通來講是建議從azul去取得arm64的OpenJDK來跑比較好。

其他版本可以參考Azul的官方公告

Go

從homebrew裝的沒啥問題,不過delve(go的debugger)目前沒有m1 build,會造成go無法debug。根據小道消息表示應該要等到二月delve才有辦法支援m1,不想等的人可以到這裡去取得arm branch自己編譯一個,也可以取代掉GoLand裡面的delve

Docker

需要使用Technical Preview 3.0.0才能正常使用,使用上沒什麼問題。

Homebrew

沒太大問題。有不少keg/bottle會出現ad-hoc signature sign fail(比方說你試圖安裝wget就可重現),不過似乎沒碰到太嚴重影響開發的套件問題就是。

C++/Clang

用起來沒啥問題,也不該有啥問題就是…

Xcode / CocoaPods

CocoaPods會無法安裝,這邊有workaround讓你的系統能裝起來CocoaPods,跑起來沒碰到啥問題。Xcode12就….不說了,IB出來一個樣,Application出來一個樣,這個版本在編譯傳統obj-c有相當嚴重的問題(可能跟M1無關),非常不建議使用。

Leave a comment

偵測Apple產品NCC發照情況的telegram channel

先不廢話,直接上網址 https://t.me/appletwspy

Source Code : https://github.com/Rayer/AppleTwNCCSpy

Apple的NCC發照並不代表立即會發售,但是也是一個指標:無論如何都要有NCC證號才會開賣。這個channel的bot會自動每五分鐘去爬蟲https://www.apple.com/tw/nccid/一次,裡面有東西變化(以Model為準)就會發出通知。

有興趣的去subscribe吧。

Leave a comment

如果你是Mac使用者,也許你會考慮徹底移除Google Chrome

Google Chrome installs something called Keystone on your computer, which nefariously hides itself from Activity Monitor and makes your whole computer slow even when Chrome isn’t running. Deleting Chrome and Keystone makes your computer way, way faster, all the time. 

chromeisbad.com

雖然Google拿掉Don’t be Evil這格言好一陣子了,不過老實講Evil這個詞本來就滿主觀的,顯然有些人對於Chrome的判斷Evil的標準比較不以為然。

今天Hacker Daily有提到一則關於Google Chrome的Keystone元件的問題 — 喔對,這搞掛過很多人的Mac,而且是兩次。Keystone主要的功能是協助Chrome(以及遠古時期2013年是協助Google Earth)更新以及維持到最佳版本,聽起來是個人畜無害的小可愛對吧?那為什麼會用到「甚至會讓系統掛掉」的方法來做自動更新呢?他們的自動更新有什麼特別的地方值得被拿出來討論呢?

Read more “如果你是Mac使用者,也許你會考慮徹底移除Google Chrome”
Leave a comment

RedHat宣告未來停止對CentOS的主流支援

今天的重磅新聞之一就是,RedHat將不再支援CentOS。CentOS 7的主流更新仍然會續命到2024年6月,然而CentOS 8卻倉促地被宣布支援僅到明年(2021)年底(哇靠那麼急?),而且裡所當然的也不會有CentOS 9了。這毫不意外地引起開發者一片罵聲

Red Hat建議CentOS 8的使用者遷移到CentOS Stream — 一個比較像是RHEL測試版本的發行版。但是,CentOS當時就是以穩定性著稱,常被比喻成是地球上最穩定的Linux,自然這種migration並不是被使用者所喜聞樂見。不過我比較好奇的是,類似定位的還有Fedora,而Fedora跟CentOS Stream共存也是一件滿奇怪的事情啊….(思考)。

也可以參考一下這篇的分析。另外,這個諷刺網站也滿有趣的,可以看一下 XD

Leave a comment